Git Merge & Git Rebase

Rebases are how changes should pass from the top of hierarchy downwards and merges are how they flow back upwards.

git merge 和 git rebase 都可以用来合并分支。

git merge 分支名      # 将分支合并到当前分支
git rebase 分支名     #也是把分支合并到当前分支

Different

假设你现在基于远程分支"origin",创建一个叫"mywork"的分支。

git checkout -b mywork origin

假设远程分支"origin"已经有了2个提交,如图


起始状态

现在我们在这个分支做一些修改,然后生成两个提交(commit)。但是与此同时,有些人也在"origin"分支上做了一些修改并且做了提交了,这就意味着"origin"和"mywork"这两个分支各自"前进"了,它们之间产生"分叉"了。


产生分叉

你可以用"git pull"命令把"origin"分支上的修改拉下来并且和你的修改合并,使用git pull时默认是merge,所以结果看起来就像一个新的"合并的提交"(merge commit)

git merge

merge

git merge 会生成一个新得合并节点,而rebase不会。使用merge合并, 为分支合并自动识别出最佳的同源合并点。

git rebase

如果你想让"mywork"分支历史看起来像没有经过任何合并一样,你也许可以用 git rebase


rebase
git checkout mywork
git rebase origin

这些命令会把你的"mywork"分支里的每个提交(commit)取消掉,并且把它们临时保存为补丁(patch)(这些补丁放到".git/rebase"目录中),然后把"mywork"分支更新 为最新的"origin"分支,最后把保存的这些补丁应用到"mywork"分支上。

当'mywork'分支更新之后,它会指向这些新创建的提交(commit),而那些老的提交会被丢弃。 如果运行垃圾收集命令(pruning garbage collection), 这些被丢弃的提交就会删除. (git gc)


运行gc之后的状态

Solve Conflicts

在rebase的过程中出现冲突,git会暂停rebase并让你去解决冲突,在解决完冲突后,用"git add"命令去更新这些内容的索引(index), 然后,你无需执行 git-commit,只要执行:

git rebase --continue #这样git会继续应用(apply)余下的补丁

在任何时候,你可以用--abort参数来终止rebase的行动,并且"mywork" 分支会回到rebase开始前的状态。

git rebase --abort

但是rebase会基于每次commit都解决一次冲突,所以如果当别人小步提交的话,解决冲突起来会特别酸爽,不断重复直到冲突解决。
而merge 会为分支合并自动识别出最佳的同源合并点。

log history

log history
我们假设C3提交于9:00AM,C5提交于10:00AM,C4提交于11:00AM,C6提交于12:00AM
  • 对于使用git rebase来合并所看到的commit的顺序(从新到旧)是:C6‘,C5',C4,C3,C2,C1
    因为C6'提交只是C6提交的克隆,C5'提交只是C5提交的克隆,
    从用户的角度看使用git rebase来合并后所看到的commit的顺序(从新到旧)是:C6,C5,C4,C3,C2,C1
  • 对于使用git merge来合并所看到的commit的顺序(从新到旧)是:C7 ,C6,C4,C5,C3,C2,C1

对于两个分支而言,rebase和merge没有区别,但是rebase更干净,因为log hisitory是线性的,但commit不一定按日期先后排,而是local commit总在后面。merge之后history变得比较复杂,但是commit按日期排序。所以当我们使用git log来参看commit时,merge 和 rebase 的commit的顺序也有所不同。

个人把merge理解为显性的处理冲突,rebase是隐性的处理冲突。

Pay attention

在merge的时候,有时并没有产生一个commit。可是不是说merge时会产生一个merge commit吗?

注意:只有在冲突的时候,解决完冲突才会自动产生一个commit。

如果想在没有冲突的情况下也自动生成一个commit,记录此次合并就可以用:git merge --no-ff命令,

git merge 和 git merge --no-ff的区别

默认情况下,git执行"快进式合并"(fast-farward merge),会直接将master分支指向dev分支。使用--no-ff参数后,会执行正常合并,在master分支上生成一个新节点


git merge 和 git merge --no-ff的区别

Question

需求:想保证每天分支上代码和master上一致且维护同一分支
解决方案:
1.在分支上merge master ,commit 顺序不会出问题,log history 会很复杂,不利于review 代码
2.在分支上rebase master,log history 会很清晰,但是遇到冲突必须挨个commit 解决,同时commit的顺序会错乱

尝试解决给出的方案
在分支上merge master , 然后利用github 的 pull request 来review 代码

走过的坑

假设有master,friends,delete-box 三个分支,其中friends 基于master,delete-box基于friends,需要在delete-box上rebase master 的时候,不能直接在delete-box上rebase master,这样会导致master 的代码跑到delete-box 的‘头上’,分支提交顺序错乱,正确做法是先在friends上rebase master,然后去delete-box 分支上rebase friends

未完...

至此...还是没有找到一个很好的方式来保证在维护同一分支的前提下,每天分支上的代码和master保持同步,也许可以把每次把分支merge回master之后新拉分支的步骤用脚本封装一层...做到所谓的自动化...

参考资料

http://gitbook.liuhui998.com/4_2.html
https://www.visualstudio.com/en-us/docs/git/pull-requests

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,126评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,254评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,445评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,185评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,178评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,970评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,276评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,927评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,400评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,883评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,997评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,646评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,213评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,204评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,423评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,423评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,722评论 2 345

推荐阅读更多精彩内容