[轉]【Git】rebase 用法小結


 

https://www.jianshu.com/p/4a8f4af4e803

本文主要參考

rebase在git中是一個非常有魅力的命令,使用得當會極大提高自己的工作效率;相反,如果亂用,會給團隊中其他人帶來麻煩。它的作用簡要概括為:可以對某一段線性提交歷史進行編輯、刪除、復制、粘貼;因此,合理使用rebase命令可以使我們的提交歷史干凈、簡潔!

前提:不要通過rebase對任何已經提交到公共倉庫中的commit進行修改(你自己一個人玩的分支除外)

1.合並多個commit為一個完整commit

 

 

當我們在本地倉庫中提交了多次,在我們把本地提交push到公共倉庫中之前,為了讓提交記錄更簡潔明了,我們希望把如下分支B、C、D三個提交記錄合並為一個完整的提交,然后再push到公共倉庫。
 

現在我們在測試分支上添加了四次提交,我們的目標是把最后三個提交合並為一個提交:


 

這里我們使用命令:

  git rebase -i [startpoint] [endpoint] 

其中-i的意思是--interactive,即彈出交互式的界面讓用戶編輯完成合並操作,[startpoint] [endpoint]則指定了一個編輯區間,如果不指定[endpoint],則該區間的終點默認是當前分支HEAD所指向的commit(注:該區間指定的是一個前開后閉的區間)。
在查看到了log日志后,我們運行以下命令:

git rebase -i 36224db

或:

git rebase -i HEAD~3 

然后我們會看到如下界面:

 

上面未被注釋的部分列出的是我們本次rebase操作包含的所有提交,下面注釋部分是git為我們提供的命令說明。每一個commit id 前面的 pick表示指令類型,git 為我們提供了以下幾個命令:

 

  • pick:保留該commit(縮寫:p)
  • reword:保留該commit,但我需要修改該commit的注釋(縮寫:r)
  • edit:保留該commit, 但我要停下來修改該提交(不僅僅修改注釋)(縮寫:e)
  • squash:將該commit和前一個commit合並(縮寫:s)
  • fixup:將該commit和前一個commit合並,但我不要保留該提交的注釋信息(縮寫:f)
  • exec:執行shell命令(縮寫:x)
  • drop:我要丟棄該commit(縮寫:d)

 

 

根據我們的需求,我們將commit內容編輯如下:
 

然后是注釋修改界面:


 
編輯完保存即可完成commit的合並了:
 

2.將某一段commit粘貼到另一個分支上

當我們項目中存在多個分支,有時候我們需要將某一個分支中的一段提交同時應用到其他分支中,就像下圖:

 

我們希望將develop分支中的C~E部分復制到master分支中,這時我們就可以通過rebase命令來實現(如果只是復制某一兩個提交到其他分支,建議使用更簡單的命令: git cherry-pick)。
在實際模擬中,我們創建了master和develop兩個分支:
master分支:
 
develop分支:
 
我們使用命令的形式為:

 

    git rebase [startpoint] [endpoint] --onto [branchName] 

其中,[startpoint] [endpoint]仍然和上一個命令一樣指定了一個編輯區間(前開后閉),--onto的意思是要將該指定的提交復制到哪個分支上。
所以,在找到C(90bc0045b)和E(5de0da9f2)的提交id后,我們運行以下命令:

    git  rebase   90bc0045b^   5de0da9f2   --onto master

注:因為[startpoint] [endpoint]指定的是一個前開后閉的區間,為了讓這個區間包含C提交,我們將區間起始點向后退了一步。
運行完成后查看當前分支的日志:

 
可以看到,C~E部分的提交內容已經復制到了G的后面了,大功告成?NO!我們看一下當前分支的狀態:
 
當前HEAD處於游離狀態,實際上,此時所有分支的狀態應該是這樣:
 

所以,雖然此時HEAD所指向的內容正是我們所需要的,但是master分支是沒有任何變化的, git只是將C~E部分的提交內容復制一份粘貼到了master所指向的提交后面,我們需要做的就是將master所指向的提交id設置為當前HEAD所指向的提交id就可以了,即:

 

      git checkout master
      git reset --hard  0c72e64
 

此時我們才大功告成!

注:文中如有任何錯誤,請各位批評指正!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM