2016-09-22 42 views
4

我想結合兩個不合爲一的提交。有沒有正確的方法來組合兩個不正確的提交?

例如,如果我執行命令git rebase -i HEAD~3

pick 8h47n1f Update documentation and release-notes #a 
pick 8n32b7a Implemented some random function  #b 
pick a73ncj1 Update documentation and release-notes #c 

結合線a和c成一個推動之前提交。

我實現這個電流的方法是重新排序我犯以下方式:

pick 8h47n1f Update documentation and release-notes #a 
squash a73ncj1 Update documentation and release-notes #c 
pick 8n32b7a Implemented some random function   #b 

到目前爲止,我還沒有看到任何危險的副作用。有沒有人知道我是否可以通過這樣做來破壞某些東西?有沒有更好,更安全的方法來完成我想要完成的任務?

+0

也許合併? –

回答

3

這是實現它的最好方法(和afaik唯一方法)。你無法做任何無法恢復的事情(例如,你總是可以放棄衝突過程中的重組過程)。

2

交互式重定位(git rebase -i)所呈現的列表簡單來說就是一個用於自動執行櫻桃挑選的腳本。該列表是完全可編輯的,甚至可以刪除所有內容並編寫一個全新的完全不同的列表。 Git將只檢出基本提交,然後按順序執行列表命令。

有一種方法可以自動對列表中的提交進行重新排序:使用autosquash。從git-rebase文檔:

--autosquash 
--no-autosquash 

當犯了日誌信息開始「!南瓜......」(或「!修正內容...」),並有一個承諾,其標題以相同...... 使得標記爲擠壓提交 來自右後承諾進行修改,並且移動後的變化 動作提交從picksquash(或fixup)自動地修改底墊-i的待辦事項列表。 在第一次後忽略後續的「fixup!」或「squash!」,以防 您提到之前的修復/壁球git commit --fixup/--squash

此選項僅在使用--interactive選項時有效。

如果--autosquash選項默認情況下使用配置變量rebase.autoSquash啓用,此選項可用於 覆蓋並禁用此設置。

在你的榜樣,當創建提交Ç,使用git commit --squash <commit-a>(還與--amend,如果確認已經存在)。當git rebase -i發佈時(假設您設置了rebase.autoSquash),該列表將按照您的要求顯示。

關於交互式變形的唯一問題是合併-p-i選項。再次,從git-rebase文檔,在錯誤部分:

通過--preserve-merges --interactive呈現的待辦事項列表不 表示版本圖的拓撲結構。編輯提交和 重新提交它們的提交消息應該可以正常工作,但嘗試重新排序提交往往會產生違反直覺的結果。