压缩Git中的前两个提交?

这个问题在这里已经有了答案:

  • 结合Git仓库的前两个提交? 7个答案

  • 2012年7月更新(git 1.7.12+)

    你现在可以重新提交所有提交到根目录,并选择第二个提交Y被第一个X压扁。

    git rebase -i --root master
    
    pick sha1 X
    squash sha1 Y
    pick sha1 Z
    
    git rebase [-i] --root $tip
    

    现在可以使用该命令来重写从“ $tip ”到根提交的所有历史记录。

    请参阅Chris Webb( arachsys )在GitHub上的提交df5df20c1308f936ea542c86df1e9c6974168472。


    原文答复(2009年2月)

    我相信你会在SO问题中找到不同的配方:“ 我如何结合git仓库的前两个提交?

    Charles Bailey在那里提供了最详细的答案,提醒我们一个提交是一个完整的树(不仅仅是以前的状态)。
    在这里,旧的提交(“初始提交”)和新的提交(压缩的结果)将没有共同的祖先。
    这意味着你不能“ commit --amend ”初始提交到新的提交,然后重新绑定到新的初始提交上次初始提交的历史记录(大量冲突)

    git rebase -i --root <aBranch>最后一句不再是真的)

    相反( A是原始的“初始提交”, B是后续提交需要压缩到最初的提交):

  • 返回到我们想要形成初始提交的最后一个提交(detach HEAD):

    git checkout <sha1_for_B>
    
  • 将分支指针重置为初始提交,但保持索引和工作树不变:

    git reset --soft <sha1_for_A>
    
  • 使用'B'中的树修改初始树:

    git commit --amend
    
  • 临时标记这个新的初始提交(或者您可以手动记住新的提交sha1):

    git tag tmp
    
  • 回到原来的分支(假设这个例子的主人):

    git checkout master
    
  • 将B之后的所有提交重放到新的初始提交中:

    git rebase --onto tmp <sha1_for_B>
    
  • 删除临时标记:

    git tag -d tmp
    
  • 这样,“ rebase --onto ”不会在合并过程中引入冲突,因为它将最后一次提交( B )之后的历史记录压缩到最初的一次(这是A )到tmp (代表压扁的新的初始提交):仅仅是简单的快进合并。

    这适用于“ AB ”,也适用于“ A-...-...-...-B ”(任何数量的提交都可以通过这种方式压缩到最初的提交)


    我重新编写了VonC的脚本,自动完成所有的工作,而不是问任何问题。 您给它两个提交SHA1,它将压缩它们之间的所有内容到一个名为“压扁历史”的提交中:

    #!/bin/sh
    # Go back to the last commit that we want
    # to form the initial commit (detach HEAD)
    git checkout $2
    
    # reset the branch pointer to the initial commit (= $1),
    # but leaving the index and working tree intact.
    git reset --soft $1
    
    # amend the initial tree using the tree from $2
    git commit --amend -m "squashed history"
    
    # remember the new commit sha1
    TARGET=`git rev-list HEAD --max-count=1`
    
    # go back to the original branch (assume master for this example)
    git checkout master
    
    # Replay all the commits after $2 onto the new initial commit
    git rebase --onto $TARGET $2
    

    对于它的价值,我通过始终创建一个“no-op”第一次提交来避免这个问题,其中存储库中唯一的东西是一个空的.gitignore:

    https://github.com/DarwinAwardWinner/git-custom-commands/blob/master/bin/git-myinit

    那样的话,没有任何理由要搞砸第一次提交。

    链接地址: http://www.djcxy.com/p/27613.html

    上一篇: Squash the first two commits in Git?

    下一篇: Xcode