如何使用 GitPython 将 master 分支合并到 feature 分支?

How do you merge the master branch into a feature branch with GitPython?

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

所以步骤如下:

  1. 转主
  2. 从远程拉取更改
  3. 切换到原始功能分支
  4. 从主分支合并到功能分支
  5. 将功能分支推送到远程

我一直在尝试编写一个简短的 python 脚本来通过一次调用为我完成此操作,但我卡在了第 4 步。我无法理解 the docs找出如何做到这一点。

使用 git.exe 本身我会简单地这样做:git.exe merge master

使用 GitPython 模块是否可能?如果可以,应该如何操作?

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

例如,假设我有一个包含两个分支的存储库,分别名为 mainfeature。我目前在 feature 分支,我想合并来自 main.

的更改

我首先初始化一个 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">

我还需要 main 分支的引用:

>>> main = repo.branches['main']
>>> main
<git.Head "refs/heads/main">

现在需要找到这两个分支的合并基(即 它们的分歧点:

>>> base = repo.merge_base(current, main)
>>> base
[<git.Commit "9007141b5daa35c39afda2d6baf670438d7424a7">]

现在我们进行合并操作:

>>> repo.index.merge_tree(main, base=base)
<git.index.base.IndexFile object at 0x7fa8bb6a9f70>

并提交它,提供两个父提交的链接:

>>> repo.index.commit('Merge main into feature',
... parent_commits=(current.commit, main.commit))
<git.Commit "fb7051d7be36b7998a8f6c480120f84f3f9d9f73">
>>> 

至此,我们已经成功合并了两个分支,但是我们 没有修改工作目录。如果我们 return 到 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。

合并 source_branchdest_branch:

def merge(source_branch, dest_branch):
    repo = git.Repo(repository_path)
    repo.git.checkout(dest_branch)
    repo.git.merge(source_branch)
    origin = repo.remote(name='origin')
    origin.push()