我有两个分支,2和4:
2c <- top of branch 2
|
2b
|
2a <- root branch 2
和
4c <- top of branch 4
|
4b
|
4a <- root branch 4
问题是:
分支 4 的根实际上源自分支 2 的顶部,但这是 在 git 之外完成的。
我想在 git 中反映这一点,通过链接这两个分支,以便我们可以轻松识别 2c 和 4a 之间的差异,并且也可以更容易地合并具有类似更改的其他第三个分支算法。
结果应该是这样的:
4c <- top of branch 4
|
4b
|
4a <- root branch 4
| <================================== new connection between the two branches
2c <- top of branch 2
|
2b
|
2a <- root branch 2
在阅读了大量有关变基和更改提交父级的内容之后,我使用了以下方法,这似乎不是最佳方法:
cd dev/project # work locally, within the repo top folder: project
git checkout 2
git checkout -b 4L # temporary branch to perform the link between the branches, based on the top of branch 2
git checkout 4
git checkout 4a # retrieve the root of branch 4 in the working directory before to copy it
cp -r . ../project-copy-4a # save the work directory for later use
git checkout -b 4L # return to temporary branch
rm -rf * # clean the working directory
cp -r ../project-copy-4a/* ./ # incorporate the 4a content to simulate the developer changes from status 2c
git rm . ; git add . # make sure to include the new files in git before commit
git commit -m "connect branches 2 and 4"
我现在的状态是:
4La (content equal to 4a)
|
2c <- top of branch 2
|
2b
|
2a <- root branch 2
为了连接分支,我现在将在分支 4L 上对分支 4 进行变基,其顶部内容等于分支 4 的根,因此不会更改任何分支 4 提交中的内容:
git checkout 4 # move to branch 4
git rebase 4L # rebase it on branch 2, through branch 4L
我现在有了目标状态(其中 4x' 可能是来自 rebase 的新提交哈希,但其内容等于 4x 的内容):
4c ' <- top of branch 4
|
4b'
|
(4a') <- root branch 4 (not sure git keeps this commit as it contains no changes)
|
4La
| <================================== new connection between the two branches
2c <- top of branch 2
|
2b
|
2a <- root branch 2
在纯 git 命令中实现此目的的更好程序是什么,而不诉诸像 cp -r 这样的文件系统命令,这些命令可能很繁重且有风险,例如由于文件系统树和 git 文件树之间的差异?
嫁接你的历史:
git replace --graft 4a 2c
然后git filter-branch
或
git filter-repo
使您的移植物永久化。这将重写您的提交并更改其提交哈希值;没有办法避免这一点。
git checkout 2c
id=$(git commit-tree -m 'commit message' -p 2c 4a^{tree})
id=$(git commit-tree -m 'commit message' -p "$id" 4b^{tree})
…
git merge --ff-only "$id"