Answers:
双方git merge --squash
并git rebase --interactive
能产生“挤压”承诺。
但是它们有不同的目的。
将在目标分支上产生压缩的提交,而不标记任何合并关系。
(注意:它不会立即产生提交:您需要额外的git commit -m "squash branch"
)
如果要完全丢弃源分支(从SO问题中获取的模式),这将很有用:
git checkout stable
X stable
/
a---b---c---d---e---f---g tmp
至:
git merge --squash tmp
git commit -m "squash tmp"
X-------------------G stable
/
a---b---c---d---e---f---g tmp
然后删除tmp
分支。
注意:git merge
具有--commit
选项,但不能与一起使用--squash
。这是从来没有可以使用--commit
和--squash
在一起。
自Git 2.22.1(2019年第三季度)起,此不兼容被明确指出:
参见Vishal Verma()的commit 1d14d0c(2019年5月24日)。(由Junio C Hamano合并--在reloadbrain
gitster
Hamano commit 33f2790中,2019年7月25日)
merge
:垃圾--commit
带--squash
以前,在
--squash
提供时,“option_commit
”被静默删除。对于试图--commit
显式地覆盖南瓜的无提交行为的用户来说,这可能是令人惊讶的。
git/git
builtin/merge.c#cmd_merge()
现在包括:
if (option_commit > 0)
die(_("You cannot combine --squash with --commit."));
在新的基础上重播部分或全部提交,从而使您可以进行压扁(或更近些的“修复”,请参见此问题)),直接转到:
git checkout tmp
git rebase -i stable
stable
X-------------------G tmp
/
a---b
如果您选择压缩所有提交 tmp
(但与merge --squash
,您可以选择重播某些内容,并压榨其他内容)。
所以区别是:
squash
不会触及您的来源分支(tmp
此处),并在您需要的位置创建一个提交。rebase
允许您使用以下命令在同一源分支上(仍然tmp
):
tmp
压缩在一起的提交。
G
会提供所有项目的快照g
,因此由于引起的更改,将不会代表相同的内容X
。
git merge --no-ff temp
而不是git merge --squash temp
,那么您会获得较混乱的历史记录,但是您也可以git revert e
更轻松地执行诸如此类的操作。这是一个混乱,但诚实和务实的历史,并且主要分支仍然保持整洁。
git bisect
或git blame
使用频率过高(例如git pull --no-ff
:stackoverflow.com/questions/12798767/…)。有没有一种方法,无论如何,这就是为什么这篇文章描述了三个(stackoverflow.com/questions/9107861/...)
合并壁球将树(一系列提交)合并为一个提交。也就是说,它将压缩在n中所做的所有更改提交中为单个提交。
重定基就是重定基,即为树选择新的基(父提交)。也许这个术语的含义更为明确:他们之所以称其为“移植”,是因为:为树选择新的地面(父提交,根)。
进行交互式基准调整时,您可以选择挤压,选择,编辑或跳过将要基准调整的提交。
希望那是清楚的!
让我们从下面的示例开始:
现在,我们有3个选项将功能分支的更改合并到主分支:
合并提交
将保留功能分支的所有提交历史记录,并将它们移至master分支。
将添加额外的虚拟提交。
Rebase和merge
将在master分支的前面附加Feature分支的所有提交历史记录。
不会添加额外的虚拟提交。
压入并合并
将所有功能分支的提交分组为一个提交,然后将其追加到master分支的前面,
将添加额外的虚拟提交。
您可以在下面找到master分支如何照顾每个分支。
在所有情况下:
我们都可以安全地删除功能分支。
G
被c--d--e--f--g
挤压在一起吗?