Git重新应用修改提交到该提交的分支

时间:2018-01-23 23:38:38

标签: git version-control

所以说这就是我的git历史可能会是这样的:

m -> m
      \-> A
           \-> B

我从主线分支以创建功能分支A并进行提交。现在我等待功能分支A被批准,但我需要继续工作并需要功能A来处理功能B.所以我从提交A创建一个新的分支并继续我的工作。

说我的代码审查回来并说我需要对A进行更改。为了防止git历史的污染,我在A上git commit --amend而不是进行新的提交。

现在,由于我已经在A中进行了更改,我需要确保这些更改位于分支B中。所以我切换到B执行git rebase A,但我最终会遇到rebase冲突。< / p>

有没有什么方法我可以简单地将我修改过的新修改应用到分支B而不会造成不适当的冲突?我可能使用了错误的命令,不应该使用rebase,但我不确定应该使用什么。

1 个答案:

答案 0 :(得分:0)

  

说我的代码审查回来并说我需要对A进行更改。为了防止git历史的污染,我在A上git commit --amend而不是进行新的提交。

这一切都是合理的,但是...... git commit --amend 进行了新的提交

没有人 - 不是你,不是任何人,不是任何东西 - 实际上可以改变任何现有的提交。

如果我们在各个分支中一次一个地绘制每个实际提交,我们将其作为初始图片:

...--o--o   <-- mainline
         \
          A1   <-- feature-A
           \
            B1--B2--B3   <-- feature-B

(假设feature-A包含一个新提交,feature-B包含三个提交。

现在告诉您对feature-A进行一些更改,以便运行:

git checkout feature-A

HEAD附加到feature-A并使A1成为当前提交。然后,您对某些文件进行一些更改,使用git add将这些文件复制到索引中,然后运行git commit --amend以进行新的提交。

提交A1没有 - 可以不会更改。相反,Git会创建一个类似{{A1'的新A1 1}}因为它具有相同的父级,但不是A1,因为它具有不同的哈希ID。然后Git将您的名称feature-A指向新提交。让我们画一下,虽然它有点棘手:

          A1'  <-- feature-A (HEAD)
         /
...--o--o   <-- mainline
         \
          A1   [abandoned ... sort-of!]
           \
            B1--B2--B3   <-- feature-B

现在没有名称附加到提交A1,没有直接的方法可以找到它;但如果我们从B3feature-B的提示)开始并向后工作,我们会找到B3,然后是B2,然后是B1,然后是{{1然后是A1的提示提交。

这意味着提交mainline仍在使用中,仍在使用中:它只是A1上仅 的第一次提交。 (feature-BB1同样只在B3上。)feature-B过去常常在 A1 和< / em> feature-B;现在它只在feature-A

当您复制feature-B以便附加到feature-B时,您需要告诉Git:复制提交A1'B1 。 Git通常会将B3复制到A1,因为这些只是B3上的提交(现在!)。为此,您可能需要feature-B。这允许您将要复制的内容部分与中的部分分开操作:

git rebase --onto
例如

。这继续假设有三个提交要复制:git rebase(提交git checkout feature-B git rebase --onto feature-A feature-B~3 ),feature-B~2(提交B1)和feature-B~1本身(提交{ {1}})。如果情况并非如此,请使用B2以外的其他内容来标识要复制的第一个提交 。 (原始feature-B提交的原始哈希ID也适用于此。)