Rebase在修改时创建一个新提交

时间:2015-10-22 09:21:33

标签: git git-rebase

当我这样做时:

git checkout -b branch1
git commit -m "A"
git checkout -b branch2
git commit -m "B"
-- oups did errors when committed in branch1
git checkout branch1
git commit --amend --no-edit
git checkout branch2
git rebase branch1
-- resolve conflicts
git checkout --theirs file
git rebase --continue

现在我仍然看到第一次提交(A - > A - > B)

使用正确的命令是什么,所以我没有提交。

1 个答案:

答案 0 :(得分:2)

你的问题的答案会很长,因为你给了我们很多命令,而且他们下面还有很多命令。

首先,你开始使用第三个分支,由于缺少更好的名称,我将调用start

git checkout start
git checkout -b branch1
git commit -m "A"
git checkout -b branch2
git commit -m "B"

这些命令使branch1branch2看起来像这样:

branch1: M <- A
branch2: M <- A <- B

此处提交M是来自start分支的一个(或多个)提交,它们是branch1branch2之间的共同祖先。请注意,由于您在branch2时创建了branch1branch2拥有来自A的{​​{1}}提交。

branch1

这留下了:

git checkout branch1
git commit --amend --no-edit

在这里,我使用撇号在branch1: M <- A' branch2: M <- A <- B 中标记了A提交,以表明它是不同的提交,因为您修改了它。

branch1

这里,git checkout branch2 git rebase branch1 branch1: M <- A' branch2: M <- A' <- A'' <- B 提交实际上是原始 A''提交(在修改之前),A提交是{{1}在修改之后提交

你需要决定你想做什么。您可以将两个A'提交压缩为一个,只保留A,只保留A,或者您可以同时保留两个A'。在任何情况下,我建议的工具都是A''在交互模式下。

所以不要做正常的rebase,你会这样做:

git rebase

这将显示提交列表,您可以选择要对每个提交执行的操作:

git checkout branch2
git rebase -i branch1

关键字pick 9361ckv Some earlier commit M from the start branch pick 62eed47 Amended commit A pick 39dne92 Original commit A pick k3nos9s Commit B 表示将保留每个提交。如果仔细检查提交列表,您将看到它是从最旧到最新的列表,列出了原始rebase之后当前出现在pick中的提交。这不是你想要的。假设您要删除原始的branch2提交(上面标记为A),那么您将删除包含此提交的行,并留下此列表:

A''

现在,当您完成rebase时,您的分支将如下所示:

pick 9361ckv Some earlier commit M from the start branch
pick 62eed47 Amended commit A
pick k3nos9s Commit B

此处branch1: M <- A' branch2: M <- A' <- B 只有来自branch2的修正A提交。