【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 pullGit会自动识别去哪个服务器上抓取、合并到哪个分支。

当克隆一个仓库时,它通常会自动创建一个跟踪origin/mastermaster分支,你也可以设置跟踪其它的分支,可以用如下命令来跟踪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分支。


对于百分之九十的应用场景,上面几篇文章的内容已经完全够用了,当你遇到其它非常特殊的情况,可以 查阅文档


本文到此结束!

如果对你有帮助,请随手 点个赞点喜欢

=======================================================

欢迎【关注作者、私信作者】。我们一起交流一起进步。

=======================================================

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

huixieqingchun

钟意作者

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值