如果沒有一個非常有說服力的理由,我會建議只使用git
二進制來執行您的任務。但是,如果您想使用GitPython執行此操作,請查看文檔的Advanced Repo usage部分,其中包含示例合併操作。
例如,假設我有一個存儲庫,其中有兩個分支名爲master
和feature
。我目前在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的 。
謝謝;這真的很有用。即使您使用CLI,但在合併時可能會出現錯誤,因此您無論如何都要這樣做,是否需要檢查並處理合並衝突?或者是你上面提出的建議,甚至更危險? :-) –
我認爲這不是危險的,但是'git' cli經過了嚴格測試,並且被設計成面向終端用戶的工具,因此可以以更有用的方式對故障做出響應。 – larsks
好的,明白了。我想我可以使用你上面發佈的內容,然後求助於解決與CLI的合併,最後,恢復我的腳本來完成最後幾個命令。 –