压榨Git中提交的最佳策略

时间:2018-11-05 20:29:42

标签: git

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

如果我这样做

git checkout master
git merge --squash <feature>

那将导致对master的提交被压缩1次,但是在功能分支上的提交被压缩了吗?

或者,我可以重新建立功能分支的基础,但是随后我必须强制执行推送,因为提交已被推送到远程分支上。这不是一个坏习惯吗?

谢谢

2 个答案:

答案 0 :(得分:1)

git checkout master
git merge --squash <feature>
     

将导致对母版的一次提交被压缩,

正确。

  

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

否,是,或者也许是“ mu”:这个问题没有道理。此时,功能分支实际上是 dead:,它不再被使用。现在可以这样绘制:

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

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

您现在可以使用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 mastergit merge --ff-only feature获得与早期git merge --squash方法相同的结果。

在两种情况下,如果其他任何人使用的是旧的feature分支,则它们必须适应对feature的突然更改,该更改已移动,使得原始的四个提交不再有用,应该停止使用。

答案 1 :(得分:0)

我在这里感到有些困惑,因为通常您会希望先压缩功能分支X中的提交,然后再将该分支合并到master中。在master分支本身中执行实际的南瓜操作将涉及重写该分支的历史记录,通常应该避免这种情况。

here中已经处理了在Git中压缩提交的主题,但是这里有两个可访问的选项。您可以进行软重置,然后进行新的提交:

# assuming you want to squash the 10 latest commits
git checkout X
git reset --soft HEAD~10
git commit -m 'last 10 commits in 1 new commit'

您还可以进行交互式变基:

git checkout X
git rebase -i HEAD~10

这将打开一个窗口,显示X分支的HEAD之前的10个最新提交。然后,您可以将所有提交(从最旧的提交到最顶端的提交除外)的pick更改为squash。然后,完成变基,所有提交将被压缩到HEAD之前的提交10。

在这两种情况下,您都应该留下一个X分支,并压缩提交,然后可以合并到master中。