如何将两个早期提交加入一个提交

时间:2017-12-28 09:05:33

标签: git version-control

对于这样的存储库:

init---A---A2---...---[D---B---merge]---...---master
                        \      /
                         C---B2

其中BB2存在冲突,并在merge commit中得到解决。

现在我想将提交AA2加入一个提交A。我试过了

git rebase -i <commit id of init>

并更改

pick xxxxxxx A
pick xxxxxxx A2
...

pick xxxxxxx A
squash xxxxxxx A2
...

但是在应用B2时出现了冲突,我必须手动处理冲突,就像我在merge中所做的那样。

实际上,整个提交树中有如此多的结构,甚至比方括号中的更复杂。因此,手动处理所有冲突是不现实的。

问题在于,当我使用rebase时,整个提交树将合并为一行,并且它不会通过应用提交merge自动处理冲突。

那么我该怎样做才能只加入提交A和A2,但是在A2未更改之后仍然保留所有提交结构,以便存储库看起来像#be;手术后一样吗?

为了进一步解释,在提交A中,在测试文件中添加了一些敏感信息,并在提交A2中将其删除。因此,如果我无法永久删除这些信息,我就无法发布此项目。那么这种情况还有其他解决办法吗?

2 个答案:

答案 0 :(得分:1)

要加入(或者直接&#39;当它被调用时),您需要以交互方式进行rebase。如果要更改的提交是前两个,则可以从repo的根目录进行重新设置。

这看起来有点像:

git rebase -i --root
pick hash X
squash hash Y
pick hash Z

-i表示您将以交互方式进行此操作。 --root表示从回购的根目录开始。

在初始命令之后,您将看到一个提交列表,其中前一个是第一个提交。要合并前两个提交,您只需保留第一个提交(使用pick关键字)并将前一个提交合并到其中(使用squash关键字)。您还可以通过将pick替换为reword来编辑第一个提交消息。

在您完成此操作后,您应该保留所有其他提交并确认。

可以找到更多信息here

答案 1 :(得分:0)

您还可以使用使用步骤将两个早期提交一起加入。

假设您要加入的提交位于master分支上,并且提交历史记录为:

A---B---C---D---…---X  master

要在提交B(从C提交到C后)保留提交历史记录的同时加入提交D并提交X,您可以使用以下命令:

git checkout -b temp <commit id for A>
git merge <commit id for C> --squash
git commit -m 'join B and C together'

现在提交历史将是(commit M是squash merged commit,join commit B和commit C):

A---B---C---D---…---X  master
 \
  M  temp

然后,您可以在提交C后重新提交以下提交:

git rebase --onto temp <commit id for C> master
git push -f origin master
git branch -D temp

现在master分支上的提交历史将是(commit M是提交连接提交B并且一起提交C

A---M---D'---…---X'  master