git rebase 使用詳解

塵埃092發表於2015-03-07

rebase

本地兩個分支 一個我的分支 test 一個主分支 master

現在我修改的部分要合併到 master 上,可以有兩種選擇 merge 或者 rebase

兩者的最後得到的結果是一樣的,但是區別是 rebase 一個兩個分支 就各位了一個分支,test合併前所有的 patch也就是commit 消失了

而merge 則還是兩個分支,只不過在merge後這個點交匯

圖示

merge

這裡寫圖片描述

rebase

這裡寫圖片描述
為了讓分支樹看起來更簡化,所以我們選用rebase

如何rebase 呢?

首先我的原生程式碼庫都不是最新的,所以先從遠端倉庫pull一下

git checkout master`
git pull

然後 開始和test分支rebase

git checkout test
git rebase master

這個時候就開始rebase 了,一般情況下rebase都是會有衝突的,詳細檢視衝突可以用命令git status然後就會顯示哪個檔案有衝突,然後開啟有衝突的哪個檔案,會發現有一些“<<<<<<<”, “=======”, “>>>>>>>” 這樣的符號。

<<<<<<<” 表示衝突程式碼開始

“=======” 表示testmaster衝突程式碼分隔符

“>>>>>>>" 表示衝突程式碼的結束

<<<<<<<  
所以這一塊區域test的程式碼

=======  
這一塊區域master的程式碼


>>>>>>> 

rebase 和 merge的另一個區別是rebase 的衝突是一個一個解決,如果有十個衝突,先解決第一個,然後用命令

git add -u 
git rebase --continue 

繼續後才會出現第二個衝突,直到所有衝突解決完,而merge 是所有的衝突都會顯示出來。
另外如果rebase過程中,你想中途退出,恢復rebase前的程式碼則可以用命令
git rebase --abort

所以rebase的工作流就是

git rebase 
while(存在衝突) {
    git status
    找到當前衝突檔案,編輯解決衝突
    git add -u
    git rebase --continue
    if( git rebase --abort )
        break; 
}

最後衝突全部解決,rebase成功!!

然後我需要把本地的test 分支push 到遠端test分支上然後再給遠端的master分支 PR。

但是git push 以後總是提示不讓我push 百度了一下發現原因:

比如遠端倉庫的程式碼 A 和 B 都 clone 了一份,然後B修改了x.txt檔案後push到了倉庫, 這個時候 A 就不能直接push了,因為A的x.txt檔案沒有修改,所以此時A應該把遠端的倉庫pull一下,merge掉x.txt檔案的衝突,才能push所以我這裡就犯了一個錯誤,應該在rebase 前,先把原來本地的test分支push到遠端,否則rebase之後就相當於兩個人一個人改了檔案。另一個人就無法push了。

所以這裡需要pull一下
git pull
因為是merge所以這裡會出現所有的conflict
git status
檢視 編輯衝突後再 git pull一下,就合併了。
最後把本地分支test push到遠端分支
git pull
git push origin test
最後PR(pull request)即可。

總結

rebase 工作流:

git rebase 
while(存在衝突) {
    git status
    找到當前衝突檔案,編輯解決衝突
    git add -u
    git rebase --continue
    if( git rebase --abort )
        break; 
}

merge工作流 :

1.git pull  (或fetch && merge) 
2.編輯衝突檔案
3.git pull

相關文章