工欲善其事,必先利其器

分支

分支是简单的概念,和日常生活中用到的一样,比如说头发分杈:从一根开始分成了2根甚至更多,每一个分杈就是一个分支。

git的分支功能让它的使用方便了很多。每一个分支是相互独立的环境,你修改了一个分支,别的分支不会受到影响。

最大的好处就是,你可以分别在不同的分支干不同的事情,而且互相不受影响。比如你在电脑上写代码,突然手机收到推送“美国和伊朗打起来了”,你的注意力从代码切换到手机的新闻,注意力从写代码切换到看手机,在手机上干什么都不影响你在电脑上写的代码。这时候老板刚好过来,你赶紧放下手机,继续写代码,老板走了你继续看手机。老板频繁的路过,你不停的在写代码和看手机这2个分支切换,2者互相没有干扰,最终你写完了代码也看完了新闻。这就是分支的意义。

举个栗子

知道了分支的意义,那我们用一个栗子看看如何在git中利用分支。

还是利用之前创建的git_test做示范,最新的提交创建了一个问题,顺便利用查看git的方法看看

ymj@ymj-pc:~/git_test$ git log --onelinea57b57f (HEAD -> master) 创建问题cbdc648 fix buge595e94 add math.txt43b1405 init commitymj@ymj-pc:~/git_test$ git show a57b57f --onelinea57b57f (HEAD -> master) 创建问题diff --git a/math.txt b/math.txtindex 2ec5ffb..69636f4 100644--- a/math.txt+++ b/math.txt@@ -1 +1,5 @@ 1 + 1 = 2++下面有几个#?+###+###

可以看见多了一个“创建问题”的提交,修改的内容是增加了一个数井号(#)个数的问题。

我们有好几种方法计算#的个数,那我们用不同的分支计算把:

查看当前分支

ymj@ymj-pc:~/git_test$ git branch * master

当前分支名字叫做master,这是git自动创建的,每个仓库默认只有一个master分支(主分支),前面有个星号(*)说明那就是当前分支。

这里就知道git log的显示的“HEAD -> master”,其实就是当前分支为master,HEAD和星号表示的是相同的意思,代表当前分支是哪个。

如何创建分支

ymj@ymj-pc:~/git_test$ git branch f1ymj@ymj-pc:~/git_test$ git branch   f1* master

使用git branch f1创建了一个名为f1的分支,但是当前分支为master。

创建的分支和当前分支完全一样,我们创建一个提交看看:

ymj@ymj-pc:~/git_test$ git show --oneline8abe1f0 (HEAD -> master) 1+1+1+1+1+1diff --git a/math.txt b/math.txtindex 69636f4..72920bb 100644--- a/math.txt+++ b/math.txt@@ -3,3 +3,5 @@ 下面有几个#? ### ###++1+1+1+1+1+1 = 6

在master分支提交了“1+1+1+1+1+1 = 6”,此时master前进了一个提交,f1还在原来的地方。

切换分支

ymj@ymj-pc:~/git_test$ git checkout f1 切换到分支 'f1'ymj@ymj-pc:~/git_test$ git branch * f1  masterymj@ymj-pc:~/git_test$ git log --onelinea57b57f (HEAD -> f1) 创建问题cbdc648 fix buge595e94 add math.txt43b1405 init commit

使用“git checkout f1”切换到f1分支,可通过 “git branch”的星号和“git log”的HEAD看出。(通过git checkout -b b_name, 可以创建分支的同时切换过去)

并且在f1分支看不到“1+1+1+1+1+1 = 6”

ymj@ymj-pc:~/git_test$ cat math.txt 1 + 1 = 2下面有几个#?######

在f1分支提交新的方法:

ymj@ymj-pc:~/git_test$ git show --onelinea0ed2b7 (HEAD -> f1) 3+3=6diff --git a/math.txt b/math.txtindex 69636f4..abdbee4 100644--- a/math.txt+++ b/math.txt@@ -3,3 +3,4 @@ 下面有几个#? ### ###+3+3=6

f1分支和master分支没有互相影响。如果要把这2个分支修改的内容都合并在一起,那就需要合并分支了。

把2个分支的修改合并到一起,合并到master分支
一般使用git merge b_nane将名为b_nane的分支合并到当前分支。

所以先切换到master分支

git checkout master

然后合并f1分支到当前分支master

ymj@ymj-pc:~/git_test$ git merge f1自动合并 math.txt冲突(内容):合并冲突于 math.txt自动合并失败,修正冲突然后提交修正的结果。

提示出现冲突,自动合并失败。我们看看发生了什么

ymj@ymj-pc:~/git_test$ cat math.txt 1 + 1 = 2下面有几个#?######<<<<<<< HEAD1+1+1+1+1+1 = 6=======3+3=6>>>>>>> f1

原来我们2个分支在问题后面都有答案,此时git不知道该使用哪个,所以用

<<<<<<< HEAD1+1+1+1+1+1 = 6=======3+3=6>>>>>>> f1

这样的形式标记出了当前分支(HEAD)的改动,和f1分支的改动。我们需要将这一段手动修改为想要保留的形式:

方法1:1+1+1+1+1+1 = 6方法2:3+3=6

修改完之后继续add,git merge --continue,完成合并

ymj@ymj-pc:~/git_test$ git add math.txt ymj@ymj-pc:~/git_test$ git merge --continue[master ce8c35b] Merge branch 'f1'ymj@ymj-pc:~/git_test$ cat math.txt 1 + 1 = 2下面有几个#?######方法1:1+1+1+1+1+1 = 6方法2:3+3=6

删除无用分支

ymj@ymj-pc:~/git_test$ git branch -d f1 已删除分支 f1(曾为 a0ed2b7)。ymj@ymj-pc:~/git_test$ git branch * master

git branch -d 可以删除已经merge的分支,如果有内容没merge但是也不想要了,就git branch -D 强行删除(慎用,除非真的确定不想要了)。

如何避免冲突

其实不是每次合并都冲突的,经常直接merge就可以成功,这里为了说明冲突的情况。

冲突是因为2个分支修改了同一个地方,为了避免冲突,就不要同时修改同一个地方,这样就可以自动merge成功。不要害怕冲突,git就是帮你管理冲突,如果真的冲突了,那就手动改一下,也很方便。

还有2个特别好用的命令stash和cherry-pick

先说stash:
如果你在一个分支正在修改,但是没有commit,直接切换分支,未commit的内容会被带到新的分支。由于各种原因,现在不能commit,但是还想切换到别的分支工作,其他分支工作完成,继续当前工作,那么可以使用git stash将当前修改保存起来,下次切回来后git stash pop还原现场继续工作。(这个功能还能和git reset组合起来避免merge冲突,想想看如何实现?)

直接看使用例子吧:

我感觉math.txt前面的1+1=2很碍眼,想把它删掉。直接删除前2行,还没add、commit,但是这个时候突然想到数井号的问题还没完成,于是建立分支实现新方法,这个时候把改动先stash保存起来:

ymj@ymj-pc:~/git_test$ vi math.txt ymj@ymj-pc:~/git_test$ git diffdiff --git a/math.txt b/math.txtindex 461f29e..595a241 100644--- a/math.txt+++ b/math.txt@@ -1,5 +1,3 @@-1 + 1 = 2- 下面有几个#? ### ###ymj@ymj-pc:~/git_test$ git stash 保存工作目录和索引状态 WIP on master: ce8c35b Merge branch 'f1'ymj@ymj-pc:~/git_test$ git checkout -b f2切换到一个新分支 'f2'ymj@ymj-pc:~/git_test$ git branch * f2  master

这一系列操作看出我删除了2行,暂存了修改,创建并切换到f2分支。

之后我又增加了2次提交

ymj@ymj-pc:~/git_test$ git log --onelineda565e9 (HEAD -> f2) 2*3=6ec41b58 2+2+2=6ce8c35b (master) Merge branch 'f1'a0ed2b7 3+3=68abe1f0 1+1+1+1+1+1a57b57f 创建问题cbdc648 fix buge595e94 add math.txt43b1405 init commit

可以看出f2分支比master多了2个提交

da565e9 (HEAD -> f2) 2*3=6ec41b58 2+2+2=6

我觉得新增的2种方法很好,想把他们合并到master,但是这次我不用git merge,而是用git cherry-pick:

ymj@ymj-pc:~/git_test$ git checkout master 切换到分支 'master'ymj@ymj-pc:~/git_test$ git cherry-pick ec41b58 da565e9[master b03667e] 2+2+2=6 Date: Wed Jan 8 23:43:16 2020 +0800 1 file changed, 2 insertions(+)[master c1a292a] 2*3=6 Date: Wed Jan 8 23:44:07 2020 +0800 1 file changed, 2 insertions(+)ymj@ymj-pc:~/git_test$ git log --onelinec1a292a (HEAD -> master) 2*3=6b03667e 2+2+2=6ce8c35b Merge branch 'f1'a0ed2b7 3+3=68abe1f0 1+1+1+1+1+1a57b57f 创建问题cbdc648 fix buge595e94 add math.txt43b1405 init commitymj@ymj-pc:~/git_test$ 

可以看出只要指定commit ID就可以将改动合并过来,非常方便。

那我们继续之前删除1+1=2的工作:

ymj@ymj-pc:~/git_test$ git stash pop 自动合并 math.txt位于分支 master尚未暂存以备提交的变更:  (使用 "git add <文件>..." 更新要提交的内容)  (使用 "git checkout -- <文件>..." 丢弃工作区的改动)  修改:math.txt修改尚未加入提交(使用 "git add" 和/或 "git commit -a")丢弃了 refs/stash@{0} (5d2cd477bde5327e2ca91d053aa56057be512e08)ymj@ymj-pc:~/git_test$ cat math.txt 下面有几个#?######方法1:1+1+1+1+1+1 = 6方法2:3+3=6方法3:2+2+2=6方法4:2*3=6ymj@ymj-pc:~/git_test$ git add math.txt ymj@ymj-pc:~/git_test$ git commit -m"删除1+1=2"[master e98af63] 删除1+1=2 1 file changed, 2 deletions(-)

继续完成提交工作,完美!

总结

常用的操作:

查看分支

git branch 

创建分支

git branch B_NAME

切换分支

git checkout B_NAME 

创建分支同时切换

git checkout -b B_NAME 

合并分支

git merge B_NAME 

解决冲突

手动修改冲突的文件

<<<<<<< HEADHEAD 内容=======B_NAME 内容>>>>>>> B_NAME

修改完之后继续add,git merge --continue,完成合并

删除无用分支

git branch -d B_NAME 

git branch -D B_NAME  强行删除未合并分支(慎用,除非真的确定不想要了)。

避免冲突

冲突是因为2个分支修改了同一个地方,为了避免冲突,就不要同时修改同一个地方,这样就可以自动merge成功。不要害怕冲突,git就是帮你管理冲突,如果真的冲突了,那就手动改一下,也很方便。

git stash 和 git stash pop

为分支切换保存和恢复现场

摘樱桃

一次摘一个或多个提交到当前分支

git cherry-pick CID [CIDn]

git的分支是轻量级的,你可以随意创建分支,并不会带来多大的开销,git官方很推荐使用分支。

----------我是比特,一个想把问题搞清楚的青年才俊----------

git常用操作--分支相关推荐

  1. git常用操作--分支同步master 本地库提交到远程分支

    1.分支同步master git clone [项目地址] //克隆远程代码库到本地 cd [刚刚克隆的项目文件夹] //进入本地仓库 git checkout -b dev // 创建分支dev(或 ...

  2. Git常用命令——分支操作

    Git常用命令--分支操作 分支操作 git branch 列出,创建或者删除分支 git branch <branchName> :创建一个分支 git branch -d <br ...

  3. git 常用操作总结——基于Gitlab

    博主目前在蚂蚁集团-体验技术部,AntV/S2 是博主所在团队的开源项目--多维交叉分析表格,欢迎使用,感谢到 S2 github 仓库点赞 star,有任何关于前端面试.就业.技术问题都可给在文章后 ...

  4. Node.js Git Server搭建及Git常用操作笔记

    Node.js Git Server搭建及Git常用操作笔记 安装Git工具即可在本地进行Git仓库的管理,如果要实现远程仓库则需要搭建Git Server.通过Node.js搭建Git Server ...

  5. git报错:‘fatal:remote origin already exists‘怎么处理?附上git常用操作以及说明。

    git添加远程库的时候有可能出现如下的错误, 怎么解决? 只要两步: 1.先删除 $ git remote rm origin 2.再次执行添加就可以了. ---------------------- ...

  6. 版本控制工具——Git常用操作(下)

    本文由云+社区发表 作者:工程师小熊 摘要:上一集我们一起入门学习了git的基本概念和git常用的操作,包括提交和同步代码.使用分支.出现代码冲突的解决办法.紧急保存现场和恢复现场的操作.学会以后已经 ...

  7. Git学习总结(22)——Git 常用操作再总结

    一.前言 每一个项目,我们都把他变成一个git仓库.一个git仓库包含无数分支,默认分支为master,每个分支都包含无数个版本库,每个版本库都包含无数个文件. 二.常用操作 $ git co(che ...

  8. git常用操作以及码云Gitee连接git

    文章目录 1 git简介 1.1 工作区.暂存区.版本库 1.2 工作区状态保存 2 和gitee连接 2.1 创建git仓库 2.2 通过ssh公钥连接 2.2.1 获取公钥 2.2.2 gitee ...

  9. Git常用操作速查,没有人比我更简单!!

    目录 Git初始化 Git配置 init clone commit branch push pull checkout merge log rm reset --hard rebase 应用场景 其他 ...

最新文章

  1. linux下mysql修改root密码
  2. 想学习Android开发
  3. PythonDay8
  4. Java对象到对象映射器
  5. 【PMP学习笔记】:二、项目运行环境
  6. tomcat 占用的内存越来越大_智能手机内存为什么越来越大 就这三点原因
  7. TypeScript 中的 SOLID 原则
  8. 多智能体通信:MAGNet用于深度多智能体强化学习的多智能体图网络
  9. 台达变频器485通讯接线图_台达变频器RS485通讯设置
  10. 从架构到平台, POWER 9处理器最全解读
  11. iptables高性能前端优化-无压力配置1w+条规则
  12. mac下复制粘贴需要多次的问题
  13. 手工焊接SSOP贴片元件步骤总结
  14. phpstudy的php fpm,浅谈PHP-FPM参数
  15. 环形10个树洞兔子c语言设计,[阅读打卡]I am a Bunny+提高孩子的欣赏能力我是一只小兔子,我的名字叫尼古拉斯 我住在一个树洞里面 在春天的时候,我喜欢看美丽的花儿,有...
  16. 书单丨流量成本越来越高,6本书带你实现爆发式增长!
  17. 苹果任性,降低iPhone电池容量,用户需要多买个充电宝奶妈
  18. java 字符串中去除汉字和符号
  19. python所有内置函数的简单使用
  20. java反射机制的概念及原理

热门文章

  1. 用友云新愿望:一起生态一起赚钱 服务销售过亿元
  2. 【原创】NES第二波:如何用VS Code,编写NES/FC游戏程序。
  3. openstack创建虚机的过程
  4. 2021年起重机司机(限桥式起重机)模拟试题及起重机司机(限桥式起重机)实操考试视频
  5. 若依框架----登录界面美化
  6. html5独立钻石棋,独立钻石棋初级入门玩法讲解
  7. 芯片组的相关概念描述
  8. 01-pie小游戏(基本图形的绘制)
  9. 微信转盘抽奖前端源码(一):8个奖品,指针开始时指向缝隙
  10. java网络爬虫0基础_简单的java爬虫程序(入门)