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"
这些命令使您的 branch1
和 branch2
看起来像这样:
branch1: M <- A
branch2: M <- A <- B
这里的提交 M
是来自 start
分支的一个(或多个)提交,它们是 branch1
和 branch2
之间的共同祖先。请注意,由于您在 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
提交
当我这样做时:
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"
这些命令使您的 branch1
和 branch2
看起来像这样:
branch1: M <- A
branch2: M <- A <- B
这里的提交 M
是来自 start
分支的一个(或多个)提交,它们是 branch1
和 branch2
之间的共同祖先。请注意,由于您在 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
提交