如何从git rebase interactive中撤消sha更改?

时间:2015-07-20 02:02:36

标签: git git-rebase

我做了一个交互式rebase,提交的内容比我需要更改的更多。令我感到惊讶的是,这些不确定变化的结果得到了更新。不幸的是,我才意识到这是在我强行推动更新后发生的。

我做了什么

起点

NSMutableArray xxxxArray
  • X - Y \ A - B - C *master (C is a merge commit) \ - D - E *feature-branch
  • 压扁git rebase -i head~3D(我们称之为 E
  • 更改了新D1提交
  • 的提交消息
  • D1ABC并且没有做出任何更改

我的期望是一切都会像这样:

pick
  • 强迫推动我的分支

当我去公关时,实际上看起来像这样:

X - Y \
A - B - C  *master
         \
          - D1 *feature-branch

X - Y \ A - B - C *master \ - A1 - B1 - C1 - D1 *feature-branch A1B1C1AB具有相同的提交消息和更改,但与不同的沙漠。

问题

  • 如何从PR中删除CA1B1,而不会影响主C1A和{{{ 1}}?
  • B发生了什么?为什么在我的rebase命令中包含Crebase -iA进行了任何更改,因为我刚刚将它们保留为B

2 个答案:

答案 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获取新的提交哈希,因为它的祖先(可能还有它的内容)发生了变化。

您可能没有注意到YZ出现在rebase-interactive编辑器窗口中,只是将它们保留为pick

基本上,rebase将您的非线性历史记录并将其作为一条线。我不能说我建议在合并提交中使用rebase。

答案 1 :(得分:-1)

如果您为A1 - B1 - C1运行git revert,您的新分支将实际上是您想要的分支。而且此操作更安全