使用git am应用patch时出现错误

4

当我尝试使用以下命令进行补丁操作:

git am 0001-someFile.patch

但是我遇到了这个错误:
error: patch failed: src/***/file.c:459
error: src/***/file.c: patch does not apply
Patch failed at 0001 someFile.patch
When you have resolved this problem run "git am --resolved".
If you would prefer to skip this patch, instead run "git am --skip".
To restore the original branch and stop patching run "git am --abort".

我正在尝试手动合并冲突,使用的方法是:

git mergetool --tool=meld

但我得到了:

No files need merging

我该如何解决这个问题? 我能获取到出错的文件名,但不知道具体行数(这是一个很大的文件)。

也许有更好的方法来执行此类修补操作?


git status 命令告诉你什么?它是否显示任何未合并的条目?如果没有,那么补丁可能是如此“不适用”,以至于它失败不是因为存在任何合并冲突,而是因为所有块都无法应用 - 例如,找不到每个块的上下文。 - kostix
2个回答

1
我负责处理工作中的所有补丁。我已经遇到过很多次这种情况,一个补丁无法合并。发生这种情况的原因是主分支有变更,而该补丁没有考虑到这些变更,导致无法正确打补丁。根据我的经验,这可能由以下几个原因引起:
  • 制作补丁的人未能拉取主分支并将主分支重新基于他们的开发分支。
  • 在制作者拉取代码和应用补丁之间,主分支进行了足够多的更改,导致补丁无法应用,因为产生了太多的冲突。
  • 制作者错误地打了补丁。

以下是我最成功的流程。(假设制作者正在开发除主分支以外的其他分支)

  1. 确保您已添加所有文件并提交了所有更改。
  2. git checkout master
  3. git pull
  4. git checkout {开发分支}
  5. git rebase master(这将使开发分支与主分支同步)
  6. git checkout -b {提交分支} master
  7. git merge --squash --no-commit {开发分支}
  8. git commit -am“提交评论”(注意:此提交评论将是补丁的名称)
  9. git format-patch origin..HEAD

这样可以确保您的补丁与原始主分支保持最新状态。发送该补丁,希望在主分支进行太多更改之前应用该补丁。


0

你需要进行三路合并:

  git am -3 0001-someFile.patch

  git mergetool -t meld

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