git分支间切换注意点和bug分支的处理
备注:
本文参考于廖雪峰老师的博客Git教程。依照其博客进行学习和记录,感谢其无私分享,也欢迎各位查看原文。
知识点
当前一个分支上修改文件或目录后,在没有提交前,任何一个分支的状态(
git status
)都会同步为一样合并或切换分支工作,一定是在当前分支提交后,或者使用
git stash
将当前暂存区状态保存下来之后进行,即当前分支git status
显示为干净的仓库再切换同时修改了同一个工作区相同文件,由于Git管理版本是通过移动
HEAD
指针,工作区的修改对于移动到不同分支的指针是一样的。此时master
和dev
分支git add
添加到暂存区,git status
在不同分支状态是一样的,如果master
分支先commit
,中间所做的修改,会全部算作master
的修改(由于dev
没有提交,仅仅add
添加了暂存区,中间的修改在切换分支提交后会在dev
分支丢失,但所有修改都存在于master
的提交中)。故:实际开发中一定要提交或者暂存当前暂存区的状态后,再切换分支进行其他修改,否则在本分支所做修改的状态会丢失。git stash
对于git
没有管理的文件状态不会保存(新创建或修改没有添加过的文件)。git stash list
查看stash
的列表git stash pop
恢复stash
到当前分支,并删除stash
git stash apply
,git stash drop
恢复stash
和删除stash
git stash apply stash@{0}
恢复指定的stash
到当前分支。
记一次分支合并问题状况
从分支点开始,不同分支修改工作区的内容(不添加到暂存区和提交),切换分支,工作区的内容是一样的。
这一点也证明了,Git修改的是HEAD
指针,而不是文件
如下:
-
git status
查看dev
分支上Git的状态,干净工作区切换到mster,查看Git状态,干净工作区
$ git status
位于分支 dev
无文件要提交,干净的工作区
$ git checkout master
切换到分支 'master'
您的分支领先 'origin/master' 共 8 个提交。
(使用 "git push" 来发布您的本地提交)
$ git status
位于分支 master
您的分支领先 'origin/master' 共 8 个提交。
(使用 "git push" 来发布您的本地提交)
无文件要提交,干净的工作区
- master分支下,修改readme文件,查看状态,和切换到dev分支下,查看状态。忽略远程分支的提示。
$ git status
位于分支 master
您的分支领先 'origin/master' 共 8 个提交。
(使用 "git push" 来发布您的本地提交)
尚未暂存以备提交的变更:
(使用 "git add <文件>..." 更新要提交的内容)
(使用 "git checkout -- <文件>..." 丢弃工作区的改动)
修改: readme.txt
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
$ git checkout dev
M readme.txt
切换到分支 'dev'
$ git status
位于分支 dev
尚未暂存以备提交的变更:
(使用 "git add <文件>..." 更新要提交的内容)
(使用 "git checkout -- <文件>..." 丢弃工作区的改动)
修改: readme.txt
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
必须在提交或者暂存当前暂存区的状态后,再切换或合并分支
工作区的修改对于不同分支是一样的:
同时修改了同一个工作区相同文件,由于Git管理版本是通过移动
HEAD
指针,工作区的修改对于移动到不同分支的指针是一样的。此时master
和dev
分支git add
添加到暂存区,git status
在不同分支状态是一样的,如果master
分支先commit
,中间所做的修改,会全部算作master
的修改(由于dev
没有提交,仅仅add
添加了暂存区,中间的修改在切换分支提交后会在dev
分支丢失,但所有修改都存在于master
的提交中)。故:实际开发中一定要提交或者暂存当前暂存区的状态后,再切换分支进行其他修改,否则在本分支所做修改的状态会丢失。同理,合并分支也一样,必须在提交或者暂存当前暂存区状态后,再进行分支的合并。
如下为修改工作区或添加到暂存区后对git分支切换和提交的整体测试:
- 如下,
master
分支上修改readme
,查看状态,
$ git status
位于分支 master
您的分支领先 'origin/master' 共 8 个提交。
(使用 "git push" 来发布您的本地提交)
尚未暂存以备提交的变更:
(使用 "git add <文件>..." 更新要提交的内容)
(使用 "git checkout -- <文件>..." 丢弃工作区的改动)
修改: readme.txt
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
- 切换到
dev
查看状态,
$ git checkout dev
M readme.txt
切换到分支 'dev'
$ git status
位于分支 dev
尚未暂存以备提交的变更:
(使用 "git add <文件>..." 更新要提交的内容)
(使用 "git checkout -- <文件>..." 丢弃工作区的改动)
修改: readme.txt
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
- 在
dev
分支上修改readme
文件,切换到master
分支,查看内容
$ git checkout master
M readme.txt
切换到分支 'master'
您的分支领先 'origin/master' 共 8 个提交。
(使用 "git push" 来发布您的本地提交)
$ cat readme.txt
`this is a test that I learning and use git version control system
this is a beginning
wofaidognyixie dognxi
create two new branch
Creating a new branch is quick and simple.
add a new branch
master modify
dev modify
- 在
master
分支上将修改添加到暂存区,查看状态
$ git add readme.txt
$ git status
位于分支 master
您的分支领先 'origin/master' 共 8 个提交。
(使用 "git push" 来发布您的本地提交)
要提交的变更:
(使用 "git reset HEAD <文件>..." 以取消暂存)
修改: readme.txt
- 切换到
dev
分支,修改readme
文件后,切换回master
分支,查看状态。会出现工作区的修改提示
$ git checkout dev
M readme.txt
切换到分支 'dev'
$ git checkout master
M readme.txt
切换到分支 'master'
您的分支领先 'origin/master' 共 8 个提交。
(使用 "git push" 来发布您的本地提交)
$ git status
位于分支 master
您的分支领先 'origin/master' 共 8 个提交。
(使用 "git push" 来发布您的本地提交)
要提交的变更:
(使用 "git reset HEAD <文件>..." 以取消暂存)
修改: readme.txt
尚未暂存以备提交的变更:
(使用 "git add <文件>..." 更新要提交的内容)
(使用 "git checkout -- <文件>..." 丢弃工作区的改动)
修改: readme.txt
- 切换回
dev
分支,git add
添加在存储区后,查看状态,状态为暂存(未提交)
$ git checkout dev
M readme.txt
切换到分支 'dev'
$ git add readme.txt
$ git status
位于分支 dev
要提交的变更:
(使用 "git reset HEAD <文件>..." 以取消暂存)
修改: readme.txt
- 切换回
master
分支,git status
查看状态也为暂存(未提交)
$ git checkout master
M readme.txt
切换到分支 'master'
您的分支领先 'origin/master' 共 8 个提交。
(使用 "git push" 来发布您的本地提交)
liu@liu-virtual-machine:~/gitTest$ git status
位于分支 master
您的分支领先 'origin/master' 共 8 个提交。
(使用 "git push" 来发布您的本地提交)
要提交的变更:
(使用 "git reset HEAD <文件>..." 以取消暂存)
修改: readme.txt
- 在
master
分支提交,查看状态,显示无文件要提交,工作区干净
$ git commit -m"commit master"
[master 1ba95a4] commit master
1 file changed, 2 insertions(+)
$ git status
位于分支 master
您的分支领先 'origin/master' 共 9 个提交。
(使用 "git push" 来发布您的本地提交)
无文件要提交,干净的工作区
- 切换到
dev
分支,工作区状态为干净,暂存区无提交,如下。
$ git checkout dev
切换到分支 'dev'
$ git status
位于分支 dev
无文件要提交,干净的工作区
- 此时,分别在
master
和dev
分支先查看readme
文件内容
dev
分支,显示为所有改动之前的内容
master
分支下的readme
文件内容为最新(包含在dev
分支下修改和添加到暂存区的内容)
超前提交的分支无法合并落后版本的分支(即无法倒退到未提交过的分支状态)
目前所知,依靠分支之间的合并(merge)无法实现版本倒退(也许有办法,未进行深入研究),只能通过git reset --hard commit_id
实现版本回退。
在master
上新建分支dev
,然后修改master
上内容,并添加提交,此时master
的版本比dev
版本要高,如果此时想把dev
(分支的低版本)合并到master
上会发生什么呢?
master
如果更新后(更新后的上游分支),试图将未进行更新的dev
分支合并到当前分支,会提示必须给出一个提交信息解释此合并,否则会终止合并提交
输入合理解释后,会再一次确认存储缓冲区的更改
如下为操作完成后的终端状态
$ git merge dev
Merge made by the 'recursive' strategy.
testOndev.txt | 0
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 testOndev.txt
但是查看文件内容,并没有回到原先状态。
倒退合并失败,其实这种情况应该使用版本回退。
- 即使使用
--no-ff
参数,使用普通模式合并,如下:
$ git merge --no-ff -m"merge backup" dev
Already up-to-date.
文件内容依然保持和master一致,没有合并到dev分支状态。
解决:使用版本回退git reset --hard commit_id
,可以完成实际的修改。
$ git reset --hard a7d3eb7
HEAD 现在位于 a7d3eb7 fixed conflict
内容修改。
bug分支
有了上面切换分支和合并失败的经历,就不难理解下面的操作了。
软件开发中,bug
总是在你想到和想不到的正常情况和意外情况下出现。修复bug
,在Git中完全可以通过建立一个临时分支来修复,修复后合并分支即可。
但是当你正在开发时,对于突然接到一个修复bug
的任务,由于当前开发(dev
分支)没有完成,dev
上的工作可能还没有提交。
此时如果想创建一个临时分支issue10
修复master
分支的bug
。
查看Git状态如下:
$ git status
位于分支 dev
要提交的变更:
(使用 "git reset HEAD <文件>..." 以取消暂存)
新文件: newFile
尚未暂存以备提交的变更:
(使用 "git add <文件>..." 更新要提交的内容)
(使用 "git checkout -- <文件>..." 丢弃工作区的改动)
修改: readme.txt
由于没有开发完,可能暂时无法提交
暂存当前暂存区的状态
- Git提供了一个
stash
功能,可以把当前暂存区工作状态“储藏”起来,等以后恢复现场后继续工作。
$ git stash
Saved working directory and index state WIP on dev: 0df6e43 Merge branch 'dev'
HEAD 现在位于 0df6e43 Merge branch 'dev'
- 查看状态,显示无文件要提交,工作区也是干净的。
$ git status
位于分支 dev
无文件要提交,干净的工作区
注:git stash
对于git没有管理的文件状态不会保存(新创建没有添加过的文件)。
- 确定从哪个分支上修复
bug
,现在在master
分支上修复,切换并新建分支issue10
。
$ git checkout master
切换到分支 'master'
您的分支领先 'origin/master' 共 13 个提交。
(使用 "git push" 来发布您的本地提交)
$ git checkout -b issue10
切换到一个新分支 'issue10'
$ cat readme.txt
`this is a test that I learning and use git version control system
this is a beginning
wofaidognyixie dognxi
create two new branch
Creating a new branch is quick and simple.
add a new branch
master modify
dev modify again commit on master
如上为readme内容,将master modify
改为modify on master
,提交
$ git add readme.txt
$ git commit -m"fixed a bug"
[issue10 afc33ef] fixed a bug
1 file changed, 1 insertion(+), 1 deletion(-)
切换到master
分支并合并。最后删除issue10
分支
$ git checkout master
切换到分支 'master'
您的分支领先 'origin/master' 共 13 个提交。
(使用 "git push" 来发布您的本地提交)
$ git merge --no-ff -m"merged fixed bug" issue10
Merge made by the 'recursive' strategy.
readme.txt | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
$ git branch -d issue10
已删除分支 issue10(曾为 afc33ef)。
bug
修改完成后,现在回到dev
分支接着开发,此时dev
的状态是干净的。
$ git checkout dev
切换到分支 'dev'
$ git status
位于分支 dev
无文件要提交,干净的工作区
- 使用
git stash list
查看暂存的状态
$ git stash list
stash@{0}: WIP on dev: 0df6e43 Merge branch 'dev'
恢复暂存起来的状态
用
git stash apply
恢复,但恢复后,stash
内容并不删除,需要用git stash drop
来删除使用
git stash pop
,恢复的同时会把stash
内容也删除。
$ git stash pop
位于分支 dev
要提交的变更:
(使用 "git reset HEAD <文件>..." 以取消暂存)
新文件: newFile
尚未暂存以备提交的变更:
(使用 "git add <文件>..." 更新要提交的内容)
(使用 "git checkout -- <文件>..." 丢弃工作区的改动)
修改: readme.txt
丢弃了 refs/stash@{0} (90a1bdda8ec2c4d1a2833b45ffa2a0be3f2af670)
可以多次stash
,恢复的时候,先用git stash list
查看,然后用git stash apply
指定恢复到哪个状态
$ git stash apply stash@{0}
git分支间切换注意点和bug分支的处理的更多相关文章
- Git速成学习第六课:Bug分支
Git速成学习笔记整理于廖雪峰老师的官网网站:https://www.liaoxuefeng.com/ 当你接到一个修复代码为101的任务的时候,很自然的你想创建一个分支issue-101来修复它,但 ...
- Git学习笔记(二)分支管理与合并及Bug分支
一.分支管理 1.什么是分支 分支就相当于我们看科幻片里的平行宇宙,如果两个平行宇宙互不干扰,那铁定是啥事儿没有.不过,在某个时间点,两个平行宇宙合并了呢?假如两个宇宙中都有你的影子, 合并之后相当于 ...
- 【IntelliJ IDEA】在idea上操作 git分支合并【如何将远程swagger分支 合并到 远程 master分支上】【如何切换 本地分支】
============================================ 明确一点: 如果项目交给git管理了[如何将项目交给git管理:https://www.cnblogs.com ...
- git clone后切换分支,和远端的不一样。
原因 git clone后再master分支,切换后到了别的分支,分支里面的文件目录是不一样的,导致出现错误. 解决 删除原来的全部文件 git pull 可是git pull报错, git匹配的文件 ...
- git 命令行(四)-推送分支到远程
在本地新建一个分支: git branch newBranch 切换到你的新分支: git checkout newBranch 创建并切换到新分支: git checkout -b newBranc ...
- Git的Bug分支----临时保存现场git stash
软件开发中,bug就像家常便饭一样,有了bug就需要修复,在Git中,由于分支是如此的强大,所以每个bug通过一个新的分支来修复,在修复后,合并分支,然后将临时分支删除. 当你接到一个修复代号为119 ...
- git Bug分支
Bug分支 软件开发中,bug就像家常便饭一样.有了bug就需要修复,在Git中,由于分支是如此的强大,所以,每个bug都可以通过一个新的临时分支来修复,修复后,合并分支,然后将临时分支删除. 当你接 ...
- git分支管理之Bug分支
软件开发中,bug就像家常便饭一样.有了bug就需要修复,在Git中,由于分支是如此的强大,所以,每个bug都可以通过一个新的临时分支来修复,修复后,合并分支,然后将临时分支删除. 当你接到一个修复一 ...
- GIT 分支管理:分支管理策略、Bug分支、Feature分支
通常,合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息. 如果要强制禁用Fast forward模式,Git就会在merge时生成一个新的comm ...
随机推荐
- S7-1200视频教程: S7-1200的功能与特点-跟我学 - 1/112
S7-1200视频教程: S7-1200的功能与特点-跟我学 - 1/112 观看连接: http://www.elearning.siemens.com.cn/video/Course/201012 ...
- 11、vue-路由
1.路由: 官方提供一个插件,构建单页面应用,主要实现得功能页面得切换.组件得跳转 2.vue中得路由:vue-router包,如果是脚手架进行搭建得,那么是不需要安装vue-router这个包得,因 ...
- vue 入门, todoList
# 实现逻辑: > * 技术栈> 1. 生命周期,creatd( 创建后执行)> 2. methods': 调用事件方法,结果不会缓存> 3. Watch : 监听器,监听输 ...
- vue入门的第一天:v-clock、v-text、v-html的使用
vue入门的第一天 1. v-cloak v-cloak可以解决插值闪烁问题(防止代码被人看见),在元素里加入 v-cloak即可 html: <p v-cloak>{{msg}}< ...
- synchronized与锁升级
1 为什么需要synchronized? 当一个共享资源有可能被多个线程同时访问并修改的时候,需要用锁来保证数据的正确性.请看下图: 线程A和线程B分别往同一个银行账户里面添加货币,A线程从内存中读取 ...
- jni不通过线程c回调java的函数 --总结
1.JNIEnv类型是一个指向全部JNI方法的指针.该指针只在创建它的线程有效,不能跨线程传递 2.JavaVM是虚拟机在JNI中的表示,一个JVM中只有一个JavaVM对象,这个对象是线程共享的. ...
- 都在讲DevOps,但你知道它的发展趋势吗?
根据最近的一项集体研究,DevOps的市场在2017年创造了约29亿美元的产值,预计到2022年,这个数字将达到约66亿美元.人工智能的融入和安全性的融入,加上向自动化的巨大转变,可合理预测,在202 ...
- Flask01-HelloWorld
# flask学习 参考:http://www.pythondoc.com/flask-mega-tutorial/ ## python3. 默认支持虚拟环境使用(用最简单的方法,解决问题) wget ...
- 恕我直言你可能真的不会java第8篇-函数式接口
一.函数式接口是什么? 所谓的函数式接口,实际上就是接口里面只能有一个抽象方法的接口.我们上一节用到的Comparator接口就是一个典型的函数式接口,它只有一个抽象方法compare. 只有一个抽象 ...
- mpvue实战-手势滑动导航栏
写点东西记录一下美好时光,上周学习了一下通过mpuve开发微信小程序,看完文档,就准备撸起袖子加油干的时候,一开始就被支持手势滑动的导航栏给搞懵逼了.求助一波百度和谷歌未果后,只能自己动脑动手!为了给 ...