我在功能分支my-feature
上,我运行rebase development分支:
(my-feature)$ git rebase develop
终端显示出许多冲突,并且现在处于detached
模式:
(detached*)$
我以分离模式解决了这些冲突,并将其提交。然后,我运行git rebase --continue
,但是现在git再次提示我以下内容:
(detached*)$ git rebase --continue
Applying: my-feature my commit message
No changes - did you forget to use 'git add'?
If there is nothing left to stage, chances are that something else
already introduced the same changes; you might want to skip this patch.
Resolve all conflicts manually, mark them as resolved with
"git add/rm <conflicted_files>", then run "git rebase --continue".
You can instead skip this commit: run "git rebase --skip".
To abort and get back to the state before "git rebase", run "git rebase --abort".
因此,我再次运行git rebase --continue
,但是向我显示的是相同的消息,只要我运行git rebase --continue
,它就无止境。为什么?那么,在解决冲突以重新建立分支机构后应该怎么做?
答案 0 :(得分:1)
在解决基础上的冲突时,您不应提交,让该基础处理提交部分*。
*除非您处于交互式基础中,否则您可以在此处停止修改提交。
编辑了冲突文件后,您必须先添加它们,然后提交,然后git rebase --continue
才可以。这是一个示例:
git rebase develop
# conflict
vi file-with-conflict
git add file-with-conflict
git rebase --continue
这将继续进行下一步(下一次提交),如果有新的冲突,则必须以相同的方式解决。依此类推,直到没有冲突可以解决,也没有承诺重新建立基础。
根据您的情况,您可能需要先git rebase --abort
才能获得一份干净的名单,然后再次尝试重新设置基准。
答案 1 :(得分:1)
您已经接受了一个答案,但让我添加一下,重点是我自己:
没有变化-您忘记使用'git add'吗?
如果没有什么可上演的,很可能还有其他事情
已经进行了相同的更改;您可能要跳过此补丁。
有时候,在重新定基础时(这意味着复制一系列提交),您会发现实际上并不需要Git认为仍然需要的一个提交。
例如,考虑这种情况:
...--o--*--R--S--T <-- master
\
A--B--C <-- feature
(大写字母代表提交哈希ID。较新的提交朝右。您早先进行了A
,B
和C
的提交。)您已经决定了想要将git rebase
feature
放到master
上。如果一切都如您所愿,您将得到以下结果:
A'-B'-C' <-- feature (HEAD)
/
...--o--*--R--S--T <-- master
\
A--B--C [abandoned]
其中A'
与类似 A
-进行相同的更改,但是提交T
而不是提交{ {1}}-*
就像B'
,而B
就像C'
。
因此,C
计划复制git rebase
,然后依次复制A
和B
。它在C
分离HEAD(因此“处于分离模式”)并执行第一个副本。如果一切顺利,那么您现在可以:
T
然后,Git继续尝试复制 A' <-- HEAD
/
...--o--*--R--S--T <-- master
\
A--B--C <-- feature
。由于冲突,此复制步骤失败,使您处于看到的状态。
您现在开始解决冲突。检查第一个冲突,您会发现B
提交已处理了B
中的操作,因此您从S
中选择了他们的代码,这是由于他们的{ {1}},而不是您来自T
的代码。检查第二个冲突,您发现在S
中所做的工作已由提交B
处理,因此您再次从B
中获取了他们的代码。重复此过程,直到您解决所有冲突,并从您自己的R
中进行不更改。
如果您现在运行:
T
您的Git会说:
没有变化-您忘记使用'git add'吗?
不,您没有忘记,您只是通过放弃提交B
解决了所有冲突。因此,上面的粗体字建议适用,您可以运行:
git rebase --continue
告诉Git:是的,完全放弃我的提交,然后立即尝试复制B
。假设 可以正常工作,则重新配置将完成您将拥有:
git rebase --skip
这与您最初的期望并不完全一样,但毕竟是您所需要的。