zoukankan      html  css  js  c++  java
  • Git学习笔记--分支

    分支管理

    分支就是平行时空,但是可以随时合并。

    创建和合并分支

    我们将HEAD(当前分支)、master都理解为指针,Git用master指向最新的提交,再用HEAD指向master。

    创建一个dev分支,此时dev和master指向相同的提交,HEAD指向dev。

     

    这是你在dev分支上工作,提交会更新dev的指向,master就停在原地,当你想合并dev和master怎么做呢?最简单的方法是将master指向dev。

    很简单,也很快,只是指针的修改。让我们看看怎么通过命令实现:

    创建分支:$ git branch dev        
    切换分支:$ git switch dev  (旧版本用checkout)
    以上两条命令可以用一条代替:$ git switch -c dev(旧版本用checkout)

    合并合并指定分支到当前分支:$ git merge dev 因此要先让HEAD指向master
    删除dev分支:$ git branch -d dev

    这种合并分支很快,叫做 Fast-forward ,不是所有的工作都可用快合并,还有其他的合并方式。

     冲突了怎么办?

    现在你创建了一个新分支feature1,并且在feature1上修改并提交了1次,这时你又切回master分支,稀里糊涂的在master分支上修改了同一个文件并提交了,现在分支就变成这样:

     这时合并,Git不知道要保存那个版本,就会提示冲突。此时要手动解决冲突,提交后就能自动合并。

    $ git merge feature1                提示冲突
    $ git status                        可查看冲突
    
    手动修改readme到想要的内容
    
    $ git add readme.txt 
    $ git commit -m "conflict fixed"    提交,自动合并    

    实际的分支管理策略

    如果分支采用快速合并,那么删除分支后,会丢失分支信息,一般我们希望保存分支信息。因此合并时要禁用FF,命令格式:

    $ git merge --no-ff dev

    我们可以用下面代码查看分支历史:

    $ git log --graph

    如果是FF模式,删除分支后就看不到分支历史了。

    实际开发时,会有一支分支(如master分支)作为稳定版本,可发布版本。通常我们不在master分支上干活,我们会在一条develop分支上工作。

    工作模式通常是这样的:

    你和小伙伴都在dev分支干活;

    每有一个新功能要实现,从dev分出featureX分支,完成后合并到dev;

    dev功能实现得差不多时,检查无bug,合并到master,通常合并到master后就会发布新版本。

    用图表示就这样:

     Bug分支 *

    有的时候,你正在干活,老板突然说:小c,我下去买杯咖啡,有个bug你改一下。

    那么这时你肯定要停下手中工作,火速搞定bug,向老板展示你超高的效率。但是,你正在做一个feature,还要两天才能做完,不能直接切到别的分支,不然你活白干了。

    这时,stash功能派上用场。

    $ git stash
    Saved working directory and index state WIP on dev: da809c3 first submit

    这个命令将你现在的工作现场保护起来,相当于bug是中断,这是中断保护。

    这时你就可以放心切到其他分支修复bug。

    修复完后,回到你刚刚干活的feature分支,

    $ git stash pop         恢复的同时把stash内容也删了
    $ git stash apply       恢复后,stash内容并不删除
    $ git stash drop     删除stash内容
    $ git stash list     可以多次stash,该命令查看stash列表

    回到feature分支工作后,你发现那个bug在你这个分支也是存在的,怎么办,难道二二三四再来一次吗?不,Git提供了便捷操作,cherry-pick命令可以复制一个特定的提交到当前分支。

    $ git cherry-pick 版本号

    这个版本号就是上一次你为bug开了一个分支,在分支上提交一次的版本号。

    这样,就简单的只把bug修复部分复制到了现在的分支。

     多人协作

    推送分支命令:

    $ git push origin master(分支名)

    克隆库:

    $ git clone https/ssh地址

    克隆到本地的库,只能看到master分支,要想在dev上开发,还要创建远程的dev分支对应到本地,命令为:

    $ git switch -c dev origin/dev

    加入两个小伙伴都对同一个文件进行修改后推送,就会造成冲突,解决方法是,后面那个推送的先pull下对应的分支,修改文件解决冲突,再push。

    参考:廖雪峰的Git教程

  • 相关阅读:
    JAVA中线程同步的方法(4种)汇总
    java
    指定的元素已经是另一个元素的逻辑子元素。请先将其断开连接。(解决问题总结)
    无法将类型为“System.Windows.Controls.SelectedItemCollection”的对象强制转换为类型“System.Collections.Generic.IList`1
    foreach---集合已修改;可能无法执行枚举操作。
    WPF_View中控件使用单例ViewModel
    判断s2是否能够被通过s1做循环移位(rotate)得到的字符串是否包含
    多列转1列 SqlServer 实现oracle10g的 wmsys.wm_concat()--for xml path('')
    异步对象(XMLHttpRequest)的帮助脚本
    在vs2010使用EF出现CS0012: 类型“System.Data.Objects.DataClasses.EntityObject”在未被引用的程序集中定义
  • 原文地址:https://www.cnblogs.com/cpcpp/p/12956321.html
Copyright © 2011-2022 走看看