git squash几个提交成一个

时间:2014-07-12 18:41:33

标签: git

我想将最后12个提交压缩成一个。我尝试了这个命令但得到了一个致命的错误:

>git rebase -i HEAD~12
fatal: Needed a single revision
invalid upstream HEAD~12

我有一个远程存储库,我已经推送了一些提交,但这并不重要,因为我将它推送到heroku,因此这些代码不会与其他用户共享。我之所以提到它,是因为我知道当一些提交已经提交时,重写历史记录并不好。

>git remote
heroku

securityheroku分支已合并到master中:

>git branch
  heroku-setup
* master
  security

我的提交看起来像那样:

>git log --pretty=oneline
04d85b2959b73daff8ce0d49002c81469748798d Switch to Google OAUth 2.0
862cd0f7a9243d602dbeb1d670c08f20a1b832d8 Switch to Google OAUth 2.0
b25a48a657b9bf5087eaa9c1821163d0746b5ac2 Fix mongodb config
bd4c95dd25056a8a8bc6ed97faf01c7007d3f598 Setup Heroku
c82762c29fc1e5563082d710a1d241ce3ec7681f Setup Heroku
976d2baabe386eb1135e7789be167b081d40eeb0 Setup Heroku
e7ae7dd8755e75fc2bfd4bee460ad7f73b6e8ae4 Setup Heroku
6a389b55b782f37daa1c7434b68fe48100bb79e2 Setup Heroku
c26583bcf92f383c66526a29ee5642c3123b650e Setup Heroku
f7d36cf7215de13ade5ff537c3954f99f05506bd Setup Heroku
1110ed9efc60a27ac6334fb5987110de27983dcc Security with Passport
073d3ba79b727e2dc938aa4345f144baa66e05e3 Security with Passport
b82898acf97cc52f94a08e13388a7641460d8ef2 RequireJS + Nested Layout
8d30a5444244229c443354d7b448098d8ead4083 Project Organization

基本上我希望我的历史

<new SHA> Security with Passport
b82898acf97cc52f94a08e13388a7641460d8ef2 RequireJS + Nested Layout
8d30a5444244229c443354d7b448098d8ead4083 Project Organization

1 个答案:

答案 0 :(得分:6)

你得到的错误不是很明显,但我相信我知道是什么导致了它。

使用HEAD~12,您要求git关注12个第一父链接。同时,使用git log --pretty=oneline,您会看到父链接... 所有父链接,而不仅仅是第一父链接。

如果将--graph添加到git log命令,您将看到其中一些提交位于提交图的不同路径上。以下仅仅是为了说明,而不是对上述内容的正确分析(没有足够的信息进行正确的分析),但让我们说图表看起来像这样:

A - B - C1 - D1 - E1 ----- H - I   <-- HEAD=master
      \                      /
        C2 - D2 - E2 ----- G       <-- security
           \             /
             D3 - E3 - F           <-- heroku-setup

此图表共包含14个节点(样本git log输出也是如此)。假设每个合并提交的第一个父项(IGF)对应于水平方向(以及第二个指向左下方向),从{开始{1}},提交IB,因此为master~5。从节点HEAD~5开始并计算左侧的步数:1(I),2(H),3(E1),4(D1) ,5(C1)。

B表示从节点HEAD~12开始,向左计数12步。当您尝试从提交I向左移动时会发生什么?

请注意,虽然我从左到右绘制了这个图表,左边是最根提交A而右边提示提交AHEAD绘制它默认情况下,或多或少从底部到顶部(各种选项可以改变节点排序)。如果没有任何选项,git log --graph按逆时间顺序排序,但使用git log设置--graph除非被其他排序选项覆盖。

您还可以向--topo-order提供--first-parent,以指示其仅查看每个第一父链接(您可以使用git log命名的链接)。请参阅git loggit rev-list的文档。 Git命令通常采用单个修订,由git rev-parse处理,或者与HEAD~n一样 - 修订列表,由git log处理。 gitrevisions下的文档也很有用。