敞开生长之旅!这是我参与「日新方案 12 月更文挑战」的第34天,点击检查活动概况
Git利器-分支
分支是从主线别离出去的“副本”,分支就像是平行世界,可独立开展,独立编辑、提交,也能够和其他分支兼并。分支是Git的核心必杀利器之一,分支创立、切换、删去都十分快,他十分的轻量。所以,早建分支!多用分支!
分支Branch
比方有一个项目团队,准备10月份发布新版别,要新开发一堆黑科技功用,占领市场。你和小伙伴“小美”一同负责开发一个新功用A,开发周期2周,在这两周你们的代码不能影响其他人,不影响主分支。这个时分就可认为这个新功用创立一个分支,你们两在这个分支上干活,2周后代码开发完了、测试通过,就能够兼并进要发版的开发分支了。安全、高效,不影响其他人作业,完美!
在实际项目中,一般会建几个主线分支。
- master:作为主分支,寄存安稳的代码,便是开发后测试通过的代码,不允许随意修正和兼并。
- 开发分支:用于团队日常开发用,比方团队方案10月份开发10个功用并发版,则在此分支上进行,不影响主分支的安稳。
- 功用A分支:开发人员依据自己的需求,能够创立一些临时分支用于特定功用的开发,开发结束后再兼并到开发分支,并删去该分支。
分支 便是指向某一个提交记载的“指针”引证,因此创立分支是十分快的,不管库房多大。当咱们运行git branch dev
创立了一个名字为dev
的分支,Git实际上是在.git\refs\heads
下创立一个dev
的引证文件(没有扩展名)。
$ git branch dev
$ cat .git/refs/heads/dev
ca88989e7c286fb4ba56785c2cd8727ea1a07b97
分支指令
指令 | 描绘 |
---|---|
git branch | 列出一切本地分支,加参数-v 显现详细列表,下同 |
git branch -r | 列出一切长途分支 |
git branch -a | 列出一切本地分支和长途分支,用不同色彩区别 |
git branch [branch-name] | 新建一个分支,但仍然停留在当时分支 |
git branch -d dev | 删去dev 分支,-D(大写)强制删去 |
git checkout -b dev | 从当时分支创立并切换到dev 分支 |
git checkout -b feature1 dev | 从本地dev 分支代码创立一个 feature1 分支,并切换到新分支 |
git branch [branch] [commit] | 新建一个分支,指向指定commit id
|
git branch –track [branch] [remote-branch] | 新建一个分支,与指定的长途分支树立相关 |
git checkout -b hotfix remote hotfix | 从远端remote 的hotfix 分支创立本地hotfix 分支 |
git branch –set-upstream [branch] [remote-branch] | 在现有分支与指定的长途分支之间树立盯梢相关:git branch --set-upstream hotfix remote/hotfix
|
git checkout [branch-name] | 切换到指定分支,并更新作业区 |
git checkout . | 吊销作业区的(未暂存)修正,把暂存区恢复到作业区。 |
git checkout HEAD . | 吊销作业区、暂存区的修正,用HEAD 指向的当时分支最新版别替换 |
git merge [branch] | 兼并指定分支到当时分支 |
git merge –no-ff dev | 兼并dev 分支到当时分支,参数--no-ff 禁用快速兼并模式 |
git push origin –delete [branch-name] | 删去长途分支 |
git rebase master | 将当时分支变基兼并到master 分支 |
✅switch:新的分支切换指令 | 切换功用和checkout 相同,switch 只单纯的用于切换 |
git switch master | 切换到已有的master 分支 |
git switch -c dev | 创立并切换到新的dev 分支 |
关于
checkout
指令:checkout
是Git的底层指令,比较常用,也比较危险,他会重写作业区。支撑的功用比较多,能吊销修正,能切换分支,这也导致了这个指令比较复杂。在Git 2.23版别以后,增加了git switch
、git reset
指令。
git switch
:专门用来完结分支切换。git reset
:专门用来完结本地修正的吊销,更多可参阅后续“reset”内容。
$ git branch
dev
* main
# 列出了当时的一切分支,星号“*”最初的“main”为当时活动分支。
分支的切换checkout
代码库房能够有多个分支,master
为默许的主分支,但只有一个分支在作业状态。所以要操作不同分支,需求切换到该分支,HEAD
便是指向当时正在活动的分支。
# 切换到dev分支,HEAD指向了dev
# 此处 switch 效果同 checkout,switch只用于切换,不像checkout功用很多
$ git switch dev
Switched to branch 'dev'
$ cat .git/HEAD
ref: refs/heads/dev
运用 git checkout dev
切换分支时,干了两件事:
- ①、
HEAD
指向dev
:修正HEAD
的“指针”引证,指向dev
分支。 - ②、还原作业空间:把
dev
分支内容还原到作业空间。
此刻的活动分支便是dev
了,后续的提交就会更新到dev
分支了。
❓切换时还没提交的代码怎么办?
- 假如修正(包含未暂存、已暂存)和待切换的分支没有抵触,则切换效果,且未提交修正会一同带过去,所以要留意!
- 假如有抵触,则会报错,提示先提交或躲藏,关于躲藏可检查后续章节内容“stash”。
兼并merge&抵触
把两个分支的修正内容兼并到一同,常用的兼并指令git merge [branch]
,将分支[branch]
兼并到当时分支。依据要兼并的内容的不同,详细兼并过程就会有多种状况。
快速兼并(Fast forward)
如下图,master
分支么有任何提交,“git merge dev
”兼并分支dev
到master
,此刻兼并速度就十分快,直接移动master
的“指针”引证到dev
即可。这便是快速兼并(Fast forward),不会发生新的提交。
- 兼并
dev
到master
,留意要先切换到master
分支,然后履行git merge dev
,把dev
兼并到当时分支。
强制不必快速兼并:
git merge --no-ff -m "merge with no-ff" dev
,参数--no-ff
不启用快速兼并,会发生一个新的兼并提交记载。
普通兼并
假如master
有改变,存在分支穿插,则会把两边的改变兼并成一个提交。
- 假如两边改变的文件不同,没有什么抵触,就自动兼并了。
- 假如有修正同一个文件,则会存在抵触,到底该选用哪边的,程序无法判别,就换发生抵触。抵触内容需求人工修正后再重新提交,才干完结终究的兼并。
上图中,创立dev
分支后,两个分支都有修正提交,因此两个分支就不在一条次序线上了,此刻兼并dev
到master
就得把他们的修正进行兼并操作了。
-
v5
、v7
一起先人是v4
,从这里开始分叉。 - Git 会用两个分支的末端
v6
和v8
以及它们的一起先人v4
进行三方兼并计算。兼并之后会生成一个新(和并)提交v9
。 - 兼并提交
v9
就有两个先人v6
、v8
。
处理抵触<<<<<<< HEAD
在有抵触的文件中,<<<<<<< HEAD
最初的内容就表示是有抵触的部分,需求人工处理,能够凭借一些第三方的对比东西。人工处理结束后,完结兼并提交,才终究完结此次兼并。=======
分割线上方是当时分支的内容,下方是被兼并分支的改变内容。
变基rebase
把两个分支的修正内容兼并到一同的方法有两种:merge
和 rebase
,效果都是相同的,区别是rebase
的提交前史更简洁,干掉了分叉,merge的提交前史更完整。
- 在
dev
上履行“git rebase master
”变基,将dev
分支上分叉的v7
、v8
生成补丁,然后在master
分支上应用补丁,发生新的v7'
、v8'
新的提交。 - 然后回到
master
分支,完结兼并git merge dev
,此刻的兼并便是快速兼并了。 - 终究的提交记载就没有分叉了。
$ git rebase master
$ git checkout master
$ git merge dev
参阅资料
- 博客园 | 深入浅出Git教程
- 猴子都能懂的GIT入门
- 廖雪峰的GIT教程
- 电子书《ProGit-Git教程》
- Gitee码云的 Git 大全,真的挺全
- 灵敏过程实践-git代码分支办理标准
- 易百教程-Git教程?
- 在线Git学习+练习
- GUI Clients Git网站上的GUI东西列表
- Git常用指令集合
️版权声明:版权一切@安木夕,本文内容仅供学习,欢迎指正、交流,转载请注明出处!