【发布时间】:2011-01-26 12:02:02
【问题描述】:
我是 git 新手,我正在尝试了解 squash 和 rebase 之间的区别。据我了解,您在进行变基时会执行壁球。
【问题讨论】:
标签: git merge rebase git-rebase squash
我是 git 新手,我正在尝试了解 squash 和 rebase 之间的区别。据我了解,您在进行变基时会执行壁球。
【问题讨论】:
标签: git merge rebase git-rebase squash
Merge squash 将一棵树(一系列提交)合并为一个提交。也就是说,它压缩在 n 次提交中所做的所有更改到单个提交中。
变基就是变基,即为树选择一个新的基(父提交)。也许这方面的反复无常的术语更清楚:他们称之为移植,因为它就是:为一棵树选择一个新的基础(父提交,根)。
在进行交互式变基时,您可以选择压缩、选择、编辑或跳过要变基的提交。
希望这很清楚!
【讨论】:
git merge --squash 和 git rebase --interactive 都可以产生“压缩”提交。但它们的用途不同。
将在目标分支上生成一个压缩提交,而不标记任何合并关系。
(注意:它不会立即产生提交:您需要额外的git commit -m "squash branch")
如果您想完全放弃源分支,这很有用,从(从SO question 获取的模式):
git checkout stable
X stable
/
a---b---c---d---e---f---g tmp
到:
git merge --squash tmp
git commit -m "squash tmp"
# In the following graph, G is c--d--e--f--g squashed together
X-------------G stable
/
a---b---c---d---e---f---g tmp
然后删除tmp 分支。
注意:git merge has a --commit option,但不能与--squash 一起使用。 从来没有可以同时使用--commit 和--squash。
自 Git 2.22.1(2019 年第三季度)以来,这种不兼容性已经明确:
请参阅commit 1d14d0c(2019 年 5 月 24 日)Vishal Verma (reloadbrain)。
(2019 年 7 月 25 日在 commit 33f2790 中由 Junio C Hamano -- gitster -- 合并)
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."));
在一个新的基础上重放您的部分或全部提交,允许您压缩(或最近“修复”,请参阅SO question),直接转到:
git checkout tmp
git rebase -i stable
stable
X----------------G tmp
/
a---b
如果您选择压缩所有tmp 的提交(但是,与merge --squash 不同,您可以选择重放一些,并压缩其他的)。
所以区别是:
squash 不会触及您的源分支(此处为tmp)并在您想要的位置创建单个提交。rebase 允许您继续使用同一源分支(仍然是 tmp):
【讨论】:
G 被c--d--e--f--g 挤在一起了吗?
tmp 的提交被挤压在一起。
G 不会代表与 g 相同的内容,因为 X 引入了更改。
git merge --no-ff temp 而不是git merge --squash temp,那么你会得到一个更混乱的历史,但你也可以更容易地做git revert e 之类的事情。这是一段混乱但诚实务实的历史,主要分支仍然相当干净。
git pull --no-ff:stackoverflow.com/questions/12798767/…),它也是关于不破坏git bisect 或git blame。反正没有一种方法,这就是为什么本文描述了三种方法 (stackoverflow.com/questions/9107861/…)
【讨论】:
【讨论】: