我正在将上游的更改合并到我的项目中,最近有很多提交导致了许多合并冲突。一次性尝试解决所有合并冲突是没有意义的。
如何找出哪些提交引起了冲突?以下任何一种都可以接受:
- 一种方法是使Git在发现冲突时停止合并
- 一种方法是使Git按时间顺序列出所有发生冲突的提交
- 其他任何方式都可以让我按照时间顺序逐个解决冲突,而不需要一次合并几个提交以便于发现冲突
git imerge
绝对是有用的。 - John Szakmeistergit-mergemate
,其中包含一个find-conflict
命令:
git-mergemate find-conflict BRANCH1..BRANCH2
使用二分法确定在将
BRANCH2
合并到BRANCH1
时最早引起冲突的提交。不保留任何合并。
git-mergemate find-conflict BRANCH1...BRANCH2
使用二分法找到一对最早的提交(每个分支一个),它们不能干净地合并。不保留任何合并。
git imerge
可以用于增量合并并解决冲突,但它没有git-mergemate
中find-conflicts
的等效功能。
git-mergemate
实际上只是 VonC 在下面回答中建议的 git imerge
的旧版本。你应该编辑这个答案,直接指向 imerge。 - Mark Amerygit log --merge
命令来查看在将另一个分支合并到当前分支时所有冲突的提交记录。# find all conflicted files
git merge --no-commit --no-ff other_branch | grep "CONFLICT"
# find all commits from 'other_branch' that causes the conflicts
git log --merge | grep commit
# abort "--no-commit" command above, because we only want to test and see
git merge --abort
commit bb713a4f01e4e55a2b297f7facf962090c11687f
commit 280d44bd8a569108319080633714fa8398eab3c4
commit 3a99961983f5d3ef4508d2a8457309f779650f68
commit 87239c7fef291206063e2c840270298556ee0ef4
commit f4e27e2d5753a9eaf375da66bc8a3d589a22ba23
commit c4365a21bb85a43f227047ecdda789320aa12918
commit 78572542cf08eb8d61a40b20c12cf11357eeb3df
commit cfbc6ffe334ed5748bd3988d3b48ab42a48eeb6a
commit 88a273099afb49b968ebf4c0c3602a334ef0b2d8
若未启动合并 (git merge
),执行git log --merge
将产生以下错误:
fatal: --merge without MERGE_HEAD?
此命令仅可在合并过程中执行。
你为什么不想使用 rebase
(非交互式)来与上游分支同步变更呢?如果每次提交时出现冲突,它会停止,然后在解决冲突后可以恢复重启。这就像增量合并,而且它已经内置在 Git 中了,无需外部插件/工具:
git fetch <remote>
git rebase <remote>/<upstream-branch>
# Conflict on commit X, resolve conflict, then continue the rebase
git rebase --continue
请注意,重新基于您的本地分支将更改其提交的 sha ID。如果您已经将要重新基于的提交推送到远程,则需要强制推送新的提交以覆盖旧的提交,这可能会带来潜在问题,尤其是当您与他人共享分支时。您可以在以下链接中了解更多有关这些问题的信息: