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

时间:2016-12-21 03:01:45

标签: git git-rebase git-squash

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

所以我做的是获得最新的共享提交,如下所示:

SHA=$(git merge-base branch1 branch2)

然后我运行rebase

git checkout branch1
git rebase ${SHA} 

我遇到的问题是,这似乎并没有在branch1上压缩提交。它应该是压缩提交而我的故事大纲是错的吗?

当您使用带有交互选项的rebase时,您可以指定是否压缩提交。

我想知道是否需要使用rebase命令

这样的选项
git rebase -s ${SHA} 

或者

git rebase --autosquash ${SHA} 

1 个答案:

答案 0 :(得分:2)

  

是否应该压缩提交并且我的故事大纲是错的?

不,默认情况下没有。

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

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

我不建议压缩分支,因为它丢失了对代码考古学有用的重要历史(即弄清楚为什么东西是这样编写的)。继续压缩只是为了删除像拼写错误修复那样的琐碎提交。

相反,我推荐“功能气泡”。如上所述重新启动分支,然后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的提交消息可用于描述分支的内容。