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是有效的

相关文章
相关标签/搜索