所以说这就是我的git历史可能会是这样的:
m -> m
\-> A
\-> B
我从主线分支以创建功能分支A并进行提交。现在我等待功能分支A被批准,但我需要继续工作并需要功能A来处理功能B.所以我从提交A创建一个新的分支并继续我的工作。/ p>
说我的代码审查回来并说我需要对A进行更改。为了防止git历史的污染,我在A上git commit --amend
而不是进行新的提交。
现在,由于我已经在A中进行了更改,我需要确保这些更改位于分支B中。所以我切换到B执行git rebase A
,但我最终会遇到rebase冲突。< / p>
有没有什么方法我可以简单地将我修改过的新修改应用到分支B而不会造成不适当的冲突?我可能使用了错误的命令,不应该使用rebase,但我不确定应该使用什么。
答案 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
,没有直接的方法可以找到它;但如果我们从B3
(feature-B
的提示)开始并向后工作,我们会找到B3
,然后是B2
,然后是B1
,然后是{{1然后是A1
的提示提交。
这意味着提交mainline
仍在使用中,仍在使用中:它只是A1
上仅 的第一次提交。 (feature-B
到B1
同样只在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也适用于此。)