0

我有一个带有两个分支的仓库,main并且feature. 的输出git log --graph --format='%s %d' --all如下所示:

* e  (main)
| * d  (HEAD -> feature)
| *   Merge branch 'main' into feature 
| |\  
| |/  
|/|   
* | c 
| * b 
|/  
* a

我现在想将e我的分支上的提交包含在main分支上的合并提交中feature,以便我有最新的更改,但如果分支上的main提交已经被推送,则不必强制推送。我也不想在我的历史记录中有另一个合并提交。我希望我的最终图表如下所示:bfeature

| * d  (HEAD -> feature)
| *   Merge branch 'main' into feature 
| |\  
| |/  
|/|   
* | e  (main)
* | c 
| * b 
|/  
* a

我可以通过git rebase -i main --onto :/a --rebase-merges将交互式变基的说明更改为:

label onto

reset 9870d06 # a
pick 579c27a b
merge -C d4caa73 main # Merge branch 'main' into feature
pick f672b7f d

但问题在于,在之前的合并提交中,我必须解决 and 之间的冲突bc而使用这种方法,我将不得不再次解决这个冲突。因此,我真正想做的是拿起我在提交时中断的合并提交,然后c继续main合并efeature. b有没有办法做到这一点?也许还有一种方法可以暂时引入另一个合并提交,然后再压缩这两个合并提交?

4

1 回答 1

2

Git确实包含为这种工作流程设计的东西。有一个障碍:您必须在第一次合并之前打开它。

幸运的是,有一个第三方解决方案,称为git rerere-train,现在包含在 Git 发行版中(但仍未直接安装)。参见例如Smarter rebase 避免冗余工作的公认答案?

虽然这个问题(来自八年前!)是关于变基的,但同样的概念适用git merge--rebase-merges. 实际上,rebase 过程中发生的冲突就是合并冲突。您不需要脚本可以进行的全面培训;你可以使用这种方法(从十年前开始!)教 Git 你之前使用的分辨率。

请注意,一旦您打开rerere.enabled,Git 将继续检查以前的解决方案并重新使用它们,即使您希望这种情况发生(例如,如果您意识到您解决了错误的问题并想重做)。不过,您可以使用与打开它相同的git config操作将其关闭。另请注意,即使打开了re -use re coreded re solutions (rerere) 选项,Git 也会在使用这些记录的解决方案的冲突合并后停止。这使您有机会检查结果。

于 2021-02-18T19:34:01.807 回答