三、Git中常用命令——分支管理

为什么要使用分支管理?

分支就是科幻电影里面的平行宇宙,也就是当你正在电脑前努力学习Git的时候,另一个你正在另一个平行宇宙里努力学习SVN。

如果两个平行宇宙互不干扰,那就对现在的你也没有什么影响。当然,如果在某一时间点两个平行宇宙合并了,那你就既学会了Git又学会了SVN。

3.1 创建与合并分支

  • 为什么要创建分支?

    在实际开发的过程中,假设你准备开发一个新功能,但是需要几周才能完成,可是你在过去的两周里也只完成了50%的代码,这个时候如果你直接提交,那么不完整的代码会导致别人不能继续编写,如果你等代码全部写完再一次提交,你又会面临着代码丢失每天进度的巨大风险。

    如果你创建了自己的分支,这个分支别人是看不到的,你可以在你的分支上工作,想何时提交就何时提交,直到你完成全部的开发工作后,再一次性的合并到原来的分支上,这样既安全又不会影响别人的工作。

  • 创建分支

  1. 创建并切换分支(这两种命令作用相同)

    #分开执行(先创建 再切换)
    $ git branch dev
    $ git checkout dev
    Switched to branch 'dev'#合并命令(创建并切换)
    git checkout -b dev
    

  2. 对readme.txt文件做修改,加上一行:

    Creating a new Branch called dev.
    
  3. 把readme.txt文件添加至版本库:

    $ git add readme.txt
    $ git commit -m "add new branch"
    [dev 96c9108] add new branch1 file changed, 2 insertions(+), 1 deletion(-)
    

  4. 创建过程


  • 合并分支
  1. 切换到主分支

    $ git checkout master
    Switched to branch 'master'
    

  2. 合并分支

    $ git merge dev
    Updating 2217b6e..96c9108
    Fast-forwardreadme.txt | 3 ++-1 file changed, 2 insertions(+), 1 deletion(-)
    

    ▲ merge命令用于合并指定分支到当前分支;
    ▲ Fast-forward合并是“快进模式”,也就是直接把master指向dev当前的提交;
    ▲ $ git merge --no-ff -m “merge with no-ff” dev表示强制禁用“快进模式”,Git会在merge时生成一个新的commit,这样的话,从分支历史上可以看出分支信息。
    ▲ 合并分支时,加上–no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。

  3. 删除分支

    $ git branch -d dev
    Deleted branch dev (was 96c9108).
    

  4. 合并过程

小贴士:
防止和撤销修改的checkout命令搞混淆,创建并切换分支可以使用:$ git switch -c dev这个命令,直接切换到已有的master分支可以使用:$ git switch master这个命令。

3.2 解决冲突

我们创建并快速合并分支的方法对我们来说很是便利,但是合并的过程也往往并不是一帆风顺的,当遇到合并冲突时,我们必须要先解决冲突再合并。

  1. 创建一个新的分支feature:

    $ git switch -c feature
    Switched to a new branch 'feature'
    

  2. 修改readme.txt文件的内容:

    Creating a new Branch called dev is quick.
    
  3. 在分支feature上提交:

    $ git add readme.txt
    $ git commit -m "feature changes"
    [feature dffe6fe] feature changes
    

  4. 切换到master分支:

    $ git switch master
    Switched to branch 'master'
    

  5. 再次修改readme.txt文件的内容:

    Creating a new Branch called dev is quick and simple.
    
  6. 在分支master上提交:

    $ git add readme.txt
    $ git commit -m "master changes"
    [master 0b14971] master changes1 file changed, 1 insertion(+), 1 deletion(-)
    

  7. 快速合并:

    $ git merge feature
    Auto-merging readme.txt
    CONFLICT (content): Merge conflict in readme.txt
    Automatic merge failed; fix conflicts and then commit the result.
    

    这个时候我们会看见,这和之前我们的合并结果怎么不一样呢?你没看错,它提示我们,合并起了冲突,那这个冲突是怎么引起的呢?

    我们可以查看这时文件的状态:

    同时,我们也可以在readme.txt文件中看到:

  8. 解决冲突:

    现在我们可以查看最后一次msater修改的内容,只需要将内容的最终版本修改后再次提交即可:

    Git is a distributed version control system.
    Git is free software distributed under the GPL.
    Git has a mutable index called stage.
    Git tracks changes.
    Creating a new Branch called dev is quick and simple.
    
    $ git add readme.txt
    $ git commit -m "deal with conflict"
    [master 06be32a] deal with conflict
    
  9. 查看合并情况:

    用命令查看:

    $ git log --graph
    

  10. 删除分支:

    $ git branch -d feature
    Deleted branch feature (was dffe6fe).
    

3.3 分支管理策略

Git分支十分强大,在团队开发中应该充分应用。

在实际开发中,我们应该按照几个基本原则进行分支管理:

▲ 首先,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;

▲ 然后那在哪干活呢?干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;

▲ 也就是说,你和你的小伙伴们每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了。

所以,团队合作的分支看起来就是这个样子的:

3.4 Bug分支

在软件开发的过程中,bug就像是家常便饭,有了bug就需要修复,在Git中的bug也是一样的。

在Git中,由于分支非常强大,所以,每个bug都可以通过一个新的临时分支来修复,修复后合并分支,然后将临时分支删除。

  1. 查看当前分支状态:

    $ git status
    On branch master
    Changes not staged for commit:(use "git add <file>..." to update what will be committed)(use "git restore <file>..." to discard changes in working directory)modified:   readme.txtno changes added to commit (use "git add" and/or "git commit -a")
    

    很明显,当前我还正在工作,并且内容也并没有提交,这时我还必须要修复领导发来的一个bug任务,当我不知道该怎么办时,突然想起来,Git还提供了将当前工作现场藏起来的命令

  2. 隐藏当前工作现场:

    $ git stash
    Saved working directory and index state WIP on master: 06be32a deal with conflict
    

  3. 创建临时分支:

    $ git checkout master
    Already on 'master'$ git switch -c bug-101
    Switched to a new branch 'bug-101'
    

  4. 修复bug:

    这个bug我们假设就是将readme.txt中最后一句改为:bug is already resolved…,然后提交:

    bug is already resolved...
    
    $ git add readme.txt
    $ git commit -m "deal with bug-101"
    [bug-101 61a5f34] deal with bug-1011 file changed, 2 insertions(+), 1 deletion(-)
    

  5. 合并分支:

    $ git switch master
    Switched to branch 'master'$ git merge --no-f -m "merge bug-101" bug-101
    Merge made by the 'recursive' strategy.readme.txt | 3 ++-1 file changed, 2 insertions(+), 1 deletion(-)
    

  6. 删除bug-101分支:

    $ git branch -d bug-101
    Deleted branch bug-101 (was 61a5f34).
    

  7. 回到工作现场:

    $ git stash list
    stash@{0}: WIP on master: 06be32a deal with conflict
    #恢复的同时把stash内容也删除
    $ git stash pop
    Auto-merging readme.txt
    CONFLICT (content): Merge conflict in readme.txt
    The stash entry is kept in case you need it again.#先恢复
    $ git stash apply
    #再删除
    $ git stash drop
    

思考?
我们刚刚是在master分支上修复了bug,那么如何在master分支分出的dev分支上修复同样的bug呢?
重复上述操作,晕…我当然知道,但是有没有更简单的方法呢?
那必须得有啊!!!
Git中提供了一个 $ git cherry-pick 版本号这个命令,将master分支上修复bug的提交复制到dev分支上,只是这时Git自动给dev分支做了一次提交,它的版本号并不等同于master中的版本号。

3.5 Feature分支

在开发的过程中,可能需要不断的添加新功能,这个时候你就需要不断经历的添加新的分支,完成开发后合并到最后删除这个过程。

但是!当你已经开发完毕之后准备合并,却从老板口中传来不幸的噩耗:因经费不足,此功能必须取消!oh!My God!白干了呜呜呜…

虽然白干了,但是这些机密的资料的分支还是必须要销毁的,当使用命令删除时:

$ git branch -d feature-vulcan
error: The branch 'feature-vulcan' is not fully merged.
If you are sure you want to delete it, run 'git branch -D feature-vulcan'.

他会不断的提示你:此分支还没有被合并,如果删除,将丢掉修改,如果要强行删除,需要使用-D参数:

$ git branch -D feature-vulcan
Deleted branch feature-vulcan (was 287773e).

哎,世界终于清净了…

3.6 多人协作

  • 查看远程库信息,使用git remote -v;

  • 本地新建的分支如果不推送到远程,对其他人就是不可见的;

  • 从本地推送分支,使用git push origin branch-name,如果推送失败,先用git pull抓取远程的新提交;

  • 在本地创建和远程分支对应的分支,使用git checkout -b branch-name origin/branch-name,本地和远程分支的名称最好一致;

  • 建立本地分支和远程分支的关联,使用git branch --set-upstream branch-name origin/branch-name;

  • 从远程抓取分支,使用git pull,如果有冲突,要先处理冲突。

温馨小贴士:后期我们一般使用开发工具推送和抓取,对于要求不高的小伙伴可以了解即可。

3.7 Rebase

  • rebase操作可以把本地未push的分叉提交历史整理成直线;

  • rebase的目的是使得我们在查看历史提交的变化时更容易,因为分叉的提交需要三方对比。

Git之(三)Git中常用命令——分支管理相关推荐

  1. Git常用命令——分支操作

    Git常用命令--分支操作 分支操作 git branch 列出,创建或者删除分支 git branch <branchName> :创建一个分支 git branch -d <br ...

  2. Git版本控制软件结合GitHub常用命令学习手册

    编程技术2015-1-16TECHUG1条评论 我们发布了很多Git相关的文章,有系列教程(<Pro Git系列>),也有各种独门绝技(<让你的Git水平更上一层楼的10个小贴士&g ...

  3. git连接远程仓库以及常用命令

    git连接远程仓库以及常用命令 git 连接远程仓库 git ssh key配置 本地配置 git配置 git连接远程仓库 关联远程仓库(将本地仓库推送到新的远程仓库) git常用命令(包括clone ...

  4. git config credential.helper及常用命令

    命令: git config credential.helper <方式>常用命令: git config credential.helper 'cache --timeout 0' # ...

  5. gitlab 构建tag_GitLab常用命令 分支 Tag 配置 操作

    一.从SVN迁出到本地Git仓库(还没有配置Git仓库的,直接看第八条) git svn clone ""                ##注意路径需要双引号引起来 二.在远程仓 ...

  6. 【方向盘】达到Linux第三阶段的常用命令笔记记录---Part Ⅱ

    实现自己既定的目标,必须能耐得住寂寞单干 本文已被https://yourbatman.cn收录:女娲Knife-Initializr工程可公开访问啦:程序员专用网盘https://wangpan.y ...

  7. centos中常用命令

    centos中常用命令 一:使用 CentOS 常用命令查看 cpu 如果觉得需要看的更加舒服 grep "model name" /proc/cpuinfo | cut -f2 ...

  8. Redis 中常用命令

    Redis 中常用命令 keys 返回满足给定 pattern 的所有 key. 127.0.0.1:6379> keys *1) "name2"2) "myzse ...

  9. Linux系统中常用命令行命令、快捷键、创建长路径的快捷键

    Linux系统中常用命令行命令.快捷键.创建长路径的快捷键 1.常用Linux命令: 1.1 文件和目录: cd /home 进入 '/home' 目录 cd - 返回上一级目录 cd -/- 返回上 ...

最新文章

  1. C++ - 给出一个函数来连接两个字符串A和B,其中字符串A的后几个字节和字符串B的前几个字节重叠
  2. 工欲善其事必先利其器,一款开源编码辅助工具~
  3. 你好~520|Python花式表白的几种姿势
  4. 前端学习(2136):使用es6模块化出现Access to script at ‘file:///... ..from origin ‘null‘ has been blocked。。。错误
  5. 二分法python上机实验报告_二分查找-Python刷题笔记
  6. python正弦波和等腰三角波_51proteus仿真:生成方波、正弦波、锯齿波和三角波
  7. Go 上下文取消操作
  8. Slickflow.NET核心开源工作流引擎
  9. 3d数学基础:图形和游戏开发(第2版)_游戏引擎编程需要哪些基本数学知识?
  10. 从入门到进阶,这10本高分书籍,优秀数据分析师越早读完越好
  11. [leetcode]211. 添加与搜索单词 - 数据结构设计 ---前缀树解法
  12. rdkit GetAtoms获取化合物每个位置的索引;rdkit FindMCS大公共相同结构 找不同化合物之间的差异
  13. 数据传输服务器系统图,档案数字化管理系统
  14. Python安装shapely包出现WindowsError: [Error 126]解决方案
  15. LeetCode简单题之三除数
  16. unbalanced enable irq
  17. win11资源管理器总是自动重启的解决方法
  18. springmvc集成shiro后,session、request姓汪还是姓蒋 ?
  19. 13 新品种:导弹发射器 (和儿子一起编游戏-塔防系列 )
  20. Kali Linux渗透测试 093 自动注入-Sqlmap

热门文章

  1. 2018年专业技术人员权益保护-测试题答案
  2. c语言程序设计精髓 第14周练兵题
  3. 华三防火墙配置IPSec隧道
  4. LINUX IIO子系统分析之七 虚拟iio device驱动实现
  5. 电脑爱好者——投稿与稿费指南
  6. android scroller,高级UI第四十四篇:Android Scroller详解
  7. CoAP协议学习——CoAP基础
  8. Linux Bridge的IP NAT细节探析-填补又一坑的过程
  9. (超详细)XSS和SQL注入-网络渗透测试实验三
  10. python依照概率抽样_统计概率思维之总体与抽样