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


115

我面临着不确定如何解决的问题。

我对分支机构的master进行了基准调整:

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 status并获得以下输出:

 # 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 add AssetsLoader.java和一个git status并得到以下内容:

 # 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

我知道我可以跳过补丁并继续进行变基,但是我不确定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-继续

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

git --version

git version 1.7.1

这是的完整输出git status,对不对?下面没有缺失的部分吗?
卡斯卡贝尔2011年

git-rebase如果没有冲突,则永远不要报告存在未解决的冲突。如果您可以在更简单的测试案例中设法重现该问题,则调试起来会容易得多,但是,如果您git status报告这样做时没有冲突git rebase --continue,并且您的Git版本是最新的,则可以尝试向Git开发人员发送电子邮件git@vger.kernel.org上的邮件列表,其中包含尽可能多的诊断信息。
卡斯卡贝尔2011年

1
(307ac0d ...)| REBASE)$ git status#目前不在任何分支上。#要提交的更改:#(使用“ git reset HEAD <文件> ...”取消登台)##修改:assets / world / level1 / Level-1.xml#修改:George.java#修改:DefaultPassenger.java ##未跟踪的文件:#(使用“ git add <文件> ...”包含在将提交的内容中)##mb-art / originalAssets / 27dec /
卢卡斯(Lucas)

我认为您应该使用GITKRAKEN,它将帮助您解决冲突
Nikhil Bhardwaj

Answers:


115

发生这种情况的原因是,在解决冲突时,您删除了应用到要作为基础的分支的补丁程序中的所有代码。使用git rebase --skip继续。

更多细节:

通常,在重新定型期间解决冲突时,您将编辑冲突文件,将修补程序中的部分或全部代码保留在当前应用于您所依据的分支的代码中。修复补丁并执行后

git add your/conflicted/file
git status

您将看到一条(通常为绿色)显示修改过的文件的行

修改:您的/冲突的/文件

git rebase --continue在这种情况下可以正常工作。

但是,有时候,解决冲突时,您会删除新补丁中的所有内容,仅保留您所基于的分支中的代码。现在,当您添加文件时,它将与您尝试作为基础的文件完全一样。git status将不显示绿线,显示已修改的文件。现在,如果你这样做

git rebase --continue

git会抱怨

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

git在这种情况下实际上希望您使用的是

git rebase --skip

跳过补丁。以前我从来没有这样做过,因为我一直不确定如果这样做会实际跳过什么,对我来说“跳过此补丁”的真正含义并不明显。但是如果你没有绿线

修改:您的/冲突的/文件

在编辑冲突的文件,添加它并执行git status之后,可以确定删除了整个补丁,而可以使用

git rebase --skip

接着说。

原始帖子说这有时可行:

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

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


1
我似乎有相同的问题和相同的解决方案,也似乎很神奇!
bspink

我遇到了同样的问题,似乎如果您在重新定位的分支中进行了重构并添加了新文件,然后合并解析过程对这些新文件进行了更改,则需要显式地再次添加它们。
Ibrahim

除非您要跟踪所有垃圾文件到您的存储库,否则不要这样做。
杰德·林奇

git add ...更改具有长路径的文件堆后,键入它会变得非常烦人。有没有git add --all-the-files-i-changed我可以先运行git rebase continue
jozxyqk

3
使用命令git rebase --skip时要小心,您可能会丢失工作(已编辑文件)
Youness Marhrani


8

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

git rm <filename>  

1
如此简单,可能只是评论;很有帮助,应该是一个答案。谢谢!
卢卡斯·利马

4

尝试在命令行中运行此命令:

$ git mergetool

应该调出一个交互式编辑器,让您解决冲突。比尝试手动操作更容易,并且git会在您进行合并时识别。还将避免在您尝试手动进行合并时不会偶然完全合并的情况。


刚刚发现这可能会更容易,并且将来也可以避免这种情况。
巴特金斯2011年

1
你救了我的夜晚。尽管它是一个简单的工具,但是如果没有该工具,我将永远无法解决如何解决我的冲突。
2017年

4

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


这对我有用。在收到OP中描述的消息后,我检查了Sourcetree,然后立即看到命令窗口中提到的两个文件处于未暂存状态。暂存文件,运行“ git rebase --continue”,我回到了正轨。
Mass Dot Net

3

您错过了AssetsLoader.java中的合并冲突。打开它并查找冲突标记(“ >>>>”,“ ====“,“ <<<<<”),然后再次执行git add。如果您找不到它,请执行“ git diff --staged”。


3
我对所有跟踪的文件进行了grep操作,没有冲突标记。
卢卡斯

git diff --staged透露任何有用吗?这表明您将要提交的更改以解决此时在基准库中的合并冲突。其中一个文件中应该有一个“哎呀,这不是我打算解决的问题”位。
以太

4
尝试继续时,Git不会寻找合并冲突标记。它只是检查索引是否处于干净状态。如果暂存的文件中仍带有冲突标记,则表示您要在其中包含它们的情况下提交该文件。这可能总是一个错误,但是它将让您做到这一点。
卡斯卡贝尔2011年

@Ether根本不是原因。您git add甚至可以在其中包含冲突标记的文件。毕竟,此类文件可能完全合法!
fge11年

@Jefromi:哈,很高兴知道!我一直以为标记是经过检查的,如果故意的话,就需要强行通过它。
以太

3

我只是遇到了这个问题,尽管我认为可能有一些原因,但这是我的...

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

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

要解决此问题,请分阶段进行所有更改,而不要执行“ git rebase --continue”,请尝试执行“ git commit”。如果您遇到相同的挂钩问题,则应查看失败的原因。

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


1
我有一个类似的问题。这里没有什么对我有用,但只要执行“ git commit”然后中止操作,就可以神奇地解决存在的任何差异,然后我就能够成功地“ git rebase --continue”。
patrickvacek 2012年

仅作记录,正如我最近一直在努力解决类似问题一样,我git rebase接受--no-verify选择。但是,它仅省略了该pre-rebase钩子,但此选项不适用于后续对的调用git commit
pkrysiak '16

包含有效点(提交更改),但太冗长,无法很好地回答。
杰克·米勒

1

我只是偶然发现了这个问题。我不会git rebase --skip 因为git status清楚地显示出我想保留的修改而被保留。虽然我有一些意外的额外文件。我解决了

git checkout .

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


1

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

git add -A
git rebase --continue
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.