關於git的rebase使用

1、rebase用在分支合併

1. 普通狀況:html

你在main分支上,開出一個feature分支,在feature分支上工做git

image.png

某同事在main分支上push了新內容A2安全

image.png

若是想在feature分支獲取到A2改動,則將main分支merge到feature分支,產生B1。這樣git就記錄了這個merge的信息。markdown

image.png

有時候咱們並不想要git記錄這個merge的信息,由於這樣會讓git的歷史記錄變得很繁瑣。並且會產生分叉。yii

回到merge前,若是將feature分支rebase到main分支,則是這樣,是一條直線,沒有分叉,至關清爽。rebase之後,老的提交B會被丟棄,會指向新建立的提交B‘。oop

image.png

2. 有相同commit的狀況:spa

好比feature分支的第1個commit B 的改動和main分支的A2是同樣的。.net

image.png

那麼在執行git rebase main之後,B就直接被刪除掉了。命令行

image.png

3. 在多條分支上操做的狀況:code

image.png

如今想將feature1分支上的改動放到main最新改動的後面,則執行git rebase --onto main feature feature1,將變成:

image.png

實際項目中遇到的狀況:在develop上修了個bug,須要把bug的分支接到release分支上:

image.png

執行git rebase --onto release develop bug:

(固然也能夠切換到bug分支之後,直接執行git rebase release

image.png

2、在rebase的過程當中,git作的事情:

  1. 把feature分支裏面的每一個commit取消掉。
  2. 把上面的操做臨時保存成patch文件,存在.git/rebase目錄下。
  3. 把feature分支更新到最新的main分支。
  4. 把上面保存的patch文件應用到feature分支上。

3、關於rebase過程當中的衝突:

  1. 在rebase的過程當中有可能產生衝突,這時候git會中止rebase並讓你去解決衝突。
  2. 在解決完衝突後,用git add <filename>命令去更新這些內容。
  3. 而後執行git rebase --continue
  4. 這樣git會繼續應用餘下的patch補丁文件。
  5. 在期間可使用git rebase —abort來中止rebase操做。回到rebase之前的狀態。

4、爲何說git rebase是一個危險的命令?由於它改變了歷史。

image.png

若是在rebase之前,feature分支不只僅是你一我的在維護,還有其餘同事在維護,那麼在你將feature進行rebase並push到遠程倉庫之後,其餘同事拉取代碼就會產生問題。因此當全部須要rebase的commit沒有被push過,就能夠安全地進行rebase。

5、rebase用在其餘方面(合併commit、刪除commit、修改commit message等方面),下面用刪除commit做例子:

  1. 切換到將要操做的分支
  2. 執行git rebase -i HEAD~2,進入vi窗口,查看近2個commit

image.png 3. 按鍵盤a鍵進入編輯模式 4. 根據圖中提示進行操做,好比我想drop70787b8這個commit,將pick改爲dimage.png 5. 按esc退出vi窗口。輸入::wq保存並退出。 6. 命令行看到Successfully rebased and updated refs/heads/feature.說明70787b8這個commit被刪除掉了。

6、關於rebase成功之後的操做

  • 執行完rebase之後,每每須要進行強制推送:git push -f 分支名(實際上git push -f就行啦)
  • 若是想恢復到rebase以前的記錄,能夠執行git reflog之後,按箭頭下,往下找到你想要回到的commit,複製。
  • 再執行git reset commit_hash_id --hard,就能回到某個版本啦。

7、參考文檔:

git-scm.com/book/zh/v2

git-scm.com/docs/git-re…

cloud.tencent.com/developer/n…

blog.csdn.net/gtlbtnq9mr3…

www.yiibai.com/git/git_reb…

www.liaoxuefeng.com/wiki/896043…

jartto.wang/2018/12/11/…

相關文章
相關標籤/搜索