比方说,我有一个功能分支X,在该分支中,我已经提交了多次,并且已经推送了更改。然后,另一个开发人员多次提交X分支,然后推送更改。 该功能不完整,我想将其合并到master中并压缩提交。最好/最简单的方法是什么?
如果我这样做
git checkout master
git merge --squash <feature>
那将导致对master的提交被压缩1次,但是在功能分支上的提交被压缩了吗?
或者,我可以重新建立功能分支的基础,但是随后我必须强制执行推送,因为提交已被推送到远程分支上。这不是一个坏习惯吗?
谢谢
答案 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 master
和git 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
中。