结合Git仓库的前两个提交?

假设你有一个包含三个提交A,BC的历史logging:

ABC 

我想将两个提交AB合并为一个提交AB

 AB-C 

我试过了

 git rebase -i A 

打开我的编辑器,内容如下:

 pick e97a17b B pick asd314f C 

我改变这个

 squash e97a17b B pick asd314f C 

然后Git 1.6.0.4说:

 Cannot 'squash' without a previous commit 

有没有办法,或者这是不可能的?

从Git 版本1.7.12开始使用git rebase -i --root

在交互式底座文件中,将提交B的第二行更改为压扁,并保留其他行:

 pick f4202da A squash bea708e B pick a8c6abc C 

这将把两个提交AB合并为一个提交AB

在这个答案中find。

你试过了:

 git rebase -i A 

如果你继续edit而不是squash ,可以这样开始:

 edit e97a17b B pick asd314f C 

然后运行

 git reset --soft HEAD^ git commit --amend git rebase --continue 

完成。

A是最初的提交,但现在你想让B成为初始提交。 git提交是整个树,即使它们通常被描述和观察它们引入的差异,也不是差异。

即使在A和B之间以及B和C之间存在多个提交,此配方也能正常工作。

 # Go back to the last commit that we want # to form the initial commit (detach HEAD) git checkout <sha1_for_B> # reset the branch pointer to the initial commit, # but leaving the index and working tree intact. git reset --soft <sha1_for_A> # amend the initial tree using the tree from 'B' git commit --amend # temporarily tag this new initial commit # (or you could remember the new commit sha1 manually) git tag tmp # go back to the original branch (assume master for this example) git checkout master # Replay all the commits after B onto the new initial commit git rebase --onto tmp <sha1_for_B> # remove the temporary tag git tag -d tmp 

在交互式底图的情况下,你必须在A之前这样做,以便列表将是:

 pick A pick B pick C 

成为:

 pick A squash B pick C 

如果A是初始提交,那么在A之前你必须有一个不同的初始提交。Git认为差异,它将处理(A和B)和(B和C)之间的差异。 因此南瓜不能在你的例子中工作。

如果你有成千上万的提交,使用kostmo的答案

 git rebase -i --root 

可能是不切实际和缓慢的,只是由于rebase脚本必须处理两次的大量提交,一次生成交互式rebase编辑器列表(在这里您select对每个提交执行什么操作),并且一次实际执行重新提交提交。

这是一个替代的解决scheme通过首先不使用交互式数据库来避免生成交互式数据库编辑器列表的时间成本。 这样就和Charles Bailey的解决scheme类似。 您只需从第二个提交创build一个孤立分支 ,然后重新绑定所有的后代提交:

 git checkout --orphan orphan <second-commit-sha> git commit -m "Enter a commit message for the new root commit" git rebase --onto orphan <second-commit-sha> master 

文档

  • git-checkout(1)手册页
  • git-rebase(1)手册页

在一个相关的问题上,我想出了一个不同的方法来解决第一个犯下这个问题的必要性,也就是把它作为第二个犯。

如果你感兴趣: git:如何插入一个提交作为第一,转移所有其他?

你必须执行一些命令行的魔法。

 git checkout -ba A git checkout B <files> git commit --amend git checkout master git rebase a 

这应该给你一个AB和C作为提交的分支。