无法解决rebase冲突

时间:2014-04-02 14:27:30

标签: git rebase git-rebase

foo:/opt/bar$ git status
# On branch develop
nothing to commit (working directory clean)

foo:/opt/bar$ git pull --rebase origin develop
From ssh://xxx/yyy
* branch develop -> FETCH_HEAD
First, rewinding head to replay your work on top of it...
Applying: Subscription logging added.
Using index info to reconstruct a base tree...
<stdin>:120: trailing whitespace.
* @return integer
<stdin>:143: trailing whitespace.
* @return integer
<stdin>:166: trailing whitespace.
* @return integer
<stdin>:189: trailing whitespace.
* @return integer
<stdin>:212: trailing whitespace.
* @return integer
warning: squelched 3 whitespace errors
warning: 8 lines add whitespace errors.
Falling back to patching base and 3-way merge...
Auto-merging app/config/config.yml
CONFLICT (content): Merge conflict in app/config/config.yml
Failed to merge in the changes.
Patch failed at 0001 Subscription logging added.

When you have resolved this problem run "git rebase --continue".
If you would prefer to skip this patch, instead run "git rebase --skip".
To check out the original branch and stop rebasing run "git rebase --abort".

foo:/opt/bar$ git status
# Not currently on any branch.
# Unmerged paths:
# (use "git reset HEAD <file>..." to unstage)
# (use "git add/rm <file>..." as appropriate to mark resolution)
#
# both modified: app/config/config.yml
#
no changes added to commit (use "git add" and/or "git commit -a")

foo:/opt/bar$ git add -A

foo:/opt/bar$ git status
# Not currently on any branch.
nothing to commit (working directory clean)

foo:/opt/bar$ git rebase --continue
Applying: Subscription logging added.
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.

When you have resolved this problem run "git rebase --continue".
If you would prefer to skip this patch, instead run "git rebase --skip".
To check out the original branch and stop rebasing run "git rebase --abort".

foo:/opt/bar$ git add -A

foo:/opt/bar$ git status
# Not currently on any branch.
nothing to commit (working directory clean)

foo:/opt/bar$ git rebase --continue
Applying: Subscription logging added.
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.

When you have resolved this problem run "git rebase --continue".
If you would prefer to skip this patch, instead run "git rebase --skip".
To check out the original branch and stop rebasing run "git rebase --abort".

foo:/opt/bar$

4 个答案:

答案 0 :(得分:40)

你走在正确的道路上。您只需要使用跳过您遇到问题的提交:

git rebase --skip

您已修复冲突,但与之前的提交相比,这没有任何变化。在这种情况下,你不能只是git rebase --continue,因为你告诉Git创建一个空提交,这是不允许的。

如果您对任何其他提交有冲突,您仍应使用git rebase --continue

当您不想在新生成的历史记录中包含某些提交时,--skip选项也很有用。

答案 1 :(得分:7)

git rebase --skip确实是正确的解决方案,除非有一种情况会被卡住,并且无法继续使用当前的rebase。

Git 2.0.2(2014年7月)修复了该错误:commit 95104c7brian m. carlson (bk2204)

rebase--merge:修复--skip连续两次冲突

  

如果git rebase --merge遇到冲突,如果下一次提交也存在冲突, --skip将无效。
  msgnum文件永远不会使用新的修补程序编号进行更新,因此实际上不会跳过任何修补程序,从而导致不可避免的循环。

     

msgnum文件的值更新为call_merge中的第一个值。
  这也避免了&#34; Already applied&#34;跳过提交时的消息   调用call_merge的其他上下文没有明显的变化,如   在这些情况下,msgnum文件的值保持不变。

答案 2 :(得分:1)

这篇文章帮助我解决了一个类似(如果不是相同的话)的问题,但是OP甚至没有提出任何问题。我知道从命令中可以很清楚地知道发生了什么,但是对于一个不太了解的人来说可能不是那么明显(我几乎只是不理会它),所以:

当您需要重新建立远程分支的基础时,将其命名为 myBranch ,(因为可以说您是几天前推送的,而其他开发人员击败了您并合并了此后的新更改),您可以合并到master(或任何目标分支),则必须重新设置基础。 Gitlab会说:

“无法快速合并。您必须先在本地进行基础调整。”

通常只需要:

git checkout master

git pull

git checkout myBranch

git rebase master

<修复问题,然后git add。>

git rebase --continue

但是在这种特殊情况下,git会告诉您您没有更改,并询问您是否忘记了“ git add”。因为您没有进行任何新的提交,所以您在myBranch中所做的更改已经提交(在其他位置),并且您希望复制旧的提交,因此在这里git rebase --skip是合适的。

希望能帮助像我这样的人,如果他们遇到这个问题并且非常想滚动到最深处!

答案 3 :(得分:0)

Git表示您解决的冲突在以后的提交中再次更改,并且在当前情况下您没有任何更改。 现在git不允许您继续进行基础操作,因为它无法创建空的提交。

如果现在执行git rebase --skip,则在下一次提交中更改该文件的操作将再次显示相同的冲突。

为避免这种情况,您可以使用以下方法手动提交: git commit --allow-empty,然后执行git rebase --skip

这将避免再次解决相同的冲突。