2016-04-22 84 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的合併,最後,恢復我的腳本來完成最後幾個命令。 –