由于空格错误,git rebase 失败

26
我正在尝试对一个分支进行变基操作,但 git 出了问题,因为它试图执行一些合并操作,但失败了。如何让 git 停止这个行为?

我正在尝试对一个分支进行变基操作,但 git 出了问题,因为它试图执行一些合并操作,但失败了。如何让 git 停止这个行为?

# git rebase -f --onto master~2 master~ master
First, rewinding head to replay your work on top of it...
Applying: r1002 - CS 1.0.23
Using index info to reconstruct a base tree...
M   about.html
<stdin>:68: trailing whitespace.                     
<stdin>:115: trailing whitespace.
<stdin>:201: trailing whitespace.
<stdin>:2369: trailing whitespace.
<stdin>:2385: trailing whitespace.
warning: squelched 2305 whitespace errors
warning: 2310 lines add whitespace errors.
Falling back to patching base and 3-way merge...
Auto-merging about.html
CONFLICT (content): Merge conflict in about.html
Failed to merge in the changes.
Patch failed at 0001 r1002 - 1002
The copy of the patch that failed is found in:
   /local/melder/tmp/test/.git/rebase-apply/patch

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

正如你所看到的,有2000多个空格错误,不是容易手动合并的。

编辑:为了暂时回避这个问题而不合并,我做了:

# git add -A
# git rebase --continue

编辑:算了,那是一个傻主意。

4个回答

26

今天我遇到了同样的问题:由于空格错误导致rebase失败。在尝试不同的whitespace选项设置失败后(git rebase --whitespace=fixgit rebase --whitespace=nowarn),对我有效的解决方案是在递归合并策略中忽略尾随空格错误(如果需要的话,先使用git rebase --abort 中止任何正在运行的rebase):

git rebase -Xignore-space-at-eol <newbase>

根据空格错误的类型,选项-Xignore-space-change-Xignore-all-space可能更有用。我不知道选项--ignore-whitespace是否也能起作用。


“--ignore-whitespace” 对我没有起作用 - 它返回的结果与没有使用该参数时完全相同。 但是,“-Xignore” 参数也没有起作用 - 它们让我面临着相同的合并冲突,但没有提示存在空格问题。 - andrew lorien
1
@andrewlorien 你确定那些冲突是由于空格错误引起的,还是真正的代码冲突?我的评论只适用于第一种情况。 - joanpau
好问题,谢谢。我现在已经手动修复了错误,但我怀疑这些错误是空格和真正的错误混合在一起。我认为--ignore-whitespace没有帮助,但我认为-Xignore-space-at-eol实际上忽略了空格问题,让我去解决同一行上的其他问题。 - andrew lorien

5

这将不会回避问题。你现在的文件中有冲突标记!

空格问题是警告,你不应该有太多合法的冲突。如果这个文件很难解决,你可能需要手动重构它。不过这取决于你正在做什么。

很多时候,两个基础版本差别很大,每次rebase提交都会让你处理这个庞大的冲突。我倾向于避免使用rebase工作流程,而是选择merge/reset。这是我的做法:http://dymitruk.com/blog/2012/02/05/branch-per-feature/

如果你的问题只是空格问题,比如行尾符号,你可以尝试通过对每一侧进行filter branch或交互式rebase来清理你的代码库,以使每个提交的空格保持一致。

此外,我使用Beyond Compare 3或Perforce Merge来解决冲突。BC3是语法感知的,应该能够最好地处理空格。很多时候,它甚至不需要打开,因为它会为你解决冲突,你只需继续即可。


2
嗯...你说得对,那样不好。我尝试使用rebase -X theirs策略,它起作用了。问题是我正在尝试自动化这个rebase过程。我相信仓库中不应该有真正的冲突,空格错误可能是由于unix/windows移动引起的。如果可能的话,我想绕过这个问题。 - melder

2

今天我用以下方法解决了这个问题:

REMOVE_AFTER="3cd7a0db76ff9dca48979e24c39b408c"
REPO="git@github.com:company/repo.git"
cd ~/tmp
git clone $REPO gitfix
cd gitfix
git checkout --orphan temp $REMOVE_AFTER
git commit -m "Truncated history"
git rebase --strategy=recursive --strategy-option=theirs --onto temp $REMOVE_AFTER master

当你在变基过程中遇到一个由于文件被删除引起的CONFLICT (modify/delete)冲突时,可以按照以下方式解决:

git rm path/to/both/deleted/file
git rebase --continue

当在rebase过程中遇到其他冲突时,您需要手动修复它,之后:

git add path/to/conflict/file
git rebase --continue

当你完成后,变基会显示 All done. 然后你可以:
git branch -D temp

现在检查结果:
git log --format=oneline

REMOVE_AFTER 指的是哪个分支/更改? - Ed Randall
2
@EdRandall 我不太记得了。我猜我的修复是为了解决因为一个已删除的文件而引起的冲突。所以我猜REMOVE_AFTER是在这些冲突提交之后的git提交。 - Jeroen Vermeulen - MageHost

1

我认为大多数的 diff 查看器(特别是带有 GUI 的)都可以让你选择如何处理空格变化。

我建议你使用像 meld 这样的工具作为你的 git mergetool 来自动纠正这些冲突。当启动 meld 时,设置它的空格处理策略(从 Preferences 面板的 Text filters 选项卡中),它将自动调整这些变化。


谢谢您的回复,但我想自动化这个过程。我正在处理非常大的代码库,由于开发人员在不同的系统上工作并将代码移动到各种操作系统中,因此存在空格问题。当我们有数百个仓库和其中数千个空格不一致时,让我去合并每个仓库是不切实际的。 - melder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接