修改合并的远程分支的最佳做法是什么?

What's the best practice for amending a merged remote branch?

例如,我完成了一个功能分支,将其推送并合并到远程开发分支中。 3天后,我在那个分支上发现了一个错字,那么修改那个分支的最好方法是什么。创建一个新分支来纠正那个微不足道的错误还是在旧分支上重新工作?您能否为此举一个 git 命令的示例?谢谢!

如果我没理解错的话,你说的是政策问题,而不是技术问题。技术部分是相同的——您可以将其视为任何其他更改。另一个要合并的分支,如果那是您的工作流程。

无论您是在 新分支 还是刚刚合并的 旧分支 上犯下新的拼写错误都没有关系git,树在两种情况下看起来都一样。

新提交,未修改,稍后合并

这是合并次要提交后的样子:

A-B-C-D-G-H-I-J (develop, newMergedBranch or oldMergedBranch)
 \   /       /
  E-F----Typo

一个重要的地方是合并提交本身。它会说 Merged in branchName。因此,根据您希望它的外观(如果未编辑合并提交),您可以选择要使用的分支名称。

修改再合并

澄清修改后的效果,回复评论: 修改是否是不好的做法取决于人们现在是否在使用 D。如果有人在 D 之上进行提交,然后您修改较早的提交(比如 F,使用 git rebase -i),您将更改它下游的一切。

注意:对于以下所有 D,C 是父级。 D' 是合并提交。

A-B-C-D--G-H-I-J (other develop)
 \   /       
  E-F  D' (your develop, oldBranch)
   \F'/ (Typo)

要解决此问题(没有强制推送 - 使用强制更新,所有来自 D 的拉取都必须强制拉取,如果他们不知道,可能会丢失更改。他们首先 运行 陷入拉取冲突,即使他们做的一切都是正确的。这就是为什么修改公开分支的历史记录被认为是不好的做法的原因),必须合并你的开发:

A-B-C-D--G-H-I-J-K (develop, old branch)
 \   /          / 
  E-F  D'-------
   \F'/ (Typo)

澄清一下,图中 D' 不在 F 的下游。

总结一下,这与旧场景完全一样,没有修改提交的场景。只是如果你修改commits,它看起来"uglier"。强制推送是不好的做法。无论如何,您可能无权这样做。

修改、变基、强制推送

如果你 rebase 剩下的 develop 和 force push,那么 pull 的人将有:

A-B-C-D-G-H-I-J-L1-L2-L3 (other person's local develop, L1- being local commits)
 \   /           
  E-F  
   \F'-D'-G'-H'-I'-J' (develop)

然后他们在拉取新的 rebased develop 时会发生冲突,然后他们必须再次合并。或者做一些更复杂的事情,比如 rebase,以实现:

A-B--C
 \    \ 
  E-F'-D'-G'-H'-I'-J'-L1-L2-L3 (develop)

至关重要的是,他们必须知道这样做(evrey 单独其中一个),否则他们将合并并使您的所有努力白费 - 导致再次合并。


关于政策:

您已提交 该代码,现在无法更改。没有修改,没有历史覆盖。你将不得不忍受它。

如果要进行的更改很关键,那么您现在应该已经完成​​了。如果不是,但有点像宠物的烦恼,它现在取决于你的提交政策是什么。您(组织、团队等作为集体决定)是否希望整个提交只是为了更正拼写错误?

大多数团队都可以接受。没有人会因为受到伤害或恼火而提起这件事。如果其他人可能会在代码库的那个区域工作并且会遇到那个拼写错误并且会很生气,那么一定要修复它 - 没有两种解决方法。

如果不是,而且它大部分是孤立的,那么在你的情况下我会做的是把那个改变放在某个地方的分支上,也许在你的藏匿处。当您下次必须再次使用该代码库时,您也可以将此拼写错误更改添加到它。