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

git rebase repeatedly asking me to run `git rebase --continue`

我在我的功能分支 my-feature,我 运行 rebase 开发分支:

(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就没完没了。为什么?那么,在我解决了rebase到develop分支的冲突之后,我应该做什么呢?

解决变基冲突时,你不应该提交它们,让变基处理提交部分*。

*除非你在交互式rebase中,否则你可以停下来修改提交。

一旦您编辑了冲突文件,您必须添加它们(而不是提交)然后您可以 git rebase --continue。这是一个例子:

git rebase develop
# conflict
vi file-with-conflict
git add file-with-conflict
git rebase --continue

这将继续rebase到下一步(next commit),如果有新的冲突,你将不得不以同样的方式解决。依此类推,直到既没有冲突需要解决也没有提交变基。


在您的情况下,您可能需要先 git rebase --abort 重新开始,然后再次尝试变基。

你已经接受了一个答案,但让我补充一下,强调一下:

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.

有时,在变基时——这意味着复制一系列提交——你会发现 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 而不是提交 *——B' 就像 BC' 就像 C.

因此,git rebase 计划复制 A,然后是 B,然后是 C。它在 T 处分离 HEAD(因此 "is in detached mode")并执行第一个副本。如果一切顺利,您现在拥有:

                   A'  <-- HEAD
                  /
...--o--*--R--S--T   <-- master
         \
          A--B--C   <-- feature

Git 然后继续尝试复制 B。由于冲突,此复制步骤 失败 ,使您处于看到的状态。

您现在开始解决冲突。检查第一个冲突,您会发现您在 B 中所做的事情已由提交 S 处理,因此您从 T 中选择他们的代码,这是由于他们在 S,而不是来自 B 的代码。检查第二个冲突,您会发现您在 B 中所做的事情已由提交 R 处理,因此您再次从 T 中获取他们的代码。重复此操作,直到您解决所有冲突,从您自己的 B.

中进行 no 更改

如果你现在运行:

git rebase --continue

你的Git会说:

No changes - did you forget to use 'git add'?

不,你没有忘记,你只是解决了所有的冲突,最后,删除你的提交B.所以上面的粗体字建议适用,你可以 运行:

git rebase --skip

告诉Git:是的,完全放弃我的提交,现在继续尝试复制C假设 复制成功,变基将完成,您将拥有:

                   A'-C'  <-- feature (HEAD)
                  /
...--o--*--R--S--T   <-- master
         \
          A--B--C   [abandoned]

这不是你最初的期望,但毕竟是你需要的。