赞
踩
备注:
知识点
记一次分支合并问题状况
从分支点开始,不同分支修改工作区的内容(不添加到暂存区和提交),切换分支,工作区的内容是一样的。
必须在提交或者暂存当前暂存区的状态后,再切换或合并分支
超前提交的分支无法合并落后版本的分支(即无法倒退到未提交过的分支状态)
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" 来发布您的本地提交)无文件要提交,干净的工作区
$ 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
,在Git中完全可以通过建立一个临时分支来修复,修复后合并分支即可。
但是当你正在开发时,对于突然接到一个修复bug
的任务,由于当前开发(dev
分支)没有完成,dev
上的工作可能还没有提交。
此时如果想创建一个临时分支issue10
修复master
分支的bug
。
查看Git状态如下:
$ git status位于分支 dev要提交的变更: (使用 "git reset HEAD ..." 以取消暂存) 新文件:newFile尚未暂存以备提交的变更: (使用 "git add ..." 更新要提交的内容) (使用 "git checkout -- ..." 丢弃工作区的改动) 修改:readme.txt
由于没有开发完,可能暂时无法提交
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}
Git教程:
https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。