当我这样做时:
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)
使用正确的命令是什么,所以我没有提交。
答案 0 :(得分:2)
你的问题的答案会很长,因为你给了我们很多命令,而且他们下面还有很多命令。
首先,你开始使用第三个分支,由于缺少更好的名称,我将调用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
之间的共同祖先。请注意,由于您在branch2
时创建了branch1
,branch2
拥有来自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
提交。