Git rebase 出错(“无法应用...”)

57

我是https://github.com/plison/opendial GitHub 仓库的管理员。我希望减少该仓库的提交次数,因为该仓库已经有几千个提交,其中许多是可以轻松合并在一起的小型调试更改(特别是那些几年前的更改)。

因此,我正在尝试应用变基以便将我的提交合并在一起。然而,我遇到了以下问题:

  1. 当我输入例如 git rebase -i HEAD~10 时,交互式编辑器中会出现相当多的提交行(远大于 10 行)。可能的原因是什么?
  2. 更重要的是,一旦我关闭交互式编辑器以开始变基,我就会系统地收到错误消息 "error:could not apply ',即使我没有对提交进行任何更改(即如果我将所有行保留为 “pick”,不进行任何修改或重新排序)。

如何解决这些问题?应该注意到,该仓库是从之前托管在 Google Code 上的一个(SVN)仓库自动导入的。到目前为止转换似乎已经很顺利,但我想知道为什么在尝试变基提交时出现这些错误。


3
不要这样做,这是一个糟糕的主意。原因请参见:http://superuser.com/a/667200/83759,而《Pro Git》一书则表示:“通常情况下,既要获取最佳效果,又要清理提交历史,应该在推送之前先变基本地修改的内容,但绝不能对已经提交到其他地方的内容进行变基。”(https://git-scm.com/book/en/v2/Git-Branching-Rebasing) - Stuart Grassie
2个回答

82

作为自己如何解决这个问题的提醒:

错误信息并不是很有信息量。如果您键入

git rebase --continue

你意识到错误是由于合并冲突而导致的,Git 不能自行解决它,需要你的帮助。

要查看哪些文件存在冲突,请键入

git status

在你喜欢的编辑器/IDE中解决合并冲突(提示:应该以i开头,以ntelliJ结尾)

使用标记进行解决

git add .
如果所有冲突都已解决,您应该看到类似于此的内容:
如果所有冲突都被解决,你应该会看到类似这样的东西:
(all conflicts fixed: run "git rebase --continue")

所以继续进行你的变基操作:

git rebase --continue

希望您的变基现在应该成功了

git status

展示:

On branch feature/DIG-19302-Upgrade-mockito-v2
Your branch is behind 'origin/feature/your-feature-branch' by 2 commits, and can be fast-forwarded.
(use "git pull" to update your local branch)

nothing to commit, working directory clean

不要执行git pull操作,如果执行,你只会覆盖你的合并冲突。相反,将你的合并冲突解决方案推送到分支上。

git push --force

完成了!您的 git 日志现在应该只显示 1 个提交(即您刚刚强制更新的提交)


最后一点非常关键。我试图进行git push,但出现了过期错误,然后执行了git pull,再次合并文件。使用git push --force解决了我的问题。 - Jose Gómez
11
我有点好奇,哪种语言的编辑器以i开头、以ntelliJ结尾? - Shuklaswag
@Shuklaswag 说得好。我曾经把 IntelliJ 集成为我的 Git 编辑器,但现在只用 Vim 了。 - Somaiah Kumbera
1
“git add .” 这个命令是不好的。git rebase/merge 通常会为发生冲突的文件创建“.orig”文件,这将导致连这些文件也一起加入暂存区。你只需要在那些你真正想提交的文件上执行“git add”命令即可。 - Pavan Manjunath
奇怪的是,只有git rebase --continue命令对我起作用。 - Declan McKenna

22

你的项目历史记录最近似乎包含了一些合并提交(可能是你自己做的)。在交互式变基中存在合并提交通常会引起问题。(交互式变基几乎假定是线性历史,但合并提交不是线性的。)

你的项目历史记录还以某种方式有两个并行的历史记录,在提交11b3653中合并在一起(使用像gitktig这样的工具来查看,Github的Web界面上显示不好)。

我建议你先尝试平铺你的历史记录,摆脱并行的历史记录,并删除合并提交。然后,一旦你有了严格的线性历史记录,你就可以开始重写历史记录,以消除所有的调试混乱。


9
有趣的是,大多数将 Git 历史平整化的答案都建议使用 Git rebase,但使用 Git rebase 来解决 Git rebase 的错误会让事情变得复杂 :) 我想将提交分组为几个组,唯一的选择似乎是使用带有原始提交作者的 Git squash merge。 - kodstark

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