git常用操作--分支
工欲善其事,必先利其器
分支
分支是简单的概念,和日常生活中用到的一样,比如说头发分杈:从一根开始分成了2根甚至更多,每一个分杈就是一个分支。
git的分支功能让它的使用方便了很多。每一个分支是相互独立的环境,你修改了一个分支,别的分支不会受到影响。
最大的好处就是,你可以分别在不同的分支干不同的事情,而且互相不受影响。比如你在电脑上写代码,突然手机收到推送“美国和伊朗打起来了”,你的注意力从代码切换到手机的新闻,注意力从写代码切换到看手机,在手机上干什么都不影响你在电脑上写的代码。这时候老板刚好过来,你赶紧放下手机,继续写代码,老板走了你继续看手机。老板频繁的路过,你不停的在写代码和看手机这2个分支切换,2者互相没有干扰,最终你写完了代码也看完了新闻。这就是分支的意义。
举个栗子
知道了分支的意义,那我们用一个栗子看看如何在git中利用分支。
还是利用之前创建的git_test做示范,最新的提交创建了一个问题,顺便利用查看git的方法看看
ymj@ymj-pc:~/git_test$ git log --oneline
a57b57f (HEAD -> master) 创建问题
cbdc648 fix bug
e595e94 add math.txt
43b1405 init commit
ymj@ymj-pc:~/git_test$ git show a57b57f --oneline
a57b57f (HEAD -> master) 创建问题
diff --git a/math.txt b/math.txt
index 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 f1
ymj@ymj-pc:~/git_test$ git branch
f1
* master
使用git branch f1创建了一个名为f1的分支,但是当前分支为master。
创建的分支和当前分支完全一样,我们创建一个提交看看:
ymj@ymj-pc:~/git_test$ git show --oneline
8abe1f0 (HEAD -> master) 1+1+1+1+1+1
diff --git a/math.txt b/math.txt
index 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
master
ymj@ymj-pc:~/git_test$ git log --oneline
a57b57f (HEAD -> f1) 创建问题
cbdc648 fix bug
e595e94 add math.txt
43b1405 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 --oneline
a0ed2b7 (HEAD -> f1) 3+3=6
diff --git a/math.txt b/math.txt
index 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
下面有几个#?
###
###
<<<<<<< HEAD
1+1+1+1+1+1 = 6
=======
3+3=6
>>>>>>> f1
原来我们2个分支在问题后面都有答案,此时git不知道该使用哪个,所以用
<<<<<<< HEAD
1+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 diff
diff --git a/math.txt b/math.txt
index 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 --oneline
da565e9 (HEAD -> f2) 2*3=6
ec41b58 2+2+2=6
ce8c35b (master) Merge branch 'f1'
a0ed2b7 3+3=6
8abe1f0 1+1+1+1+1+1
a57b57f 创建问题
cbdc648 fix bug
e595e94 add math.txt
43b1405 init commit
可以看出f2分支比master多了2个提交
da565e9 (HEAD -> f2) 2*3=6
ec41b58 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 --oneline
c1a292a (HEAD -> master) 2*3=6
b03667e 2+2+2=6
ce8c35b Merge branch 'f1'
a0ed2b7 3+3=6
8abe1f0 1+1+1+1+1+1
a57b57f 创建问题
cbdc648 fix bug
e595e94 add math.txt
43b1405 init commit
ymj@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=6
ymj@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
解决冲突
手动修改冲突的文件
<<<<<<< HEAD
HEAD 内容
=======
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常用操作--分支相关推荐
- git常用操作--分支同步master 本地库提交到远程分支
1.分支同步master git clone [项目地址] //克隆远程代码库到本地 cd [刚刚克隆的项目文件夹] //进入本地仓库 git checkout -b dev // 创建分支dev(或 ...
- Git常用命令——分支操作
Git常用命令--分支操作 分支操作 git branch 列出,创建或者删除分支 git branch <branchName> :创建一个分支 git branch -d <br ...
- git 常用操作总结——基于Gitlab
博主目前在蚂蚁集团-体验技术部,AntV/S2 是博主所在团队的开源项目--多维交叉分析表格,欢迎使用,感谢到 S2 github 仓库点赞 star,有任何关于前端面试.就业.技术问题都可给在文章后 ...
- Node.js Git Server搭建及Git常用操作笔记
Node.js Git Server搭建及Git常用操作笔记 安装Git工具即可在本地进行Git仓库的管理,如果要实现远程仓库则需要搭建Git Server.通过Node.js搭建Git Server ...
- git报错:‘fatal:remote origin already exists‘怎么处理?附上git常用操作以及说明。
git添加远程库的时候有可能出现如下的错误, 怎么解决? 只要两步: 1.先删除 $ git remote rm origin 2.再次执行添加就可以了. ---------------------- ...
- 版本控制工具——Git常用操作(下)
本文由云+社区发表 作者:工程师小熊 摘要:上一集我们一起入门学习了git的基本概念和git常用的操作,包括提交和同步代码.使用分支.出现代码冲突的解决办法.紧急保存现场和恢复现场的操作.学会以后已经 ...
- Git学习总结(22)——Git 常用操作再总结
一.前言 每一个项目,我们都把他变成一个git仓库.一个git仓库包含无数分支,默认分支为master,每个分支都包含无数个版本库,每个版本库都包含无数个文件. 二.常用操作 $ git co(che ...
- git常用操作以及码云Gitee连接git
文章目录 1 git简介 1.1 工作区.暂存区.版本库 1.2 工作区状态保存 2 和gitee连接 2.1 创建git仓库 2.2 通过ssh公钥连接 2.2.1 获取公钥 2.2.2 gitee ...
- Git常用操作速查,没有人比我更简单!!
目录 Git初始化 Git配置 init clone commit branch push pull checkout merge log rm reset --hard rebase 应用场景 其他 ...
最新文章
- linux下mysql修改root密码
- 想学习Android开发
- PythonDay8
- Java对象到对象映射器
- 【PMP学习笔记】:二、项目运行环境
- tomcat 占用的内存越来越大_智能手机内存为什么越来越大 就这三点原因
- TypeScript 中的 SOLID 原则
- 多智能体通信:MAGNet用于深度多智能体强化学习的多智能体图网络
- 台达变频器485通讯接线图_台达变频器RS485通讯设置
- 从架构到平台, POWER 9处理器最全解读
- iptables高性能前端优化-无压力配置1w+条规则
- mac下复制粘贴需要多次的问题
- 手工焊接SSOP贴片元件步骤总结
- phpstudy的php fpm,浅谈PHP-FPM参数
- 环形10个树洞兔子c语言设计,[阅读打卡]I am a Bunny+提高孩子的欣赏能力我是一只小兔子,我的名字叫尼古拉斯 我住在一个树洞里面 在春天的时候,我喜欢看美丽的花儿,有...
- 书单丨流量成本越来越高,6本书带你实现爆发式增长!
- 苹果任性,降低iPhone电池容量,用户需要多买个充电宝奶妈
- java 字符串中去除汉字和符号
- python所有内置函数的简单使用
- java反射机制的概念及原理
热门文章
- 用友云新愿望:一起生态一起赚钱 服务销售过亿元
- 【原创】NES第二波:如何用VS Code,编写NES/FC游戏程序。
- openstack创建虚机的过程
- 2021年起重机司机(限桥式起重机)模拟试题及起重机司机(限桥式起重机)实操考试视频
- 若依框架----登录界面美化
- html5独立钻石棋,独立钻石棋初级入门玩法讲解
- 芯片组的相关概念描述
- 01-pie小游戏(基本图形的绘制)
- 微信转盘抽奖前端源码(一):8个奖品,指针开始时指向缝隙
- java网络爬虫0基础_简单的java爬虫程序(入门)