在两个提交之间插入一个被忽略的提交

时间:2014-08-20 16:15:03

标签: git rebase

我有一个公共git存储库的克隆。简化后,提交(A-D)看起来像这样:

   +->D
   |
A->B->C

提交A和B已经在公共回购中。我向克隆添加了提交C,其中包括重要的编码标准更改以及重要的功能更改。后来我决定在克隆中添加一个提交D,它只纠正提交B中的编码标准问题。

我想在提交D之后重新排序提交C,所以事情看起来像这样:

A->B->D->C

因为我已经在两次提交中都对编码标准进行了更改,所以我想告诉git接受提交C as-is而不进行合并。我还没有弄清楚如何做到这一点。任何人都可以提出正确的方法吗?

我曾经认为git-rebase采用合并策略我们的"我们的"会做的伎俩,但我没有运气。

3 个答案:

答案 0 :(得分:3)

git checkout C
git reset --soft D
git commit

应该足够了。 git reset --soft只是重置git认为“当前”提交的内容,而不实际进行任何更改。因此,您的索引和工作树仍然完全它们在C中的位置,您可以在不需要进行任何进一步更改的情况下提交它。

请注意,这些命令中的任何内容都不会导致任何类型的合并或自动冲突解决。这意味着如果 D的任何部分,不是已经是C的一部分,这将导致{{1}的更改要有效地恢复。您已经声明情况并非如此,D仅包含D的位,因此这不应该是一个问题。

答案 1 :(得分:1)

我使用SourceTree作为GIT的GUI 假设提交C是主分支

  1. 结帐提交D为" temp"
  2. 选择commit C中的所有文件,右键单击" reset to commit"
  3. 未提交的更改现在应显示您的功能更改
  4. 将您的更改提交为E
  5. 删除"掌握"分支
  6. Checkout" temp"分支为" master"
  7. 你得到A-> B-> D-> E,其中E是C而没有D的变化。

答案 2 :(得分:1)

我认为这很简单:

git checkout D
git cherry-pick <commitIDofC>

解决任何遗漏的冲突。提交内容不会完全相同,因为它们不可能,B的历史记录和B->D之后的历史记录不能相同,所以如果您触摸相同的区域代码不能相同。

请试一试,告诉我。

干杯。