为了账号安全,请及时绑定邮箱和手机立即绑定

在Git中压缩前两个提交?

在Git中压缩前两个提交?

Git
汪汪一只猫 2019-12-07 13:48:48
使用,git rebase --interactive <commit>您可以将任意数量的提交压缩在一起。除非您想将提交压缩到初始提交中,否则一切都很好。这似乎是不可能的。有什么方法可以实现?中度相关:在一个相关的问题中,我设法提出一种不同的方法来解决第一次提交时的压榨问题,
查看完整描述

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(可以将任意数量的提交压缩为初始提交)


查看完整回答
反对 回复 2019-12-07
?
回首忆惘然

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


查看完整回答
反对 回复 2019-12-07
?
慕容森

TA贡献1853条经验 获得超18个赞

如果您只是想将所有提交压缩到一个初始提交中,只需重置存储库并修改第一个提交即可:


git reset hash-of-first-commit

git add -A

git commit --amend

Git重置将使工作树保持完整,因此一切仍然存在。因此,只需使用git add命令添加文件,然后使用这些更改来修改第一次提交。与rebase -i相比,您将失去合并git注释的能力。


查看完整回答
反对 回复 2019-12-07
  • 3 回答
  • 0 关注
  • 535 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信