• 在平时开发中我们因为版本管理的因素,我们可能同时开发多个功能。我们是通过分支来管理的。不同的分支对应不同的功能不同的时间上线。

分支合并

git merge --squash [分支名]

  • git merge --squash 和 git merge是不同的。后者是直接将其他的提交记录合并进来。而前者是内容的合并。

  • 这里的分支名可以是远程的也可以是本地的分支

    • origin dev : 远程dev
    • dev : 本地dev
  • 现在我们dev分支上开发了某个功能。并提交至远程仓库中。我们现在打算合入master分支中。

  • dev 和 master 两个分支已经很久没有合并了。此时合并可能会有冲突

  • dev代码提交远程

  • 现在我们在另外一台机器上进行远程分支合并请求

  • 执行完squash我们看到有两个文件冲突。我们需要解决冲突。我们通过git status也可以看到这两个文件冲突 both modified

  • 解决冲突也很方便,我们只需要去认为分析两个文件内容取舍问题,然后进行重新提交就行了。比如说现在分析20190423trace.txt文件

  • 加入我们认为dev提交过来的只有hello zfxx是有效的。那么我们留下他就行了。

  • 然后一系列提交推送就行了

  • 提交完之后我们先看看master上日志记录

  • 然后看看另外一台机器的dev提交记录

  • 我们发现dev提交的test甚至之前的commit并没有在master里面。这就是squash与merge的不同之处了

  • squash是将其他分支内容合并和重新进行一次提交封装。这样方便我们对主分支的管理。dev分支开发可能会随心所欲的进行提交已经对提交日志的细小记录。但是对于主分支根本不关心这些或者需要进行一些提交信息的规则定义。这时候我们可以squash先合并内容然后在重新一次性提交

注意点

  • squash 后当前分支执行git status 会看到合并过来的文件在暂存区中我们需要commit 、 push 到远程

git rebase [分支名]

  • 我们先基于master分支切除一个名为rebase_dev分支



  • 此时rebase_dev 和 master是完全一样的。

  • 现在我们在rebase_dev 分支上修改一个文件并commit。我们在看看commit log如何

  • 我们的rebase_dev分支的head节点已经走到了054de46这个commit了。这个commit就是我们刚才提交的commit
  • 8ad6924这个commit 后面括号内容表示是基于远程master、远程head、本地master为基点的。这也能说明现在本地master和远程master一致。且远程master在最新节点上。
  • 此时我们在本地master提交内容并进行推送再看看log

  • 这个时候master和rebase_dev两个分支分别向前推进了2步。

  • 我们先来整理下master推进了两个commit. rebase_dev推进了两个分支

git rebase

  • git rebase 命令实际上是将rebase_dev分支缓存到.git/rebase目录下
  • 然后将rebase_dev基点即8ad6924移动到当前master的head节点。
  • 然后将.git/rebase文件中的两个commit分别更新到rebase_dev上。所以这里涉及到更新是会发生冲突。我们上面rebase_dev推进了两个commit就会进行两次更新。如果遇到冲突git rebase就会停止操作。
  • 我们此时需要解决冲突并将文件重新加入缓存区git add [文件名].
  • 然后执行git rebase --continue

git rebase --abort

  • 在上面我们何如了第一个commit后,突然不想rebase此次操作了。我们可以git rebase --abort停止。此时当前分支回到rebase之前状态。即基点在8ad6924。且自己的两个commit还在。

  • 现在我们执行在rebase_dev分支上执行git rebase master 后看看效果

  • 图中大意是重新设置基点,并将存储在./git/rebase中的patch进行添加到当前分支上。

  • 首先合并第一个commit patch, 里面涉及改动了trace.txt。我们有三种方式进行合并。git自动已经帮我们合并了,就是我们常见的冲突形式。我们也可以通过git am --show-current-patch查看冲突细节。当我们已经认定解决冲突后我们git add 重新添加或者git rm删除文件。然后执行git rebase --continue 进行放行至下一个commit。或者执行git rebase --skip跳过当前的commit.实际上就是丢弃该commit。或者执行git rebase --abort停止当前rebase回到之前状态

  • skip之后我们看到applying rebase V2 ,说明开始何如第二个patch 即commit了。此时也出现了冲突。这个时候第一个commit已经被我们抛弃了。不会对我们产生影响的。

  • 我们执行git rebase --abort停止了当前的基点改变。我们查看源文件发现没有冲突也没有被主分支内容改动。

  • 下面我们git rebase master将内容合并进来。

  • 我们一顿操作下来最后提示我们合并成功了。只是我在处理合并的时候将自动合并信息留下来了。我们看看最终的文件

  • 我们查看log发现。master日志在rebase_dev之前。且rebase_dev两个commit id发生了变化。这也说明我们基点移动到master上且rebase_dev的commmit是重新添加到rebase_dev分支上的。

git rebase -i

  • 这个时候我看了rebase_dev和master的四个commit 有点不顺眼,我们也可以把这四个commit合并。
  • 执行git rebase -i HEAD~4

  • 弹出的窗口我们可以发现前四行使我们的commit倒叙排列的。下面也有关于参数的解释,将该四个commit合并到最后一个commit上。及702de33 。

    看看常用的两个。后面的我也不明白后面再补补吧

    |缩写|关键字|作用|

    |---|---|---|

    |p|pick|use commit 使用该提交,如上所示四个都pick,即没有合并|

    |r|reword|使用该commit,但是从新编写提交信息|

  • 我们发现四条commit合并成一条了。这样有利于我们对commit提交信息的管理。

git merge [分支名]

  • git merge 到这里其实已经没啥好说的。上面的对比已经梳理完毕了。主要和git rebase的区别。git merge 适合主分支操作。

git分支管理--rebase&merge详解的更多相关文章

  1. Git 分支管理详解

    大纲: 1.前言 2.创建分支 3.切换分支 4.合并分支(快速合并) 5.删除分支 6.分支合并冲突 7.合并分支(普通合并) 8.分支管理策略 9.团队多人开发协作 10.总结 注,测试机 Cen ...

  2. Git学习总结(12)——多人开发 Git 分支管理详解

    1.前言 在上一篇博客中我们主要讲解了Git 远程仓库,相信大家对远程的Git仓库有一定的了解,嘿嘿.在这一篇博客中我们来在大家讲解一下Git 分支管理,这可以说是Git的又一大特点.下面我们就来学习 ...

  3. Git学习系列之Windows上安装Git详细步骤(图文详解)

    前言 最初,Git是用于Linux下的内核代码管理.因为其非常好用,目前,已经被成功移植到Mac和Windows操作系统下. 鉴于大部分使用者使用的是Windows操作系统,故,这里详细讲解Windo ...

  4. git概念及工作流程详解

    git概念及工作流程详解 既然我们已经把gitlab安装完毕[当然这是非必要条件],我们就可以使用git来管理自己的项目了,前文也多多少少提及到git的基本命令,本文就先简单对比下SVN与git的区别 ...

  5. 在Visual Studio 中使用git——分支管理-下(九)

    在Visual Studio 中使用git--什么是Git(一) 在Visual Studio 中使用git--给Visual Studio安装 git插件(二) 在Visual Studio 中使用 ...

  6. Git 分支管理是一门艺术

    转载: Git 分支管理是一门艺术 1 要确保:团队成员从主分支(master)获得的都是处于可发布状态的代码,而从开发分支(develop)应该总能够获得最新开发进展的代码. 2 "辅助分 ...

  7. Git分支管理[三]

    标签(linux): git 笔者Q:972581034 交流群:605799367.有任何疑问可与笔者或加群交流 git分支管理命令 git branch #创建分支 git branch -v # ...

  8. Git—分支管理

    Git—分支管理 分支学习:branch称为分支,默认仅有一个名为master的分支.一般开发新功能流程为:开发新功能时会在分支dev上进行,开发完毕后再合并到master分支. branch相关常用 ...

  9. [转载]理解 Git 分支管理最佳实践

    原文 理解 Git 分支管理最佳实践 Git 分支有哪些 在进行分支管理讲解之前,我们先来对分支进行一个简单的分类,并明确每一类分支的用途. 分支分类 根据生命周期区分 主分支:master,deve ...

随机推荐

  1. 012.NET5_MVC_Razor布局

    Razor 页面组成到底有哪些内容? 包含了Layout的母版嵌套的返回需要渲染的视图内容: 如何嵌套? 通过Layout中的RenderBody()方法做了替换,把返回的视图替换到母版页中,形成了一 ...

  2. SVG background watermark

    SVG background watermark SVG 背景水印 <svg xmlns="http://www.w3.org/2000/svg" width="2 ...

  3. GIF : 超好用的gif 图片制作工具: LICEcap

    超好用的gif 图片制作工具: LICEcap simple animated screen captures http://www.cockos.com/licecap/https://github ...

  4. git commit guidelines

    git-commit-guidelines AngularJS Development Setup Running Tests Coding Rules Commit Message Guidelin ...

  5. javascript change array length methods

    javascript change array length methods Array 改变数组长度的方法 push, pop shift, unshift, splice, fill, 不改变数组 ...

  6. Inspect Network Activity In Chrome DevTools

    Inspect Network Activity In Chrome DevTools https://developers.google.com/web/tools/chrome-devtools/ ...

  7. JUC并发集合类CopyOnWriteList

    CopyOnWriteList简介 ArrayList是线程不安全的,于是JDK新增加了一个线程并发安全的List--CopyOnWriteList,中心思想就是copy-on-write,简单来说是 ...

  8. H5 常见问题汇总及解决方案

    原文链接:http://mp.weixin.qq.com/s/JVUpsz9QHsNV0_7U-3HCMg H5 项目常见问题汇总及解决方案 -- 由钟平勇分享 转自 https://github.c ...

  9. Python学习笔记_类

    class Animal(object): # 定义父类animal def __init__(self,name,sound): # 初始化属性 name sound self.name = nam ...

  10. Jupyter Notebook 暗色自定义主题

    这款主题是在jupyter-dark-theme的基础上修改了字体大小和行高,以及显示工具栏.感谢原作者! 安装 下载custom.css文件并移动至~/.jupyter/custom/文件夹下,如果 ...