1. 程式人生 > >git操作之git rebase

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