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