git rebase反复要求我运行`git rebase --continue`

时间:2019-08-08 12:37:15

标签: git git-rebase

我在功能分支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,它就无止境。为什么?那么,在解决冲突以重新建立分支机构后应该怎么做?

2 个答案:

答案 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。较新的提交朝右。您早先进行了ABC的提交。)您已经决定了想要将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,然后依次复制AB。它在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

这与您最初的期望并不完全一样,但毕竟是您所需要的。