Rebase 修改时创建一个新的commit

Rebase create a new commit when ammending

当我这样做时:

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)

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

你的问题的答案会很长,因为你给了我们很多命令,而在这些命令之下还有很多事情要做。

首先,您从第三个分支开始,由于没有更好的名称,我称之为 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 之间的共同祖先。请注意,由于您在 branch1 上创建了 branch2,因此 branch2 具有来自 branch1.

A 提交
git checkout branch1
git commit --amend --no-edit

剩下的是:

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

在这里,我在 branch1 中用撇号标记了 A 提交,以表明它是一个 与以前不同的 提交,因为你修改了它.

git checkout branch2
git rebase branch1

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

这里的A'' commit其实就是原来的 A commit(在你修改之前),而A' commit是A 提交 你修改它之后。

你需要在这里决定你想做什么。您可以将两个 A 提交合并为一个,您可以只保留 A',也可以只保留 A'',或者两者都保留。无论如何,我在这里推荐的工具是 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

关键字pick表示这些提交中的每一个都将被保留。如果您仔细检查提交列表,您会发现它按从旧到新的顺序列出了当前出现在原始变基后 branch2 中的提交。这不是你想要的。假设你想删除原始的 A 提交(上面标记为 A''),那么你将 删除 包含此提交的行,留下这个列表:

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

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

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

这里 branch2 只有来自 branch1.

的修改后的 A 提交