我们的项目中有一个非常奇怪的git历史。首先,还有另一个项目可能具有以下历史:
repo1:
a---b---c
然后有我们的项目
repo2:
u---v---w
因为我们需要在repo2的代码中使用repo1,“智能”程序员使用read-tree将repo1的最后一次提交(c)读入w,所以现在我们已经
u---v---w---w'
其中w'在其中有commit c而没有其历史记录。然后对这两个存储库进行了一些更改,从而产生了以下历史:
a---b---c---d---e
u---v---w---w'---x---y
现在我们要清理混乱并将repo1的更改合并到我们的存储库中。然而,当简单地合并两个存储库时,我们获得了极大数量的冲突,因为分支不共享历史(实际上它们确实存在,但是git不知道),因此git不能执行三向合并。
那么我们怎样才能进行三路融合?有没有办法“添加”缺少的历史边缘,即创建这样的东西:
a---b---c---d---e
\
u---v---w--w'---x---y
答案 0 :(得分:3)
输入repo2
并添加repo1
作为远程
git add remote repo1 url_of_repo1
获取repo1
的历史记录
git fetch repo1
现在您的repo2
历史记录应为
a---b---c---d---e repo1/master
u---v---w--w' master
正如您所看到的,repo1
和repo2
历史仍然无关,并且没有共同的提交。
现在您可以自由merge
或rebase
这两行
使用merge
即可
git checkout master
git merge repo1/master
a---b---c---d---e repo1/master
\
u---v---w--w'------x master
使用rebase
,您将获得线性历史记录
git checkout -b rebasing repo1/master
git rebase master
git branch -f master
git checkout master
git branch -D rebasing
u---v---w--w'-a---b---c---d---e master
当然,你必须解决冲突。但这只是一次性问题。
为了让您的生活更轻松,在变基或合并之前,您还可以摆脱w'
提交
git checkout master
git reset master^1
将在master
提交
w
分支