我做了一个交互式rebase,提交的内容比我需要更改的更多。令我感到惊讶的是,这些不确定变化的结果得到了更新。不幸的是,我才意识到这是在我强行推动更新后发生的。
我做了什么
起点
NSMutableArray xxxxArray
X - Y \
A - B - C *master (C is a merge commit)
\
- D - E *feature-branch
git rebase -i head~3
和D
(我们称之为
E
)D1
提交D1
,A
和B
为C
并且没有做出任何更改我的期望是一切都会像这样:
pick
当我去公关时,实际上看起来像这样:
X - Y \
A - B - C *master
\
- D1 *feature-branch
X - Y \
A - B - C *master
\
- A1 - B1 - C1 - D1 *feature-branch
,A1
和B1
与C1
,A
和B
具有相同的提交消息和更改,但与不同的沙漠。
问题
C
,A1
和B1
,而不会影响主C1
,A
和{{{ 1}}?B
发生了什么?为什么在我的rebase命令中包含C
,rebase -i
和A
进行了任何更改,因为我刚刚将它们保留为B
?答案 0 :(得分:4)
如果您只想删除A1 / B1 / C1,最简单的方法就是git rebase -i C
。将A1标记为' reword',将B1至D1标记为' fixup'。编辑A1的提交消息,使其成为最终消息。
现在,关于出了什么问题:C
是合并提交。
这意味着你的历史图表可能实际上看起来像这样:
A - B - C *master
/ \
...-X-Y-Z - D - E *feature-branch
当你说HEAD~5
时,HEAD的第一个父亲五次。我们假设C
的第一位家长是Z
而不是B
。这意味着您需要重新定位到提交X
,并且您在其中种植的提交之一是A
。新的A
获取新的提交哈希,因为它的祖先(可能还有它的内容)发生了变化。
您可能没有注意到Y
和Z
出现在rebase-interactive编辑器窗口中,只是将它们保留为pick
。
基本上,rebase
将您的非线性历史记录并将其作为一条线。我不能说我建议在合并提交中使用rebase。
答案 1 :(得分:-1)
如果您为A1 - B1 - C1运行git revert
,您的新分支将实际上是您想要的分支。而且此操作更安全