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。较新的提交在右边。您之前提交了 A
、B
和 C
。)您已经决定要 git rebase
你的 feature
到你的 master
。如果一切如你所愿,你会得到这样的结果:
A'-B'-C' <-- feature (HEAD)
/
...--o--*--R--S--T <-- master
\
A--B--C [abandoned]
其中 A'
与 相似 A
— 它进行相同的 更改 ,但要提交 T
而不是提交 *
——B'
就像 B
而 C'
就像 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]
这不是你最初的期望,但毕竟是你需要的。
我在我的功能分支 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。较新的提交在右边。您之前提交了 A
、B
和 C
。)您已经决定要 git rebase
你的 feature
到你的 master
。如果一切如你所愿,你会得到这样的结果:
A'-B'-C' <-- feature (HEAD)
/
...--o--*--R--S--T <-- master
\
A--B--C [abandoned]
其中 A'
与 相似 A
— 它进行相同的 更改 ,但要提交 T
而不是提交 *
——B'
就像 B
而 C'
就像 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
.
如果你现在运行:
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]
这不是你最初的期望,但毕竟是你需要的。