git rebase實戰

在develop分支上rebase另一個分支master,是將master做爲本地,develop做爲遠端來處理的。git

最後的效果是,develop分支看起來像是在master分支的最新的節點以後才進行開發的ide

 

 

develop分支上的commit記錄this

Administrator@LuJunTao MINGW64 /f/GitMerge/demo (develop)
$ git log
commit f529181aa7aa12794b261b5be57e948792168dd6  C5
Author: ChuckLu <郵箱>
Date: Tue Aug 11 14:43:21 2015 +0800spa

1.添加I love you3d

commit ccdaa5fd698d68854ad43bfc1ddef614ea2441ac  C4
Author: ChuckLu <郵箱>
Date: Tue Aug 11 14:43:02 2015 +0800code

1.刪除hello worldorm

commit dc697947fccd64b310d5b910c6c8faca0a6a914d   C3
Author: ChuckLu <郵箱>
Date: Tue Aug 11 14:41:39 2015 +0800對象

1.添加worldblog

commit 1f14a3c4a2bb5d9a26b6198733097f6801f6dcb9  C2
Author: ChuckLu <郵箱>
Date: Tue Aug 11 14:41:15 2015 +0800ip

1.添加hello

commit caf9736695f78779e9bae77afbc49d97a5e4959c    C1
Author: ChuckLu <郵箱>
Date: Tue Aug 11 14:40:48 2015 +0800

1.新增一個文件

 

 

 

master分支上的commit記錄

Administrator@LuJunTao MINGW64 /f/GitMerge/demo (master)
$ git log
commit 618a561d8084af6b75ee6a9864bd2747c377eff6  C7
Author: ChuckLu <郵箱>
Date: Tue Aug 11 14:53:54 2015 +0800

添加lu

commit dc7ce42604209cc1cfb0b871043d89fd324830e3  C6
Author: ChuckLu <郵箱>
Date: Tue Aug 11 14:53:11 2015 +0800

添加chuck

commit dc697947fccd64b310d5b910c6c8faca0a6a914d  C3
Author: ChuckLu <郵箱>
Date: Tue Aug 11 14:41:39 2015 +0800

1.添加world

commit 1f14a3c4a2bb5d9a26b6198733097f6801f6dcb9  C2
Author: ChuckLu <郵箱>
Date: Tue Aug 11 14:41:15 2015 +0800

1.添加hello

commit caf9736695f78779e9bae77afbc49d97a5e4959c  C1
Author: ChuckLu <郵箱>
Date: Tue Aug 11 14:40:48 2015 +0800

1.新增一個文件

 

 

develop分支和master分支的共同的父節點

commit dc697947fccd64b310d5b910c6c8faca0a6a914d
Author: ChuckLu <郵箱>
Date: Tue Aug 11 14:41:39 2015 +0800

1.添加world

 

C1<--C2<--C3<--C6<--C7      master分支

                     <--C4<--C5      develop分支

 

rebase開始

1.首先切換到develop分支  

git checkout develop

2.在develop分支上進行rebase    

git rebase master

【rebase是在master分支的最後一個提交C7上開始的】

將C4和C7合併,獲得一個合併結果result1

再將C5和result1合併,獲得一個合併結果result2

 

C4和C7合併的時候產生衝突,Local是C7,C5做爲Remote出現。

在develop分支上rebase另一個分支master,是將master做爲本地,develop做爲遠端來處理的。

 

 處理完衝突以後,保存,並標記爲解決衝突

1.第一種處理方式,處理結果爲直接使用右側的文件

 

git rebase --continue

這時候,會收到提示,

Administrator@LuJunTao MINGW64 /f/GitMerge/demo (develop|REBASE 1/2)
$ git rebase --continue
Applying: 1.刪除hello world
No changes - did you forget to use 'git add'?
If there is nothing left to stage, chances are that something else
already introduced the same changes; you might want to skip this patch.

When you have resolved this problem, run "git rebase --continue".
If you prefer to skip this patch, run "git rebase --skip" instead.
To check out the original branch and stop rebasing, run "git rebase --abort".

 

即使是已經處理了衝突,可是這個衝突比較特殊。上圖的合併結果,是以右側的現有文件(Local)做爲處理結果的。

關於這個,這裏有解釋http://stackoverflow.com/questions/4033009/git-rebase-conflicts-keep-blocking-progress

 Word of caution: Please note that git rebase --skip will completely drop the commit that git tried to rebase.

In our case, this should be okay since git is complaining this is an empty commit.

If you think you've lost changes once the rebase is complete, you can use git reflog to get the commit id of your repository before the rebase,

and use git reset --hard to get your depot back in that state (this is another destructive operation).

這個時候,須要經過git rebase --skip來跳過

 

 

2.第二種處理方式,合併結果,既不是Local也不是Remote的

這種狀況下git rebase --continue

就能夠正常工做

 

 

當前處於分支A,執行命令

git rebase B

那麼在處理衝突的時候,Local是B,Remote是A

 

 

 

C1  v0.10.12     5fc35f2b069116b334a20f324bf135237627e404

C2  load language setting before GameV2 initialized    78f9d8de291f0e241bcb0ecd7ce532109fcef657

C3  fix config not loading early enough,causing no language besides enUS to work  0bb37cb02d9a120e6e311303bffd85d2c5d648bb

C4  v0.10.13 (language fix)   3b82bb138f149788611f48c8fdfbf1f18ea3b029

1.在chucklu_master的分支上執行git rebase temp

 以temp的最後一個提交對象v0.10.13,假定此次提交爲C4,

chucklu_master上,實際只有一個新的提交,假定爲C2

rebase的時候,會把C2的修改和C4進行一次合併,發現有衝突

手動合併,

git rebase --continue 

若是合併的結果是Local的話[會提示git add],這種狀況下,直接就git rebase --skip

上面這句話,覺得着,合併結果是temp的節點C4,這會致使,chucklu_master上的提交記錄直接被忽略掉

Administrator@LuJunTao MINGW64 /d/SourceCode/GameSourceCode/Hearthstone-Deck-Tracker (chucklu_master|REBASE 1/1)
$ git rebase --continue
Applying: load language setting before GameV2 initialized
No changes - did you forget to use 'git add'?
If there is nothing left to stage, chances are that something else
already introduced the same changes; you might want to skip this patch.

When you have resolved this problem, run "git rebase --continue".
If you prefer to skip this patch, run "git rebase --skip" instead.
To check out the original branch and stop rebasing, run "git rebase --abort".

若是收到這樣的提示,則說明此次的合併,是無效的。當前分支上的這一次commit,對於基底分支temp來講,沒有任何意義。因此直接跳過。

 

 

 

2.在temp分支上執行 git rebase chucklu_master

 以chucklu_master的最後一個提交對象,假定此次提交爲C2

temp分支,實際上有2個提交,假定爲C3和C4

rebase的時候,首先是C3和C2進行合併,獲得結果result

而後把C4和上一步的result合併,獲得另一個結果result1

 

生成了新的commit  fix config not loading early enough, causing no language besides enUS to work.   dd076d7b5da66c17eae4bbdc8a7af4c635ef0360

雖然提交信息是同樣的,可是SHA的值已經改變

v0.10.13 (language fix)     238a2d1042106c8e94722794d980e75439261be5

 

 

 

===2015年10月20日更新===

$ git rebase --continue
ZBMYun/SourceCode/ZITakerHS/ZITaker/UI/FormDeviceInfo.cs: needs update
You must edit all merge conflicts and then
mark them as resolved using git add

處理完衝突以後,提示這個。記得用tortoisegit的圖形化界面處理完衝突的,而且標記了resolved量。

不知道爲何還提示這個,

按照提示執行

$ git add UI/FormDeviceInfo.cs

最後再執行git rebase --continue就完成了

 

 

===2015年10月25日凌晨3:41更新===

$ git rebase --continue
Applying: Re-Fix gold progress display, add background image
No changes - did you forget to use 'git add'?
If there is nothing left to stage, chances are that something else
already introduced the same changes; you might want to skip this patch.

When you have resolved this problem, run "git rebase --continue".
If you prefer to skip this patch, run "git rebase --skip" instead.
To check out the original branch and stop rebasing, run "git rebase --abort".

這種狀況下,沒有提示有具體的文件須要git add

直接執行git rebase --skip就能夠了

執行完成之後,須要記得和以前第三方的最後一次提交,進行compare。若是一致的話,就說明rebase是有效的

相關文章
相關標籤/搜索