我正在尝试自动化我的一些标准工作流程,我发现自己经常做的一件事就是将对远程主分支的更改合并到我自己的本地分支中并推送结果。
所以步骤如下:
我一直在尝试编写一个简短的python脚本,只需一个电话即可为我执行此操作,但我仍然坚持第4步。我无法理解the docs了解如何操作这个。
使用git.exe本身我只需这样做:git.exe merge master
这是否可以使用GitPython模块,如果是这样,应该怎么做?
答案 0 :(得分:6)
如果没有非常令人信服的理由,我建议您只使用git
二进制文件来执行您的任务。但是,如果您想使用GitPython执行此操作,请查看文档的Advanced Repo usage部分,其中包括示例合并操作。
例如,假设我有一个包含两个名为master
和feature
的分支的存储库。我目前在feature
分支上,我想合并来自master的更改。
我首先初始化一个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。