git操作之git rebase
git rebase可以簡單的理解為調整commit資訊,包括合併commit資訊到master(與merge類似,但是效果不同)以及刪除commit資訊或者修改log資訊等,下面分別介紹幾種git rebase常用的場景。
合併commit資訊到master
例如有如下commit資訊並且當前處於topic分支:
A---B---C topic
/
D---E---F---G master
當我們執行:git rebase master 命令後,commit資訊將會變為:
A'--B'--C' topic / D---E---F---G master
如果我們執行:git rebase topic master,則commit資訊會變為:
A'--B'--C' topic
/
D---E---A'---B'---C'---F---G master
上面兩種情況相當於把commit資訊合併到一起,而且是線性合併,這就是與merge不同的地方,如果使用git merge進行合併,則結果為:
A---B---C topic
/ \
D---E---F---G ---H master
多數情況下,當執行git rebase時,會出現conflict,此時,我們需要手動處理衝突,然後執行git add 把修改後的檔案新增到暫存區,最後,如果想完成rebase,則執行git rebase –continue,如果不想,則執行git rebase –abort
使用互動模式編輯commit資訊
使用git rebase -i 互動模式,你可以編輯commit資訊,包括改變commit的順序、刪除某些commit、修改log資訊等。使用方法為:git rebase -i ,例如:
執行git rebase -i HEAD~4,編輯器將會自動開啟,顯示最新的4個commit資訊,以及一些操作命令,效果如下:
pick 9a54fd4 新增commit的說明 pick 0d4a808 新增pull的說明 pick d286baa The oneline of this commit pick f1a5c00 The oneline of the next commit # Rebase 326fc9f..0d4a808 onto d286baa # # Commands: # p, pick = use commit # r, reword = use commit, but edit the commit message # e, edit = use commit, but stop for amending # s, squash = use commit, but meld into previous commit # f, fixup = like "squash", but discard this commit's log message # x, exec = run command (the rest of the line) using shell # # If you remove a line here THAT COMMIT WILL BE LOST. # However, if you remove everything, the rebase will be aborted. #
這些命令都很容易理解,比如你想修改0d4a808 commit的log資訊,則把第二行的pick改為reword即可,然後儲存退出,此時會再次開啟一個編輯器,讓你修改0d4a808 commit的log資訊,修改後儲存即可。
如果你想在0d4a808 和 d286baa 兩個commit之間補上一個新的commit,可以使用edit替換第二行的pick然後儲存,按照提示用git commit –amend新增一個新的commit,然後執行git rebase –continue即可。
如果你想刪除9a54fd4和d286baa,則直接刪了9a54fd4,並且把d286baa前面的命令改為fixup,意思就是刪除本條commit。注意,不能直接把d286baa的記錄刪除,因為只有在前面沒有commit的情況下才可以直接刪除,效果如下:
(這裡刪除了 pick 9a54fd4 新增commit的說明)
pick 0d4a808 新增pull的說明
fixup d286baa The oneline of this commit
pick f1a5c00 The oneline of the next commit