首页 > 解决方案 > 在 Git 中压缩提交的最佳策略

问题描述

假设我有一个功能分支 X,我在其中多次提交并推送了更改。另一个开发人员多次提交 X 分支,然后推送更改。该功能不完整,我想将其合并到 master 并压缩提交。最好/最简单的方法是什么?

如果我做

git checkout master
git merge --squash <feature>

这将导致 1 次压缩提交给 master,但是功能分支上的提交是否被压缩了?

或者,我可以对功能分支进行 rebase,但是我必须强制推送,因为提交已经被推送到远程分支上。这不是一个坏习惯吗?

谢谢

标签: git

解决方案


git checkout master
git merge --squash <feature>

将导致 1 次压缩提交给 master,

正确的。

但是功能分支上的提交是否被压缩了?

不,或者是,或者也许是“mu”:这个问题没有意义。在这一点上,特性分支实际上已经死了:它不应该再被使用。你现在可以画成这样:

       ABCD   <-- master (HEAD)
      /
...--*
      \
       A--B--C--D   <-- feature

whereABCD是与四个提交序列执行相同操作的单个提交A--B--C--D。(请注意,在 之前git merge --squash,名称master指向 commit *。)

您现在可以使用,例如,将功能分支指向新提交,git branch -f feature master给出:

       ABCD   <-- master (HEAD), feature
      /
...--*
      \
       A--B--C--D   [abandoned]

请注意,如果您改为使用:

git checkout <feature>
git rebase -i master

然后将四个pick命令中的三个更改为squash,您已经清除了旧功能分支并创建了一个新feature分支并将名称移动feature到它的位置,方式大致相同。不同的是,名称master仍然指向其原始提交,并且您处于新的feature

       ABCD   <-- feature (HEAD)
      /
...--*   <-- master
      \
       A--B--C--D   [abandoned]

您现在可以得到git checkout master与先前方法git merge --ff-only feature相同的结果。git merge --squash

在这两种情况下,如果其他人正在使用旧feature分支,他们必须适应对 的突然更改feature,该更改已经移动,使得原来的四个提交不再有用并且应该停止使用。


推荐阅读