Git rebase - 即使所有合并冲突都已解决,也会继续抱怨

时间:2011-12-15 16:58:38

标签: git rebase

我正面临一个我不确定如何解决的问题。

我对我的分公司的主人做了一次反对:

git rebase master

并收到以下错误

 First, rewinding head to replay your work on top of it...
 Applying: checkstyled.
 Using index info to reconstruct a base tree...
 Falling back to patching base and 3-way merge...
 Auto-merging AssetsLoader.java
 CONFLICT (content): Merge conflict in AssetsLoader.java
 Failed to merge in the changes.
 Patch failed at 0001 checkstyled.

所以我去了我最喜欢的编辑器,修复了1行冲突,保存了文件并执行了git状态并获得了以下输出:

 # Not currently on any branch.
 # Changes to be committed:
 #   (use "git reset HEAD <file>..." to unstage)
 #
 #  modified:   PassengerContactHandler.java
 #
 # Unmerged paths:
 #   (use "git reset HEAD <file>..." to unstage)
 #   (use "git add/rm <file>..." as appropriate to mark resolution)
 #
 #  both modified:      AssetsLoader.java
 #

我做了一个git添加AssetsLoader.java和一个git状态并获得以下内容:

 # Not currently on any branch.
 # Changes to be committed:
 #   (use "git reset HEAD <file>..." to unstage)
 #
 #  modified:   AssetsLoader.java
 #  modified:   PassengerContactHandler.java
 #

当我做git rebase时 - 继续我得到:

git rebase --continue
You must edit all merge conflicts and then
mark them as resolved using git add

我知道我可以跳过补丁并继续使用rebase,但我不确定PassengerContactHandler.java中的更改是否会被重新绑定到我的分支中。

所以我不确定,我该怎么办?

编辑:可能是解决冲突的文件与原始版本完全相同吗?

非常感谢, 卢卡斯

编辑,它再次发生在我身上:

它再次发生在我身上,

(307ac0d...)|REBASE)$ git status
# Not currently on any branch.
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   modified:   assets/world/level1/Level-1.xml
#   modified:   George.java
#   modified:   DefaultPassenger.java
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#   mb-art/originalAssets/27dec/

((307ac0d ...)| REBASE)$ git rebase --continue

You must edit all merge conflicts and then
mark them as resolved using git add

git --version

git version 1.7.1

10 个答案:

答案 0 :(得分:87)

这是因为在修复冲突时,您删除了应用于您正在重新定位的分支的补丁程序中的所有代码。使用git rebase --skip继续。

更多细节:

通常,在重新定位期间修复冲突时,您将编辑冲突文件,将当前正在应用的修补程序中的部分或全部代码保留到您重新绑定的分支上。修复补丁并执行

git add your/conflicted/file
git status

你会看到一条(通常是绿色的)显示修改过的文件的行

  

已修改:您的/ conflictted / file

git rebase - 在这种情况下继续工作正常。

但是,有时候,在解决冲突时,您会删除新补丁中的所有内容,只保留您重新启用的分支中的代码。现在,当您添加文件时,它将与您尝试重新绑定的文件完全相同。 git status将不显示显示已修改文件的绿线。现在,如果你这样做

git rebase --continue

git会抱怨

  

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

在这种情况下,你真正想要做的是使用

git rebase --skip

跳过补丁。以前我从来没有这样做,因为我总是不确定如果我这样做会实际跳过什么,对我来说,“跳过这个补丁”真的意味着什么并不明显。但如果你没有得到绿线

  

已修改:您的/ conflictted / file

编辑冲突的文件,添加它并执行git状态后,你可以非常确定你删除了整个补丁,你可以改为使用

git rebase --skip

继续。

  

原帖说这有时会奏效:

git add -A
git rebase --continue
# works magically?

...但不要依赖于此(并确保不在存储库文件夹中添加剩余文件)

答案 1 :(得分:19)

Seems to be a bug in Git 1.7

Here's a good article on how to solve this

基本上它应该有效,如果你做了

git diff

解决冲突然后

git rebase --continue

应该有用。

答案 2 :(得分:4)

尝试在命令行中运行它:

$ git mergetool

应该打开一个交互式编辑器,让您解决冲突。比手动尝试更容易,并且git会在您进行合并时识别。还可以避免在您尝试手动执行时不会意外完全合并的情况。

答案 3 :(得分:4)

我刚刚遇到这个问题,虽然我认为可能有一些原因,但这是我的......

我有一个git pre-commit钩子,它在某些条件下拒绝了提交。手动提交时这很好,因为它会显示挂钩的输出,我可以修复它,也可以选择使用commit --no-verify忽略它。

问题似乎是在重新定位时,rebase --continue也会调用钩子(为了提交最新的更改)。但是rebase不会显示钩子输出,它只会看到它失败,然后吐出一个不太具体的错误,说“你必须编辑所有合并冲突,然后使用git add'将它们标记为已解决”

要修复它,请暂停所有更改,而不是执行'git rebase --continue',尝试'git commit'。如果您遇到相同的钩子问题,那么您应该看看它失败的原因。

有趣的是,虽然git rebase不显示git hook的输出,但它确实接受了--no-verify来绕过钩子。

答案 4 :(得分:3)

您错过了AssetsLoader.java中的合并冲突。打开它并查找冲突标记(“&gt;&gt;&gt;&gt;”,“====”,“&lt;&lt;&lt;&lt;&lt;&lt;”),然后再次执行git add。如果你很难找到它,那就做一个'git diff --staged'。

答案 5 :(得分:2)

修复冲突后,请确保已更改的文件已添加到暂存文件中。这解决了我的问题。

答案 6 :(得分:2)

一旦修复了更改,您可能会忘记运行'git add -A'

git add -A
git rebase --continue

答案 7 :(得分:1)

我只是偶然发现了这个问题。我不会git rebase --skip 因为git status清楚地显示了修改标记,我想保留这些修改。虽然我有一些多余的文件,但出乎意料。我用

解决了
git checkout .

要删除未标记的修改,则git rebase --continue成功。

答案 8 :(得分:0)

取消暂存文件时收到此警告。确保您没有任何未暂存的文件。如果您不想更改未暂存的文件,请使用git rm <filename>放弃更改。

答案 9 :(得分:0)

如果您使用的是magit(git的流行emacs前端),则由于magit中存在一个模糊的错误,因此可能会显示此错误消息。我不确定是什么触发了此错误,但对我而言,只是文件的行尾已更改,因此magit不会将文件显示为冲突。所以我认为没有冲突了,但是有。在命令行上运行git status可以看到冲突的文件,然后可以运行git add 文件名,然后运行git rebase --continue