敞开生长之旅!这是我参与「日新方案 12 月更文挑战」的第34天,点击检查活动概况

Git利器-分支

分支是从主线别离出去的“副本”,分支就像是平行世界,可独立开展,独立编辑、提交,也能够和其他分支兼并。分支是Git的核心必杀利器之一,分支创立、切换、删去都十分快,他十分的轻量。所以,早建分支!多用分支!

Git入门图文教程⑥-Git利器[分支]

分支Branch

比方有一个项目团队,准备10月份发布新版别,要新开发一堆黑科技功用,占领市场。你和小伙伴“小美”一同负责开发一个新功用A,开发周期2周,在这两周你们的代码不能影响其他人,不影响主分支。这个时分就可认为这个新功用创立一个分支,你们两在这个分支上干活,2周后代码开发完了、测试通过,就能够兼并进要发版的开发分支了。安全、高效,不影响其他人作业,完美!

Git入门图文教程⑥-Git利器[分支]

在实际项目中,一般会建几个主线分支。

  • 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 从远端remotehotfix分支创立本地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 switchgit reset指令。

  • git switch:专门用来完结分支切换。
  • git reset:专门用来完结本地修正的吊销,更多可参阅后续“reset”内容。
$ git branch
  dev
* main
# 列出了当时的一切分支,星号“*”最初的“main”为当时活动分支。

分支的切换checkout

代码库房能够有多个分支,master为默许的主分支,但只有一个分支在作业状态。所以要操作不同分支,需求切换到该分支,HEAD便是指向当时正在活动的分支。

Git入门图文教程⑥-Git利器[分支]

# 切换到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]兼并到当时分支。依据要兼并的内容的不同,详细兼并过程就会有多种状况。

Git入门图文教程⑥-Git利器[分支]

快速兼并(Fast forward)

如下图,master分支么有任何提交,“git merge dev”兼并分支devmaster,此刻兼并速度就十分快,直接移动master的“指针”引证到dev即可。这便是快速兼并(Fast forward),不会发生新的提交。

Git入门图文教程⑥-Git利器[分支]

  • 兼并devmaster,留意要先切换到master分支,然后履行git merge dev,把dev兼并到当时分支。

强制不必快速兼并git merge --no-ff -m "merge with no-ff" dev,参数--no-ff不启用快速兼并,会发生一个新的兼并提交记载。

普通兼并

假如master有改变,存在分支穿插,则会把两边的改变兼并成一个提交。

  • 假如两边改变的文件不同,没有什么抵触,就自动兼并了。
  • 假如有修正同一个文件,则会存在抵触,到底该选用哪边的,程序无法判别,就换发生抵触。抵触内容需求人工修正后再重新提交,才干完结终究的兼并。

Git入门图文教程⑥-Git利器[分支]

上图中,创立dev分支后,两个分支都有修正提交,因此两个分支就不在一条次序线上了,此刻兼并devmaster就得把他们的修正进行兼并操作了。

  • v5v7一起先人是v4,从这里开始分叉。
  • Git 会用两个分支的末端v6v8以及它们的一起先人v4进行三方兼并计算。兼并之后会生成一个新(和并)提交v9
  • 兼并提交v9就有两个先人v6v8

处理抵触<<<<<<< HEAD

在有抵触的文件中,<<<<<<< HEAD最初的内容就表示是有抵触的部分,需求人工处理,能够凭借一些第三方的对比东西。人工处理结束后,完结兼并提交,才终究完结此次兼并。=======分割线上方是当时分支的内容,下方是被兼并分支的改变内容。

Git入门图文教程⑥-Git利器[分支]

变基rebase

把两个分支的修正内容兼并到一同的方法有两种:mergerebase,效果都是相同的,区别是rebase的提交前史更简洁,干掉了分叉,merge的提交前史更完整。

Git入门图文教程⑥-Git利器[分支]

  • dev上履行“git rebase master”变基,将dev分支上分叉的v7v8生成补丁,然后在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常用指令集合

️版权声明:版权一切@安木夕,本文内容仅供学习,欢迎指正、交流,转载请注明出处!