Git合并失败意外

时间:2017-05-04 19:57:53

标签: python git branching-and-merging merge-conflict-resolution git-merge-conflict

我已经在Python中实现了自动合并脚本。如果存在一些合并冲突,它应该自动合并分支并创建拉取请求。

我的部分脚本如下:

from subprocess import check_call, CalledProcessError

# E.g. destination_branch = "master", source_branch = "release"
try:
    check_call(['git', 'checkout', '%s' % destination_branch])
    check_call(['git', 'merge', '--no-ff', '%s' % source_branch])
except CalledProcessError:
    # Creating pull request.

看起来一切都很好,但这里有一些问题。 经过一些自动合并后,我遇到了以下错误: error: you need to resolve your current index first Dockerfile: needs merge。我也打印这两步的状态码。状态代码为1,这不好。

因此,我可以看到太多拉取请求,其中大部分都没有任何合并冲突。

这里有什么问题?

更新

在合并之前我还有一些用于分支更新的东西(以保持最新版本)。 它看起来像:

try:
    check_call(['git', 'checkout', str(source_branch)])
    # branch successfully checked out
    check_call(['git', 'pull', 'origin', str(source_branch)])
except CalledProcessError:
    # Logging an errors.

要添加一件重要的事情:

正如小伙子们:@torek,@ MarkAdelsberger在评论中提到的那样,我也尝试过他们的解决方案,因为某些原因合并失败后添加了git merge --abort命令。 所以,它没有任何帮助。它失败并出现另一个错误: check_call([GIT_CMD, 'merge', '--abort']) File "/usr/lib/python2.7/subprocess.py", line 540, in check_call raise CalledProcessError(retcode, cmd) subprocess.CalledProcessError: Command '['git', 'merge', '--abort']' returned non-zero exit status 128

所以,我正在寻找一些解决方案......

想法?

1 个答案:

答案 0 :(得分:3)

you need to resolve your current index first形式的错误消息意味着您之前已经开始定期(非快进)合并,但它因合并冲突而失败。

git merge因合并冲突而失败时,Git会生成状态1退出。如果特定的失败合并作为代码的一部分发生,check_call代码将引发CalledProcessError,但我们所知道的是,之前存在这样一个失败的合并,而不是它发生在这里:

subprocess.CalledProcessError: Command '...' returned non-zero exit status 1

一旦发生这种情况 - 无论是作为Python代码的一部分,还是通过其他方式 - 存储库的工作树和索引都留在了这个"合并失败,需要手部处理"州。如果您事先不知道存储库的状态,则应在开始之前找到它,例如,使用git status --porcelaingit status --porcelain=v2(请参阅the documentation for git status;注意此Web版本不显示新的v2格式,这是在Git 2.11中首次发布的。

如果 将工作树和索引放入此部分合并,中间,需要处理状态并希望将其恢复到合并前状态,只需运行{{1 }}。不要尝试来自这个半大的 1 状态的提交或拉取请求:合并必须完成或完全中止。

除此之外:git merge --abort很愚蠢,如果已知它是一个字符串,只需使用'%s' % exprstr(expr)本身。

1 Say" half-vast"大声,三次,快。 : - )