如果没有一个非常有说服力的理由,我会建议只使用git
二进制来执行您的任务。但是,如果您想使用GitPython执行此操作,请查看文档的Advanced Repo usage部分,其中包含示例合并操作。
例如,假设我有一个存储库,其中有两个分支名为master
和feature
。我目前在feature
分支上,并且我想合并来自主服务器的更改。
我开始通过初始化一个Repo
对象:
>>> import git
>>> repo = git.Repo('.')
现在我需要我的当前分支的参考;我可以这样做:
>>> current = repo.active_branch
>>> current
<git.Head "refs/heads/feature">
或者,我可以通过名字得到分支:
>>> current = repo.branches['feature']
>>> current
<git.Head "refs/heads/feature">
我还需要为master
分支的引用:
>>> master = repo.branches['master']
>>> master
<git.Head "refs/heads/master">
现在我需要找到这两个分支的合并基数(即 分歧点:
>>> base = repo.merge_base(current, master)
>>> base
[<git.Commit "9007141b5daa35c39afda2d6baf670438d7424a7">]
现在我们上演一场合并操作:
>>> repo.index.merge_tree(master, base=base)
<git.index.base.IndexFile object at 0x7fa8bb6a9f70>
并提交,提供前往两家母公司承诺:
>>> repo.index.commit('Merge master into feature',
... parent_commits=(current.commit, master.commit))
<git.Commit "fb7051d7be36b7998a8f6c480120f84f3f9d9f73">
>>>
在这一点上,我们已经成功地合并两个分支,但我们 有不是修改了工作目录。如果我们返回到shell 提示,git status
文件显示,file1
已被修改(因为 它不再匹配什么是在库):
$ git status
On branch feature
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: file1
我们需要执行新的结账承诺:
>>> current.checkout(force=True)
<git.Head "refs/heads/feature">
现在:
$ git status
On branch feature
nothing to commit, working directory clean
上述过程是脆弱的;如果存在合并冲突,那么这只是 即将爆炸,这就是为什么你可能最好坚持使用CLI的 。
谢谢;这真的很有用。即使您使用CLI,但在合并时可能会出现错误,因此您无论如何都要这样做,是否需要检查并处理合并冲突?或者是你上面提出的建议,甚至更危险? :-) –
我认为这不是危险的,但是'git' cli经过了严格测试,并且被设计成面向终端用户的工具,因此可以以更有用的方式对故障做出响应。 – larsks
好的,明白了。我想我可以使用你上面发布的内容,然后求助于解决与CLI的合并,最后,恢复我的脚本来完成最后几个命令。 –