git rebase <SHA1> 似乎没有压缩提交

git rebase <SHA1> does not seem to squash commits

我有两个分支。 branch1 包含最新更改,另一个 (branch2) 包含远程上的最新更改。

所以我所做的是像这样获得最近的共享提交:

SHA=$(git merge-base branch1 branch2)

然后我运行变基

git checkout branch1
git rebase ${SHA} 

我遇到的问题是这似乎并没有压缩 branch1 上的提交。它应该是压缩提交并且我的概要是错误的吗?

当您将 rebase 与交互选项一起使用时,您指定是否压缩提交。

我想知道我是否需要像 rebase 命令那样使用一些选项

git rebase -s ${SHA} 

或者也许

git rebase --autosquash ${SHA} 

Should it be squashing commits and my synopsis is wrong?

不,默认情况下不会。

从概念上讲,变基就像假装一个分支总是在另一个提交之上。例如,这里我们有一个已过时的功能分支。

A - B - C - D - E [master]
         \
          F - G - H [feature]

我们可以 git merge master 但那样会出现混乱的合并提交。相反,我们可以重写 feature 就好像它总是在 `master.

的顶端一样
  • git checkout feature
  • git rebase master

现在我们有...

                  F1 - G1 - H1 [feature]
                 /
A - B - C - D - E [master]
         \
          F - G - H

请注意,旧分支仍然存在,最终将被清理。


您要查找的是 git merge --squash.

我不建议压缩分支,因为它会丢失对代码考古学有用的重要历史记录(即弄清楚为什么要这样写)。继续压缩只是为了删除诸如错字修复之类的琐碎提交。

相反,我推荐 "feature bubbles"。如上所述重新设置分支的基线,然后 git merge --no-ff (这会强制 Git 合并而不是快进)。这导致...

                  F1 - G1 - H1
                 /            \
A - B - C - D - E ------------ I [master]

您获得线性历史(git log 将显示 I、H1、G1、F1、E、D、...),您保留详细的提交信息,即 F1、G1 和 H1 是相关的, I 的提交消息可用于描述分支的内容。