总第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
分支。
对于百分之九十的应用场景,上面几篇文章的内容已经完全够用了,当你遇到其它非常特殊的情况,可以 查阅文档 。
本文到此结束!
如果对你有帮助,请随手 点个赞 或 点喜欢!
=======================================================
欢迎【关注作者、私信作者】。我们一起交流一起进步。
=======================================================