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

Lee*_*eem 6 git git-rebase

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

(my-feature)$ git rebase develop
Run Code Online (Sandbox Code Playgroud)

终端显示一堆冲突,现在处于detached模式:

(detached*)$
Run Code Online (Sandbox Code Playgroud)

我以分离模式解决了这些冲突并提交了它们。然后,我运行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".
Run Code Online (Sandbox Code Playgroud)

于是,我再次跑步git rebase --continue,但同样的信息向我表明,只要我跑,就没有止境git rebase --continue。为什么?那么,在解决了 rebase 到开发分支的冲突后我应该做什么?

Uly*_* BN 5

当解决 rebase 上的冲突时,您不应该提交它们,让 rebase 处理提交部分*。

*除非您处于交互式变基中,否则您可以停下来修改提交。

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

git rebase develop
# conflict
vi file-with-conflict
git add file-with-conflict
git rebase --continue
Run Code Online (Sandbox Code Playgroud)

这将继续变基到下一步(下一次提交),如果出现新的冲突,您将必须以相同的方式解决它。依此类推,直到既没有冲突需要解决,也没有承诺变基。


对于您的情况,您可能需要首先git rebase --abort重新开始,然后再次尝试重新设置基准。


tor*_*rek 5

您已经接受了答案,但让我添加这一点,并强调一下:

\n\n
\n

没有变化 - 您是否忘记使用“git add”?
\n 如果没有任何东西需要舞台,很可能其他东西
已经引入了相同的更改;您可能想跳过此补丁。

\n
\n\n

有时,当 rebase\xe2\x80\x94 意味着复制一系列提交\xe2\x80\x94 时,你会发现 Git 认为仍然需要的提交之一实际上是不需要的。

\n\n

例如,考虑一下这种情况:

\n\n
...--o--*--R--S--T   <-- master\n         \\\n          A--B--C   <-- feature\n
Run Code Online (Sandbox Code Playgroud)\n\n

(大写字母代表提交哈希 ID。较新的提交位于右侧。您已提交ABC更早的提交。)您已决定将git rebasefeaturemaster. 如果一切如你所愿,你最终会得到这样的结果:

\n\n
                   A\'-B\'-C\'  <-- feature (HEAD)\n                  /\n...--o--*--R--S--T   <-- master\n         \\\n          A--B--C   [abandoned]\n
Run Code Online (Sandbox Code Playgroud)\n\n

其中A\'类似于\xe2\x80\x94 A进行相同的更改,但是提交T而不是提交*\xe2\x80\x94andB\'类似于BC\'类似C

\n\n

因此,git rebase安排复制A、然后B、然后C。它在 处分离 HEAD(因此“处于分离模式”)T并执行第一个副本。如果一切顺利,您现在拥有:

\n\n
                   A\'  <-- HEAD\n                  /\n...--o--*--R--S--T   <-- master\n         \\\n          A--B--C   <-- feature\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

您现在开始解决冲突。检查第一个冲突,您会发现您所做的事情B已经由 commit 处理S,因此您从 中选择他们的代码T,这是由于他们在 中所做的更改S,而不是您从 中的代码B。检查第二个冲突,您会发现您所做的事情B已经由 commit 处理R,因此您再次获取他们的代码T。重复此过程,直到您解决了所有冲突,并且不对您自己的冲突进行任何更改B

\n\n

如果您现在运行:

\n\n
git rebase --continue\n
Run Code Online (Sandbox Code Playgroud)\n\n

你的 Git 会说:

\n\n
\n

没有变化 - 您是否忘记使用“git add”?

\n
\n\n

不,你没有忘记,你只是通过最终删除你的提交来解决所有冲突B。因此,上面的粗体文本建议适用,您只需运行:

\n\n
git rebase --skip\n
Run Code Online (Sandbox Code Playgroud)\n\n

告诉 Git:是的,完全放弃我的提交,然后立即尝试复制C 假设复制有效,变基将完成,您将拥有:

\n\n
                   A\'-C\'  <-- feature (HEAD)\n                  /\n...--o--*--R--S--T   <-- master\n         \\\n          A--B--C   [abandoned]\n
Run Code Online (Sandbox Code Playgroud)\n\n

这不太符合您最初的预期,但毕竟是您所需要的。

\n