git rebase命令


git rebase命令在另一個分支基礎之上重新應用,用於把一個分支的修改合併到當前分支。

使用語法

git rebase [-i | --interactive] [options] [--exec <cmd>] [--onto <newbase>]
    [<upstream> [<branch>]]
git rebase [-i | --interactive] [options] [--exec <cmd>] [--onto <newbase>]
    --root [<branch>]
git rebase --continue | --skip | --abort | --quit | --edit-todo

範例

假設你現在基於遠端分支」origin「,建立一個叫」mywork「的分支。

$ git checkout -b mywork origin

結果如下所示 -

現在我們在這個分支(mywork)做一些修改,然後生成兩個提交(commit).

$ vi file.txt
$ git commit
$ vi otherfile.txt
$ git commit
... ...

但是與此同時,有些人也在」origin「分支上做了一些修改並且做了提交了,這就意味著」origin「和」mywork「這兩個分支各自」前進」了,它們之間」分叉」了。

在這裡,你可以用」pull「命令把」origin「分支上的修改拉下來並且和你的修改合併; 結果看起來就像一個新的」合併的提交」(merge commit):

但是,如果你想讓」mywork「分支歷史看起來像沒有經過任何合併一樣,也可以用 git rebase,如下所示:

$ git checkout mywork
$ git rebase origin

這些命令會把你的」mywork「分支裡的每個提交(commit)取消掉,並且把它們臨時 儲存為修補程式(patch)(這些修補程式放到」.git/rebase「目錄中),然後把」mywork「分支更新 到最新的」origin「分支,最後把儲存的這些修補程式應用到」mywork「分支上。

當’mywork‘分支更新之後,它會指向這些新建立的提交(commit),而那些老的提交會被丟棄。 如果執行垃圾收集命令(pruning garbage collection), 這些被丟棄的提交就會刪除.

現在我們可以看一下用合併(merge)和用rebase所產生的歷史的區別:

rebase的過程中,也許會出現衝突(conflict)。在這種情況,Git會停止rebase並會讓你去解決衝突;在解決完衝突後,用」git add「命令去更新這些內容的索引(index), 然後,你無需執行 git commit,只要執行:

$ git rebase --continue

這樣git會繼續應用(apply)餘下的修補程式。

在任何時候,可以用--abort引數來終止rebase的操作,並且」mywork「 分支會回到rebase開始前的狀態。

$ git rebase --abort