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

結果如下所示 -

git

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

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

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

git

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

git

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

$ git checkout mywork
$ git rebase origin

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

git

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

git

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

git

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

$ git rebase --continue

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

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

$ git rebase --abort