我使用git pull --rebase
从存储库中提取了最新代码。我的本地提交与其中一个远程提交冲突。有问题的文件中有合并标记,所以我可以将我的版本与他们的版本进行比较,但我真正想知道的是另一个版本试图做出什么改变?我想将另一个变化与我们共同的祖先区别开来。我该怎么做?
答案 0 :(得分:2)
你做了一个pull -rebase,所以你已经在你的本地分支(HEAD)上进行了“他们的”提交。在冲突发生之前,您可能已经应用了一些提交。因此,您可以按提交检查所有更改:
git log -p file
您可以通过添加共同祖先的修订范围来进一步缩小范围:
git log -p common..HEAD file
如果pull -rebase已经在冲突发生之前已经应用了2次提交(你在日志中看到它们是最后一次提交)并且希望看到对他们的共同祖先的“他们的”更改:
git log -p common..HEAD^^ file
答案 1 :(得分:1)
(编辑:唉,我的图表和说明都有破损,让我们解决它:)
此命令将显示他们更改的所有,您可能希望将更改隔离到这些提交中的特定提交或提交和/或文件集,但请考虑:
$ git diff $(git merge-base master origin/master) origin/master
(假设你在分支master
)。这告诉git将共同的祖先提交与“他们的”头部提交进行比较。
这是一个关于正在发生的事情的粗略草图。假设您开始使用从A
(您克隆的repo)获得的提交B
,C
和origin
。您提交了D
和E
,他们提出了F
和G
。你现在正处于冲突的变革中。 (我假设此处D
的更改已成功重新定位,提交了提交D'
,问题位于E
。)+i,w
表示存在内容尚未提交的索引和/或工作目录 - 这是您需要解决的冲突提交。
D - E <-- master
/
A - B - C D' +i,w <-- HEAD (detached)
\ /
F - G <-- origin/master
在这种情况下,git merge-base master origin/master
会找到提交C
,这是rebase的共同点。
同时origin/master
名称提交G
。所以:
git diff <name-of-commit-C> origin/master
在两次提交F
和G
中向您展示他们所做的一切(将G
的内容与C
的内容进行比较)。当然,您也可以使用git log
查找单个提交,或使用origin/master~1
等名称命名。您还可以git show origin/master
查看最近的更改G
和git show origin/master~1
以显示更改F
。
最后,如果您一旦解决了冲突并git rebase --continue
并且它到达终点,git会将分支标签(master
)移动到HEAD
点的位置,并设置HEAD
引用回master
,而不是“超脱”。或者,如果您使用git rebase --abort
,它将放弃新链,只需恢复旧master
(之后您可以重新rebase
。)
(顺便提一下,这是gitk
等图形工具派上用场的一种情况。在冲突的rebase上提出gitk --all
或gitk HEAD master origin/master
,通常很容易看出冲突的位置提交是。)
对于非常艰难的合并案例,有git-imerge,我还没有使用过(但是),但看起来非常好。
答案 2 :(得分:1)
在变基之前,请运行:
git config merge.conflictstyle diff3
如the git-config man page中所述。这会导致git包含最新的共同祖先文本以及每个冲突的更改。