2016-04-22 86 views
2

我试图自动化我的一些标准工作流程,并且我发现自己经常做的一件事是将远程主分支的更改合并到我自己的本地分支中并推送结果。如何将主分支与GitPython合并成一个功能分支?

所以步骤如下:

  1. 切换到主从远程
  2. 开关
  3. 拉改变原始特征分支从主
  4. 合并成特征分支
  5. 推送特性分支到远程

我一直在试图写一个简短的Python脚本来为我做一个单一的调用,但我卡在第4步。我无法理解the docs解决如何做到这一点。

使用git.exe本身我只想做到这一点:git.exe merge master

这可能使用的GitPython模块如果是的话,怎么办呢?

回答

4

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

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

+0

谢谢;这真的很有用。即使您使用CLI,但在合并时可能会出现错误,因此您无论如何都要这样做,是否需要检查并处理合并冲突?或者是你上面提出的建议,甚至更危险? :-) –

+0

我认为这不是危险的,但是'git' cli经过了严格测试,并且被设计成面向终端用户的工具,因此可以以更有用的方式对故障做出响应。 – larsks

+0

好的,明白了。我想我可以使用你上面发布的内容,然后求助于解决与CLI的合并,最后,恢复我的脚本来完成最后几个命令。 –