1. 程式人生 > >git 學習(4) ----- git rebase

git 學習(4) ----- git rebase

  使用git rebase 的前提是多人協作下的分支開發,如果是單人開發,那就沒有必要使用它了,這是由git rebase 的作用所決定的,git rebase 有兩大作用:一個是與主分支保持同步,一個是在合併分支之前清理commit 資訊。先看第一個作用。

  當多人協作進行開發的時候,通常都會有一個主分支,如master, 用於合併所有人的程式碼。而在本地開發的時候,每一個人都會開一個分支,進行分支開發。當我們新開一個分支的時候,就意味著,選擇了主分支上的一個點作為開發的起點。如下圖所示,

  這時,本地開發的時候,我們每一個commit 都會提交到 new_feature 分支上, 同時,我們的同事也在開發功能, 他們開發完成後,都會把程式碼同步到master 分支上。我們從遠端master 分支進行pull 操作,拉取到本地的master 分支上,隨著時間的推移,就會形成如下狀態,

  現在怎麼辦?我們想使用master 分支上的新功能,你可能想到了merge, 但是new_feature 分支還沒有開發完成,還沒有到merge的時候,那就用git rebase 把。在 new_feature  分支上,使用git rebase master 命令就可以了。

  使用git rebase 後,分支new_feature 以最新的master 作為了起點,這時就可以使用master 上的新功能了。rebase, re + base, 的意思,re 是再一次的意思, base 基的意思,再給它一個基礎,就是改變以前的基礎,改變分支以前的起點到新的起點上(change the starting point of your local branch)

  但是有的時候,git rebase 會出問題,我們想回到rebase 之前的狀態,怎麼辦?本地分支上的操作,可以使作git reset 進行回退,但是也要找到回退到的commit id. 這時使用git reflog 命令,如果使用的是git rebase, git reflog 打印出的日誌就是顯示rebase ......, 找到最後一個rebase 後面沒有rebase 的id. 

  如上圖所示,f883bbd, 就是 我們想要的id, 直接git reset --hard f883bdd 就可以了。

  現在說第二個作用,清理commit 日誌。我們再以master 為基礎,新建一個分支,就叫new_feature  分支好了,再在該分支上隨便提交兩次程式碼,我一次增加了index.js 再一次增加了style.css 檔案,

 

  現在我們想把這個提交日誌合併,然後再合併到master 分支上。使用的命令是git rebase --interactive master 然後彈窗一個vim 編輯器,上面就是提交的分支的日起,下面就是一個命令的說明。

  你可以看到,它的日誌排列正好和git log 相反, 最後提交的在最下面。合併使用的是squash 命令, 把pick 07ab50c 前面的pick 換成squash, 就是把下面07ab50c 提交日誌,合併到fc26711 上。

  然後按esc 鍵退出 編輯操作,然後再輸入:wq , 退出這個彈窗,這時又跳出一個彈窗。

  這個彈窗主要是告訴你git  rebase 做了什麼事情,直接  :wq 退出就可以了。

  可以看到rebase 成功,同時git log 也可以看到 兩條記錄合併到一條記錄上了。

  這時,可以愉快地合併到master 分支上了。