zoukankan      html  css  js  c++  java
  • git merge 与 git rebase的区别?

    一,git merge 与 git rebase的区别

    1,git merge

         例如: master分支合并dev分支,git将两个分支dev和master上的所有commit ,

                   按照提交时间的先后顺序进行依次放到master分支上

    2,  git rebase操作实际上是将当前执行rebase分支的所有基于原分支提交点之后的commit重新生成一个新的commit hash值,

        再次基于原分支目前最新的commit点上进行提交,

        不再根据两个分支上实际的每次提交的时间点排序,

         rebase完成后,重新合并的代码的commit呈线性排列

    说明:架构森林是一个专注架构的博客,地址:https://www.cnblogs.com/architectforest

             对应的源码可以访问这里获取: https://github.com/liuhongdi/

     说明:作者:刘宏缔 邮箱: 371125307@qq.com

    二,准备一个例子:

         我们准备一个文件,然后基于master分支创建dev分支,

         在master分支上做三次修改,提交内容分别是:a b c

         在与之相同的dev分支上做两次修改,提交内容分别是: d e

        两个分支的提交顺序为: a d b e c

    root@kubuntu:/data/git/clog# git status
    位于分支 master
    root@kubuntu:/data/git/clog# vi a.txt root@kubuntu:
    /data/git/clog# git add -A root@kubuntu:/data/git/clog# git commit -m "a"; [master cda2566] a 1 file changed, 1 insertion(+) root@kubuntu:/data/git/clog# git checkout dev 切换到分支 'dev' root@kubuntu:/data/git/clog# vi a.txt root@kubuntu:/data/git/clog# git add -A root@kubuntu:/data/git/clog# git commit -m "d"; [dev 972b5aa] d 1 file changed, 1 insertion(+) root@kubuntu:/data/git/clog# git checkout master 切换到分支 'master' root@kubuntu:/data/git/clog# vi a.txt root@kubuntu:/data/git/clog# git add -A root@kubuntu:/data/git/clog# git commit -m "b"; [master 31b4f31] b 1 file changed, 1 insertion(+) root@kubuntu:/data/git/clog# git checkout dev 切换到分支 'dev' root@kubuntu:/data/git/clog# vi a.txt root@kubuntu:/data/git/clog# git add -A root@kubuntu:/data/git/clog# git commit -m "e"; [dev 9a7debc] d 1 file changed, 1 insertion(+) root@kubuntu:/data/git/clog# git checkout master 切换到分支 'master' root@kubuntu:/data/git/clog# vi a.txt root@kubuntu:/data/git/clog# git add -A root@kubuntu:/data/git/clog# git commit -m "c"; [master c1d316f] c 1 file changed, 1 insertion(+) root@kubuntu:/data/git/clog# git log commit c1d316f17dcbe0c8ee42361ffaaa19fa7c8ff616 (HEAD -> master) Author: liuhongdi <371125307@qq.com> Date: Mon Feb 17 13:12:54 2020 +0800 c commit 31b4f3173bd46947a671db7a174b4044aca617c1 Author: liuhongdi <371125307@qq.com> Date: Mon Feb 17 13:11:18 2020 +0800 b commit cda25664a84b8a27fedbaf436e302781e51fc0e9 Author: liuhongdi <371125307@qq.com> Date: Mon Feb 17 13:09:22 2020 +0800 a commit 7f5d3f71a244920c390b761921687adafcdf8b45 Author: liuhongdi <371125307@qq.com> Date: Mon Feb 17 12:59:53 2020 +0800 初始化文件

    三,看一下合并分支的例子:

    root@kubuntu:/data/git/clog# git merge dev
    自动合并 a.txt
    冲突(内容):合并冲突于 a.txt
    自动合并失败,修正冲突然后提交修正的结果。
    root@kubuntu:/data/git/clog# vi a.txt
    root@kubuntu:/data/git/clog# git add -A
    root@kubuntu:/data/git/clog# git commit -m "解决冲突"
    [master 475e007] 解决冲突
    root@kubuntu:
    /data/git/clog# git log --pretty=oneline 475e007e0adf8ccc1ff36196e9d9525075d92b38 (HEAD -> master) 解决冲突 c1d316f17dcbe0c8ee42361ffaaa19fa7c8ff616 c 9a7debc8ba18f4dd07c93c8bb3e67101066d2463 (dev) e 31b4f3173bd46947a671db7a174b4044aca617c1 b 972b5aa0771fdf0cfd5602de1902f7909d04ad1e d cda25664a84b8a27fedbaf436e302781e51fc0e9 a 7f5d3f71a244920c390b761921687adafcdf8b45 初始化文件

    说明:可以看到 git merge 产生的commit顺序是: a d b e c

    四,来看rebase的例子:

    如果想让commit按照

    a->b->c->d->e的顺序排列,

    以方便reset到某个commit,就可以使用rebase

    看例子:

    root@kubuntu:/data/git/clog# git checkout dev
    切换到分支 'dev'
    root@kubuntu:/data/git/clog# git rebase master
    首先,回退头指针以便在其上重放您的工作...
    ...
    root@kubuntu:/data/git/clog# vi a.txt
    root@kubuntu:/data/git/clog# git add -A
    root@kubuntu:/data/git/clog# git rebase --continue 
    root@kubuntu:
    /data/git/clog# git log --pretty=oneline 6a1ea30d1f70c747d9f2bb6282b1f6b2e75ccf05 (HEAD -> dev) e 89a1b44dc8c491742382f0cb7d528a5652023ee9 d c1d316f17dcbe0c8ee42361ffaaa19fa7c8ff616 (master) c 31b4f3173bd46947a671db7a174b4044aca617c1 b cda25664a84b8a27fedbaf436e302781e51fc0e9 a 7f5d3f71a244920c390b761921687adafcdf8b45 初始化文件

    说明:在dev分支上做 rebase master 之后

             分支中各commit的顺序为:   a b c d e

    五,git rebase后发生丢失本地commit记录的情况如何处理?

    root@kubuntu:/data/git/clog# git reflog

    从这些log中找出自己需要的commit

    然后reset到自己需要的那个commit上

    root@kubuntu:/data/git/clog# git reset --hard 9a7debc
    HEAD 现在位于 9a7debc d

    六,git rebase出现冲突时如何处理?

         在 rebase 的过程中,也许会出现冲突 conflict 。

         在这种情况, git 会停止 rebase 并会让你去解决冲突。在解决完冲突后,用 git add 命令去更新这些内容。

         注意,你无需执行 git-commit,只要执行 continue

      git rebase --continue

         这样 git 会继续应用余下的 patch 补丁文件。

    root@kubuntu:/data/git/clog# git rebase master
    冲突后手动处理,然后add到暂存区:
    root@kubuntu:/data/git/clog# vi a.txt
    root@kubuntu:/data/git/clog# git add -A
    root@kubuntu:/data/git/clog# git rebase --continue

    七,如何放弃当前正在进行的rebase?

         在任何时候,我们都可以用 --abort 参数来终止 rebase 的行动,

         并且分支会回到 rebase 开始前的状态。

     执行git rebase —abort命令即可

    root@kubuntu:/data/git/clog# git rebase --abort

    八,rebase在生产环境中的使用原则:

    1, 个人在本地的分支之间合并代码时,可以merge,
    
           也可以rebase
    
    2,    如果是要提交到线上主分支,则一定要rebase线上主分支
    
    3,    线上主分支,例如: master,一定不要rebase其他分支
  • 相关阅读:
    Alpha 冲刺 (1/10)
    软工实践 · 第七次作业
    福大软工 · 第八次作业(课堂实战)- 项目UML设计(团队)
    软工实践· 第六次作业
    软工实践作业五-结对作业二
    软工实践第四次作业
    软工实践第三次作业
    软工实践第二次作业
    SDN第一次上机作业
    SDN第一次作业——关于网络编程
  • 原文地址:https://www.cnblogs.com/architectforest/p/12323222.html
Copyright © 2011-2022 走看看