git分支间切换留神点和bug分支的解决
[toc]
备注:
本文参考于廖雪峰老师的博客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 devM 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 devM readme.txt切换到分支 'dev'$ git status位于分支 dev尚未暂存以备提交的变更: (应用 "git add <文件>..." 更新要提交的内容) (应用 "git checkout -- <文件>..." 抛弃工作区的改变) 批改: readme.txt批改尚未退出提交(应用 "git add" 和/或 "git commit -a")
- 在
dev
分支上批改readme
文件,切换到master
分支,查看内容
$ git checkout masterM readme.txt切换到分支 'master'您的分支当先 'origin/master' 共 8 个提交。 (应用 "git push" 来公布您的本地提交)$ cat readme.txt`this is a test that I learning and use git version control systemthis is a beginningwofaidognyixie dognxicreate two new branchCreating a new branch is quick and simple.add a new branchmaster modifydev modify
- 在
master
分支上将批改增加到暂存区,查看状态
$ git add readme.txt$ git status位于分支 master您的分支当先 'origin/master' 共 8 个提交。 (应用 "git push" 来公布您的本地提交)要提交的变更: (应用 "git reset HEAD <文件>..." 以勾销暂存) 批改: readme.txt
- 切换到
dev
分支,批改readme
文件后,切换回master
分支,查看状态。会呈现工作区的批改提醒
$ git checkout devM readme.txt切换到分支 'dev'$ git checkout masterM 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 devM readme.txt切换到分支 'dev'$ git add readme.txt$ git status位于分支 dev要提交的变更: (应用 "git reset HEAD <文件>..." 以勾销暂存) 批改: readme.txt
- 切换回
master
分支,git status
查看状态也为暂存(未提交)
$ git checkout masterM 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 devMerge 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" devAlready up-to-date.
文件内容仍然放弃和master统一,没有合并到dev分支状态。
解决:应用版本回退git reset --hard commit_id
,能够实现理论的批改。
$ git reset --hard a7d3eb7HEAD 当初位于 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 stashSaved 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 systemthis is a beginningwofaidognyixie dognxicreate two new branchCreating a new branch is quick and simple.add a new branchmaster modifydev 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" issue10Merge 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 liststash@{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}