4

我在我的功能分支上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 以开发分支后,我应该怎么做?

4

2 回答 2

4

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

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

一旦你编辑了冲突文件,你必须添加它们,然后提交,只有这样你才能git rebase --continue. 这是一个例子:

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

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


在您的情况下,您可能需要首先git rebase --abort获得一个干净的石板,然后再次尝试重新设置基准。

于 2019-08-08T12:52:01.007 回答
4

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

没有变化 - 你忘记使用 'git add' 了吗?
如果没有任何东西可以上演,很可能其他东西
已经引入了相同的变化;你可能想跳过这个补丁。

有时,在变基时——这意味着复制一系列提交——你会发现 Git 认为仍然需要的一个提交,实际上是不需要的。

例如,考虑这种情况:

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

(大写字母代表提交哈希 ID。较新的提交在右侧。您提交了ABC更早的内容。)您已经决定要在您git rebase的. 如果一切都如您所愿,您将得到以下结果:featuremaster

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

where A'is like A ——它进行相同的更改,但提交T而不是提交*——并且B'is likeBC'is like C

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

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

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

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

如果你现在运行:

git rebase --continue

你的 Git 会说:

没有变化 - 你忘记使用 'git add' 了吗?

不,您没有忘记,您只是通过最终放弃提交来解决所有冲突B。所以上面的粗体建议适用,你可以运行:

git rebase --skip

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

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

这与您最初的预期不太一样,但毕竟是您所需要的。

于 2019-08-08T17:35:29.717 回答