3 回答
TA贡献1873条经验 获得超9个赞
现在,您可以将所有提交重新设置为根,然后选择第二个提交Y与第一个压缩X。
git rebase -i --root master
pick sha1 X
squash sha1 Y
pick sha1 Z
git rebase [-i] --root $tip
现在可以使用此命令重写从“ $tip”到根提交的所有历史记录。
见提交df5df20c1308f936ea542c86df1e9c6974168472在GitHub上从克里斯·韦伯(arachsys)。
我相信您会在SO问题“ 如何合并git存储库的前两次提交? ”中找到不同的配方。
查尔斯·贝利(Charles Bailey)在此处提供了最详细的答案,提醒我们一次提交就是一棵完整的树(不仅仅是与先前状态的差异)。
在这里,旧的提交(“初始提交”)和新的提交(压缩结果)将没有共同的祖先。
这意味着您不能commit --amend将初始提交变成新的提交,然后将先前的初始提交的历史记录(新的冲突)基于新的初始提交。
(最后一句话对不再适用git rebase -i --root <aBranch>)
而是(使用A原始的“初始提交”,而B随后的提交需要压缩为初始提交):
返回我们要形成初始提交的最后一个提交(分离HEAD):
git checkout <sha1_for_B>
将分支指针重置为初始提交,但完整保留索引和工作树:
git reset --soft <sha1_for_A>
使用'B'中的树来修改初始树:
git commit --amend
临时标记此新的初始提交(或者您可以手动记住新的提交sha1):
git tag tmp
返回原始分支(此示例为master):
git checkout master
将B之后的所有提交重播到新的初始提交上:
git rebase --onto tmp <sha1_for_B>
删除临时标签:
git tag -d tmp
这样,“ rebase --onto”不会在合并过程中引入冲突,因为它会将最后一次提交()之后要压缩的历史重新建立B到最初的提交(A)中tmp(代表被压缩的新的初始提交):琐碎的快进仅合并。
既适用于“ A-B”,也适用于“ ” A-...-...-...-B(可以将任意数量的提交压缩为初始提交)
TA贡献1847条经验 获得超11个赞
我对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
TA贡献1853条经验 获得超18个赞
如果您只是想将所有提交压缩到一个初始提交中,只需重置存储库并修改第一个提交即可:
git reset hash-of-first-commit
git add -A
git commit --amend
Git重置将使工作树保持完整,因此一切仍然存在。因此,只需使用git add命令添加文件,然后使用这些更改来修改第一次提交。与rebase -i相比,您将失去合并git注释的能力。
- 3 回答
- 0 关注
- 581 浏览
添加回答
举报