压缩Git中的前两个提交?
这个问题在这里已经有了答案:
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