我们是一个由几名开发人员组成的团队,我们拥有自己的主分支,并在功能分支中开发功能。我们在发布时会分支主分支的发布分支。所有错误修复都在主分支中进行,然后挑选到相关的发布分支中。
我们希望每个新功能都有原子合并提交,以便我们可以回滚和二分,如https://gist.github.com/jbenet/ee6c9ac48068889b0912。它应该给我们呈现这样的历史。
* aa55ffe - (HEAD, master) D
* 88425f8 - C
* 7bc519f - Merge branch 'feature-X' into master
|\
| * 9364e61 - feature-X: 2
| * bc76674 - feature-X: 1
|/
* 88425f8 - B
* 7bc519f - Merge branch 'feature-Y' into master
|\
| * 0e0deea - feature-Y: 4
| * 11079b5 - feature-Y: 3
| * 9364e61 - feature-Y: 2
| * bc76674 - feature-Y: 1
|/
* c765ae3 - A
当我们有多个开发人员在同一个功能上工作,并跟踪到功能分支的远程版本时,就会出现问题。因为当一些开发人员在开发该功能时,错误修复可能会在主分支中的功能开发期间发生。我们现在想将这些错误修复包含在功能分支中(即重新将功能分支重新定位到主分支中已修复错误的新状态)。
有没有办法做到这一点,而不会破坏远程跟踪分支,从而搞砸清洁历史记录和其他功能开发人员的工作副本?
Fx 能否将错误挑选到功能分支中,并让 git 在最终重新定基之后自动解决它,在将功能分支的新重新定基版本合并到主分支之前,我们将远程跟踪分支孤立起来?
答案1
是否可以将错误挑选到功能分支中,并让 git 自动解决它
如果您的修复没有引发冲突,那么它可以起作用。git clone https://gist.github.com/jbenet/7959265
查看历史记录并阅读我粘贴在那里的 reflog。
如果您在挑选时解决了冲突,则可以在合并 PR 之前,在 master 之上重新定基时手动删除提交(您可以在解决冲突的提交消息中对其进行标记/写一个提醒)。
但在我看来,当修补程序可用时,我会将功能分支重新定位到主分支之上。这与从主分支中提取任何更改相同(包括最近合并的其他功能分支)。因此,您不必担心分支过时。取决于您的团队喜欢处理什么——删除合并的修补程序,还是经常重新定位。
答案2
如果您确实需要功能分支中的错误修复,请合并错误修复分支。关于二分法/回滚/其他的讨论都是 FUD——根据我的经验,二分法可以很好地处理复杂的合并历史。该帖子中提出的模型会制造人为的问题(例如您正在询问的问题),而它唯一的好处就是更简洁看着历史。我们使用这个模型几年后才意识到不重新定基的好处。当我需要清理自己的历史记录(压缩提交、更改提交消息等)时,我会重新定基,但这不会影响下游的任何人(例如,如果我单独在分支上工作)。