在Git中压缩前两个提交?

使用,git rebase --interactive <commit>您可以将任意数量的提交压缩在一起。


除非您想将提交压缩到初始提交中,否则一切都很好。这似乎是不可能的。


有什么方法可以实现?


中度相关:

在一个相关的问题中,我设法提出一种不同的方法来解决第一次提交时的压榨问题,


汪汪一只猫
浏览 540回答 3
3回答

眼眸繁星

现在,您可以将所有提交重新设置为根,然后选择第二个提交Y与第一个压缩X。git rebase -i --root masterpick sha1 Xsquash sha1 Ypick sha1 Zgit 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(可以将任意数量的提交压缩为初始提交)

回首忆惘然

我对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 $2git commit --amend -m "squashed history"# remember the new commit sha1TARGET=`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 commitgit rebase --onto $TARGET $2

慕容森

如果您只是想将所有提交压缩到一个初始提交中,只需重置存储库并修改第一个提交即可:git reset hash-of-first-commitgit add -Agit commit --amendGit重置将使工作树保持完整,因此一切仍然存在。因此,只需使用git add命令添加文件,然后使用这些更改来修改第一次提交。与rebase -i相比,您将失去合并git注释的能力。
打开App,查看更多内容
随时随地看视频慕课网APP