【04】进阶:Git系统中的分支操作与管理
总第95篇
接上篇,本篇文章将详细梳理Git
系统分支相关的操作,包括分支的新建与合并、分支的管理及变基等。Git
的分支模型非常轻量型,你可以非常方便地创建分支以及在不同的分支间切换。可以说,Git
的分支模型是它的亮点之一,也是它从众多版本控制系统中脱颖而出的关键。
1.Git
分支是什么
当我们在Git
中进行提交时,Git
会保存一个提交对象,此提交对象包含一个指向暂存内容快照的指针、提交相关的附注信息和指向它的父对象指针。对于首次提交的对象没有父对象,普通提交操作产生的提交对象有一个父对象,而由多个分支合并产生的提交对象有多个父对象。
Git
分支,本质上仅仅是指向提交对象的可变指针。Git
的默认分支名字是master
,这是用git init
命令时默认创建的,在你每次提交时,master
分支都会自动向前移动。
当我们在项目的某个节点创建一个分支后,并不会将此节点对应的节点代码复制一份出来,只是将新分支指向此节点,这在很大程度上可以减少空间上的开销。
2.分支的创建与切换
- 创建分支
创建分支非常简单,可以用命令git branch <branch-name>
创建一个名为branch-name
的分支。 创建一个新的分支,它只是在当前提交对象上创建一个可以移动的指针。
在Git
系统中,有一个名为HEAD
的特殊指针,它总是指向当前所在的本地分支。
注意,当我们创建一个新分支后,并不会自动切换到新分支中去,若要切换,需要我们手动执行相关命令。
可以用命令git log --oneline --decorate
可以查看各个分支当前所指的对象。
- 切换分支
要切换到一个已存在的分支,你可以使用命令git checkout <branch-name>
,这样HEAD
指针就指向branch-name
分支了。
请注意,分支切换会改变你的工作目录中的文件。若切换到一个较旧的分支,你的工作目录会恢复到此分支最后一次提交的样子,如果Git
不能干净利落地完成这个任务,它将禁止切换分支。
一般我们可以用一条命令实现创建新分支并切换过去:git checkout -b <new-branch-name>
。
3.分支的合并与冲突解决
- 分支合并
分支合并时,可以用命令git merge <branch>
将当前分支合并到branch
分支上。
若在合并时,当前分支与目标分支是直接后继关系,那么合并操作没有分歧需要解决,这种合并只会简单地将指针向前推进,也称做”快进“。
当两个分支合并后,其中的一个临时分支就没用了,你应该删除。可以用命令git branch -d <branch>
删除branch
分支。
若在合并时,当前分支与目标分支不是直接后继关系,而是有共同的祖先时,Git
会使用两个分支末端所指的快照以及这两个分支的共同祖先,做一个简单的三方合并
。 这个三方合并
结果是生成一个新的快照并且自动创建一个新的提交指向它,这是一次合并提交,它不止一个父提交。
- 冲突解决
有时可能你在两个不同的分支中,对同一个文件的同一部分进行了不同的修改,此是Git
就无法干净地合并它们,会产生合并冲突。在这种情况下,Git
只做了合并,没有自动创建一个合并提交。Git
会暂停下来,等待你去解决合并产生的冲突。
你可以在产生冲突后,用git status
命令查看哪些文件产生了冲突,去解决掉冲突后,对冲突的每个文件执行git add
命令,此时,Git
会将这些原本冲突的文件标记为冲突已解决
。 再手动执行一次git commit
即可。
4.推送与跟踪分支
- 推送
当你想要公开分享一个分支时,需要将其推送到有写入权限的远程仓库上。本地的分支并不会自动与远程仓库同步,你必须显式地推送想要分享的分支。
比如,你和别人协同在名为dev
分支上工作,你需要将自己的代码推送到远程,可用命令git push origin dev
,此命令中Git
会自动将分支名字展开为:
refs/heads/dev:refs/heads/dev
,即将本地的dev
分支推送到远程的dev
分支。
根据这种原理,你也可以用这种方式推送:
git push origin <local-branch>:<remote-branch>
。
- 跟踪分支
从一个远程分支检出一个本地分支会自动创建跟踪分支。若在一个跟踪分支上输入git pull
,Git
会自动识别去哪个服务器上抓取、合并到哪个分支。
当克隆一个仓库时,它通常会自动创建一个跟踪origin/master
的master
分支,你也可以设置跟踪其它的分支,可以用如下命令来跟踪dev
分支:
git checkout --track origin/dev
可以用如下命令来修改跟踪的远程分支:
git branch -u origin/suapp
修改为跟踪suapp
分支。
可以用如下命令来查看所有跟踪分支的设置情况:
git branch -vv
- 拉取
git fetch
命令只会从服务器上抓取本地没有的数据,它不会修改工作目录中的内容,合并需要你自己手动来完成。
git pull
在大多数情况下的含义是一个git fetch
命令紧跟着一个git merge
命令。
- 删除远程分支
对于服务器上无用的分支可以运行如下命令删除。
git push origin --delete example
删除example
分支。
对于百分之九十的应用场景,上面几篇文章的内容已经完全够用了,当你遇到其它非常特殊的情况,可以 查阅文档 。
本文到此结束!
如果对你有帮助,请随手 点个赞 或 点喜欢!
=======================================================
欢迎【关注作者、私信作者】。我们一起交流一起进步。
=======================================================
【04】进阶:Git系统中的分支操作与管理相关推荐
- Git实战:branch分支操作详解
什么是分支 分支是指在主干道上分支的支线,可以前往不同的地方,也可以到达相同的终点(只是实现的路线不同).Git指向团队开发中的个体,各开发者可以有自己的分支,开发时不会影响其他分支的开发进度.分支完 ...
- Git 企业中常用分支管理策略
Git 企业中常用分支管理策略 一般企业中开发一个项目的分支策略 主分支 master 开发分支 develop 功能分支 feature 预发布分支 release bug 分支 fixbug 其它 ...
- 组群的基本概念linux,linux课件-Linux系统中组群与用户管理.ppt
<linux课件-Linux系统中组群与用户管理.ppt>由会员分享,可在线阅读,更多相关<linux课件-Linux系统中组群与用户管理.ppt(66页珍藏版)>请在装配图网 ...
- 在请求分页虚存管理系统中_请求分页式系统中,以页为单位管理用户的虚空间,以段为单位管理内存空间_学小易找答案...
[简答题]OS作为接口,通过哪几种方式实现? [简答题]并发与并行有什么区别? [判断题]请求分页式系统中,以页为单位管理用户的虚空间,以段为单位管理内存空间 [简答题]微内核是否是完整的OS? [单 ...
- linux分区变为空闲,分析linux系统中磁盘空闲空间的管理方法
分析linux系统中磁盘空闲空间的管理方法 汪建国 摘要:要把文件信息存放在存储介质上,必须先找出存储介质上可供使用的空闲块.如何实现存储空间的分配和收回,取决于对空闲块的管理方法,主要有两种对磁盘存 ...
- git常用命令,分支操作,子模块
Git 是一个很强大的分布式版本管理工具,它不但适用于管理大型开源软件的源代码(如:linux kernel),管理私人的文档和源代码也有很多优势(如:wsi-lgame-pro) 二. Git 常用 ...
- Git之常见的分支操作
目录 分支管理 1.创建与合并分支 1.2switch 2.解决冲突 3.分支管理策略 4.分支策略 5.Bug分支 6.Feature分支 7.多人协作 8.推送分支 9.抓取分支 10.Rebas ...
- 使用git拉取项目分支操作
注:本文讲解以下面内容为参考案例 git地址:git@10.100.1.15:rd/frms-mgr-ebank.git 分支:3rd_bank/fubonbank 1.在本地创建一个文件夹 2.在本 ...
- git 怎么备份本地分支_同步管理本地git仓库和github仓库上的分支
参考文章 分支管理策略 在实际开发中,我们应该按照几个基本原则进行分支管理: 首先,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活 那在哪里干活呢?干活都在 dev分支上 ...
最新文章
- 简明python教程 --C++程序员的视角(九):函数式编程、特殊类方法、测试及其他...
- 【转载】如果你身边有程序员的朋友,请善待他们
- 三种方法实现CSS三栏布局
- mysql怎么防止误操作_MySQL数据库防止人为误操作的实例讲解
- 调用父级方法_通信:找到任意组件实例的findComponents系列方法,5个终极方案
- cocos2d js调用java_【cocos2d-js官方文档】二十四、如何在android平台上使用js直接调用Java方法...
- 《江湖X:汉家江湖》两万人在线服务器架构
- java xml 合并_Java中合并XML文档的设计与实现
- caffe安装_目标检测之caffe-ssd模型训练与测试
- 第三十三期:对于人工智能的恐惧及其5个解决方法
- AKKA 集群中的发布与订阅Distributed Publish Subscribe in Cluster
- Codeforces Round #401 (Div. 2) C Alyona and Spreadsheet —— 打表
- Linux日志被删处理方法
- 学习英语,先记下留着后用
- matlab插值函数的作用,matlab 插值函数
- c语言发生错误文件无效或损坏,VC2010编译时提示:转换到 COFF 期间失败: 文件无效或损坏...
- 保研面试常考题总结(自用 不断更新)
- 想要快速、免费的翻译外文PDF文档?Get翻译神器
- 单片机c语言sfr数据读,单片机c语言的sbit和sfr.docx
- 太阳能光伏发电和路灯应用系统的详细计算