如何使用 GitPython 将 master 分支合并到 feature 分支?
How do you merge the master branch into a feature branch with GitPython?
我正在尝试自动化我的一些标准工作流程,我发现自己经常做的一件事是将对远程 master 分支的更改合并到我自己的本地分支并推送结果。
所以步骤如下:
- 转主
- 从远程拉取更改
- 切换到原始功能分支
- 从主分支合并到功能分支
- 将功能分支推送到远程
我一直在尝试编写一个简短的 python 脚本来通过一次调用为我完成此操作,但我卡在了第 4 步。我无法理解 the docs找出如何做到这一点。
使用 git.exe 本身我会简单地这样做:git.exe merge master
使用 GitPython 模块是否可能?如果可以,应该如何操作?
如果没有非常令人信服的理由,我建议只使用 git
二进制文件来执行您的任务。但是,如果您想使用文档的 GitPython, take a look at the Advanced Repo usage 部分执行此操作,其中包括示例合并操作。
例如,假设我有一个包含两个分支的存储库,分别名为 main
和 feature
。我目前在 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_branch
到 dest_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()
我正在尝试自动化我的一些标准工作流程,我发现自己经常做的一件事是将对远程 master 分支的更改合并到我自己的本地分支并推送结果。
所以步骤如下:
- 转主
- 从远程拉取更改
- 切换到原始功能分支
- 从主分支合并到功能分支
- 将功能分支推送到远程
我一直在尝试编写一个简短的 python 脚本来通过一次调用为我完成此操作,但我卡在了第 4 步。我无法理解 the docs找出如何做到这一点。
使用 git.exe 本身我会简单地这样做:git.exe merge master
使用 GitPython 模块是否可能?如果可以,应该如何操作?
如果没有非常令人信服的理由,我建议只使用 git
二进制文件来执行您的任务。但是,如果您想使用文档的 GitPython, take a look at the Advanced Repo usage 部分执行此操作,其中包括示例合并操作。
例如,假设我有一个包含两个分支的存储库,分别名为 main
和 feature
。我目前在 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_branch
到 dest_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()