更新以前的合并提交而不解决两次冲突
Update previous merge commit without resolving conflicts twice
我有一个包含两个分支的回购协议,main
和 feature
。 git log --graph --format='%s %d' --all
的输出如下所示:
* e (main)
| * d (HEAD -> feature)
| * Merge branch 'main' into feature
| |\
| |/
|/|
* | c
| * b
|/
* a
我现在想将 main
分支上的提交 e
包含在 feature
分支上的合并提交中,这样我就有了 [=13= 上的最新更改],但如果 feature
分支上的提交 b
已被推送,则不必强制推送。我也不想在我的历史中有另一个合并提交。我希望我的最终图表看起来像这样:
| * d (HEAD -> feature)
| * Merge branch 'main' into feature
| |\
| |/
|/|
* | e (main)
* | c
| * b
|/
* a
我可以用 git rebase -i main --onto :/a --rebase-merges
实现,并将交互式 rebase 的说明更改为:
label onto
reset 9870d06 # a
pick 579c27a b
merge -C d4caa73 main # Merge branch 'main' into feature
pick f672b7f d
问题在于,在之前的合并提交中,我不得不解决 b
和 c
之间的冲突,而使用这种方法,我将不得不再次解决这个冲突.因此,我真正想做的是在 main
上的提交 c
处继续合并提交,然后继续将 e
合并到顶部的 feature
b
。有没有办法做到这一点?也许还有一种方法可以临时引入另一个合并提交,然后再压缩这两个合并提交?
Git 是否包含为此类工作流程设计的内容。有一个障碍:您必须在 进行第一次合并之前 打开它。
幸运的是,有一个名为 git rerere-train
的第三方解决方案,它现在包含在 Git 发行版中(但仍未直接安装)。请参见 Smarter rebase avoiding redundant work?
的已接受答案
虽然这个问题(来自八年前!)是关于变基的,但相同的概念适用于 --rebase-merges
执行的 git merge
。实际上rebase时发生的冲突是合并冲突。您不需要脚本可以进行的全面培训;您可以使用 this method(来自 10 年前!)来教 Git 您之前使用的分辨率。
请注意,一旦您打开 rerere.enabled
,Git 将继续检查以前的分辨率并重新使用它们,即使您 不 希望这种情况发生(例如,如果您意识到您错误地解决了某些问题并想重新做一遍)。不过,您可以使用与打开它时相同的 git config
操作将其关闭。另请注意,即使 re-use recoreded resolutions (rerere) 选项打开, Git 将在确实采用这些记录的解决方案的冲突合并后停止。这使您有机会检查结果。
我有一个包含两个分支的回购协议,main
和 feature
。 git log --graph --format='%s %d' --all
的输出如下所示:
* e (main)
| * d (HEAD -> feature)
| * Merge branch 'main' into feature
| |\
| |/
|/|
* | c
| * b
|/
* a
我现在想将 main
分支上的提交 e
包含在 feature
分支上的合并提交中,这样我就有了 [=13= 上的最新更改],但如果 feature
分支上的提交 b
已被推送,则不必强制推送。我也不想在我的历史中有另一个合并提交。我希望我的最终图表看起来像这样:
| * d (HEAD -> feature)
| * Merge branch 'main' into feature
| |\
| |/
|/|
* | e (main)
* | c
| * b
|/
* a
我可以用 git rebase -i main --onto :/a --rebase-merges
实现,并将交互式 rebase 的说明更改为:
label onto
reset 9870d06 # a
pick 579c27a b
merge -C d4caa73 main # Merge branch 'main' into feature
pick f672b7f d
问题在于,在之前的合并提交中,我不得不解决 b
和 c
之间的冲突,而使用这种方法,我将不得不再次解决这个冲突.因此,我真正想做的是在 main
上的提交 c
处继续合并提交,然后继续将 e
合并到顶部的 feature
b
。有没有办法做到这一点?也许还有一种方法可以临时引入另一个合并提交,然后再压缩这两个合并提交?
Git 是否包含为此类工作流程设计的内容。有一个障碍:您必须在 进行第一次合并之前 打开它。
幸运的是,有一个名为 git rerere-train
的第三方解决方案,它现在包含在 Git 发行版中(但仍未直接安装)。请参见 Smarter rebase avoiding redundant work?
虽然这个问题(来自八年前!)是关于变基的,但相同的概念适用于 --rebase-merges
执行的 git merge
。实际上rebase时发生的冲突是合并冲突。您不需要脚本可以进行的全面培训;您可以使用 this method(来自 10 年前!)来教 Git 您之前使用的分辨率。
请注意,一旦您打开 rerere.enabled
,Git 将继续检查以前的分辨率并重新使用它们,即使您 不 希望这种情况发生(例如,如果您意识到您错误地解决了某些问题并想重新做一遍)。不过,您可以使用与打开它时相同的 git config
操作将其关闭。另请注意,即使 re-use recoreded resolutions (rerere) 选项打开, Git 将在确实采用这些记录的解决方案的冲突合并后停止。这使您有机会检查结果。