对于这样的存储库:
init---A---A2---...---[D---B---merge]---...---master
\ /
C---B2
其中B
和B2
存在冲突,并在merge commit
中得到解决。
现在我想将提交A
和A2
加入一个提交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
中将其删除。因此,如果我无法永久删除这些信息,我就无法发布此项目。那么这种情况还有其他解决办法吗?
答案 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