4

我们的项目中有一段非常奇怪的 git 历史。首先,有另一个项目可能有以下历史:

回购1:

a---b---c

然后是我们的项目

回购2:

u---v---w

因为我们在 repo2 的代码中需要 repo1,所以“聪明”的程序员使用 read-tree 将 repo1 的最后一次提交 (c) 读入 w,所以现在我们有了

u---v---w---w'

其中 w' 有提交 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
4

1 回答 1

3

输入repo2并添加repo1为遥控器

git add remote repo1 url_of_repo1

Fetchrepo1的历史

git fetch repo1

现在你的repo2历史应该是

a---b---c---d---e  repo1/master

u---v---w--w'  master

如您所见,repo1's 和repo2历史仍然不相关,并且没有共同的提交。

现在你可以随意mergerebase两条线

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

于 2013-10-15T12:23:21.373 回答