merge会使得log错综复杂,但是会保留时间线

rebase会保持log为一条线,但是最后log上的节点不是最原始commit的节点,不保留时间线。当前分支的节点会被复制到rebase 分支的节点后面,然后将原始的commit节点删除。

假设现在本地仓库中有两个分支:master分支和branch1分支,提交历史用图来表示如下

1. git merge

现在要合并dev_test1到dev分支,如果使用merge,命令如下:(dev是父分支、dev_test1是子分支或者dev是源端分支、dev_test1是相对应的本地分支,这两种场景都是这样)

git checkout dev
git merge dev_test1

执行完上述两行命令之后,查看log,会产生如下结果:

$  git log --oneline --graph -4
*   2b22529 Merge branch 'dev_test1'
|\
| * 39b3ec9 add file ttt.txt dev_test1
* | d0ff983 modify myTest.txt 1 dev
|/
* 0d5f874 modify myTest.txt

此时dev上提交历史如下:

可以看到,日志就出现了两个分支,而且查看详细日志会发现log节点会根据时间自动排序,这样会产生两个问题:其一为log特别复杂,各种合并节点、分支线等等;其二为某分支合并过来的日志会被按时间分散,很难再master上查找某个分支的完整提交日志。

2. git rebase

如果使用rebase,【git rebase A B 代表寻找到A和B的共同祖先,然后将这段期间B的提交加到A的后面。通常B被省略,代表当前分支】

2.1 场景1(dev为父分支,dev_test1是基于dev的子分支),先拉取dev到dev_test1

$ git checkout dev_test1
$ git rebase dev
First, rewinding head to replay your work on top of it...
Applying: add file ttt.txt

此时再查看log:

$ git log --graph --oneline -4
* bbd022c (HEAD -> dev_test1) add file ttt.txt
* d0ff983 (origin/dev, dev) modify myTest.txt 1
* 0d5f874 (origin/dev_test1) modify myTest.txt
* 6ea82bf modify myTest.txt

确认之后,执行git push推送至远端。此时dev_test1上的日志就是一条线了,本分支的节点被重新创建新增到rebase的那个分支节点后。

之后在切回dev分支,执行rebase dev_test1

$ git checkout dev
$ git rebase dev_test1
$ git log --oneline --graph -4
* bbd022c (HEAD -> dev, origin/dev_test1, dev_test1) add file ttt.txt
* d0ff983 (origin/dev) modify myTest.txt 1
* 0d5f874 modify myTest.txt
* 6ea82bf modify myTest.txt

可以看到,在dev_test1执行git rebase后的节点bbd022c,现在是跟在dev分支节点后的,这样就保证了子分支的节点会出现在父分支的后面。如果直接在dev分支执行git rebase dev_test1,此时dev_test1上的节点会跑到dev前边去,不大合理

2.2 场景2,dev与origin dev间执行rebase。

我切了一个origin/dev对应的本地分支dev

$ git checkout dev

然后再本地有一条修改,可以看到远端dev的位置在bbd022c节点上

$ git log --oneline -4
9aec5ac (HEAD -> dev) modigy myTest.txt
bbd022c (origin/dev,origin/dev_test1, dev_test1) add file ttt.txt
d0ff983 modify myTest.txt 1
0d5f874 modify myTest.txt

而此时其他人往远端分支push了一条记录,我们现在想要提交修改到远端。首先把远端的变化fetch到,注意一定要用fetch,不能使用git pull(因为它=git fetch+git merge,或者使用git pull -r也可以,它=git fetch + git rebase),这样的话就执行了merge,本地分支的log就出现了两条线)

$ git fetch
$ git log --oneline -4
bbd022c (HEAD -> dev, origin/dev_test1, dev_test1) add file ttt.txt
d0ff983 modify myTest.txt 1
0d5f874 modify myTest.txt
6ea82bf modify myTest.txt

查看日志,可以看到现在远端的 origin/dev已经不再bbd002c节点上了,此时我们执行rebase

$ git rebase origin/dev
First, rewinding head to replay your work on top of it...
Applying: modigy myTest.txt$ git log --oneline -4
7d2c7c5 (HEAD -> dev) modigy myTest.txt
8c1a80f (origin/dev) modify ttt.txt
bbd022c (origin/dev_test1, dev_test1) add file ttt.txt

查看日志发现,此时origin/dev的最新节点为8c1a80f,而我们自己修改的节点为7d2c7c5,然后再git push,提交到远端

$ git push$ git log --oneline --graph -4
* 7d2c7c5 (HEAD -> dev, origin/dev) modigy myTest.txt
* 8c1a80f modify ttt.txt
* bbd022c (origin/dev_test1, dev_test1) add file ttt.txt
* d0ff983 modify myTest.txt 1

可以看到现在log就只有一条线了。

但是你虽然将这一条线push到了远端,那其他人怎么同步你的修改呢?也是一样的,执行git rebase

$ git rebase origin/dev
First, rewinding head to replay your work on top of it...
Fast-forwarded dev to origin/dev.$ git log --oneline --graph -4
* 7d2c7c5 (HEAD -> dev, origin/dev) modigy myTest.txt
* 8c1a80f modify ttt.txt
* bbd022c (origin/dev_test1) add file ttt.txt
* d0ff983 modify myTest.txt 1

刚刚提交那条记录的人,直接执行git rebase之后,本地分支和远端分支就在同一个节点上了

分支合并-rebase相关推荐

  1. c++两个vector合并_这才是真正的 Git:分支合并

    公众号关注 "GitHubDaily"设为 "星标",每天带你逛 GitHub! 本文作者:lzaneli,腾讯 TEG 前端开发工程师 "合并前文件 ...

  2. c++两个vector合并_这才是真正的 Git——分支合并

    本文作者:lzaneli,腾讯 TEG 前端开发工程师 "合并前文件还在的,合并后就不见了"."我遇到 Git 合并的 bug 了" 是两句经常听到的话,但真的 ...

  3. 这才是真正的 Git——分支合并

    本文作者:lzaneli,腾讯 TEG 前端开发工程师 "合并前文件还在的,合并后就不见了"."我遇到 Git 合并的 bug 了" 是两句经常听到的话,但真的 ...

  4. 如何撤销Git的一次分支合并操作

    合并分支的操作rebase或者merge 使用git多人协作开发同一个项目时,多人协同编写修改同一份代码时,各自在自己的分支上修改编辑代码:最终都需要保存提交到代码的主分支,这里会涉及到分支间的合并操 ...

  5. GIT分支合并与冲突解决

    git中的分支十分轻量,因此我们在使用git的时候会频繁的用到分支,不可避免的需要进行分支合并. 在git中合并分支有两种选择:merge 和 rebase.但是,无论哪一种,都有可能产生冲突. 一. ...

  6. git 主干修改合并到分支_这才是真正的 Git——分支合并

    本文作者:lzaneli,腾讯 TEG 前端开发工程师"合并前文件还在的,合并后就不见了"."我遇到 Git 合并的 bug 了" 是两句经常听到的话,但真的是 ...

  7. git如何选择性合并_Git分支合并选择

    用Git进行多人协作开发时,必然会合并代码,解决冲突.然而合并代码也是需要点技巧的,如果对一些关键命令没有理解去使用的话,git的版本演进路线就会变得很乱,从而造成了日后维护的一些麻烦. Git上合并 ...

  8. 把本地git分支合并到Dev分支

    把自己分支合并到Dev分支 git add . # 提交到暂存区 git commit -m "提交备注" # 把暂存区文件提交到本地仓库 git push 自己分支名 # 本地上 ...

  9. Eclipse下svn的创建分支/合并/切换使用

     1.创建分支 创建分支实际上就是将程序copy一份到指定的分支目录,如下图示: 在项目名称上点击右键,弹出菜单,选择"Team",再选择"Branch/Tag" ...

最新文章

  1. LeetCode简单题之作为子字符串出现在单词中的字符串数目
  2. ArcGIS Desktop 10.1安装教程
  3. putty和Xming server 结合完美在windows下显示linux GUI程序
  4. C语言指针定义变量方式
  5. 7天学会python_7天学会Python最佳可视化工具Seaborn(五):结构化展示多维数据
  6. Python set集合 - Python零基础入门教程
  7. 一张图带你看懂 ,web前端开发应该知道的HTML5六大趋势
  8. matlab 时频分析(短时傅里叶变换、STFT)
  9. 离散数学课后习题答案
  10. dos命令以及制作.bat文件
  11. win8计算机无法安装打印机驱动程序,Win8电脑打印机驱动安装失败怎么办
  12. 谈谈 MVX 中的 Model
  13. input框的23种类型
  14. HTML 引用小图标
  15. uni-app使用 getUserInfo 报错 fail can only be invoked by user TAP gesture 解决方法
  16. 【SSL_2020.10.27】小biu闯关
  17. html5播放器视频倍速播放功能
  18. 3DTank大战总结
  19. 个性化智能推荐技术研究总结
  20. 项目管理资格认证PMP考前培训班

热门文章

  1. PayPal/Stripe/Square轮询收单系统 stripe paymentlink支付模式
  2. python运维工具开源_开源运维自动化平台-opendevops
  3. 北电破产意味着电信业贵族时代的结束
  4. Hazelcast 知识点认知梳理
  5. 甲基化芯片入门学习-基础知识(一)
  6. R包--ChAMP--甲基化芯片处理(450K、850K)
  7. f81沒有啟用配銷模組,全用INV的雜項處理方式處理,有以下管理要求
  8. Adobe After Effects
  9. unity接入quick sdk报错总结(ios第一版)
  10. 安卓逆向工程之工具使用JADX,JEB,GDA的安装使用