如何将主分支合并到GitPython的功能分支中?

时间:2016-04-22 16:50:19

标签: python git gitpython

我正在尝试自动化我的一些标准工作流程,我发现自己经常做的一件事就是将对远程主分支的更改合并到我自己的本地分支中并推送结果。

所以步骤如下:

  1. 切换到主人
  2. 从远程拉
  3. 切换到原始功能分支
  4. 从master合并到功能分支
  5. 将功能分支推送到远程
  6. 我一直在尝试编写一个简短的python脚本,只需一个电话即可为我执行此操作,但我仍然坚持第4步。我无法理解the docs了解如何操作这个。

    使用git.exe本身我只需这样做:git.exe merge master

    这是否可以使用GitPython模块,如果是这样,应该怎么做?

1 个答案:

答案 0 :(得分:6)

如果没有非常令人信服的理由,我建议您只使用git二进制文件来执行您的任务。但是,如果您想使用GitPython执行此操作,请查看文档的Advanced Repo usage部分,其中包括示例合并操作。

例如,假设我有一个包含两个名为masterfeature的分支的存储库。我目前在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。