Git学习(四)——分支管理

一、创建与合并分支

1.创建分支

一开始的时候,master分支是一条线,Git用master指向最新的提交,再用HEAD指向master,就能确定当前分支,以及当前分支的提交点。每次提交 ,master分支都会向前移动一步,这样,随着你不断提交,master分支的线也越来越长。

Git学习(四)——分支管理

当我们创建的分支,例如dev时,Git新建了一个指针叫dev,指向master相同的提交,再把HEAD指向dev,就表示当前分支在dev上:

Git学习(四)——分支管理

Git创建一个分支很快,因为除了增加一个dev指针,改改HEAD指向,工作区的文件都没有任何变化!不过,从现在开始,对工作区的修改和提交就是针对dev分支了,比如新提交一次后,dev指针往前移动一步,而master指针不变:

Git学习(四)——分支管理

实践操作:

首先,创建dev分支,然后切换到dev分支:  

Git学习(四)——分支管理

git checkout 命令加上-b 参数表示创建并切换,相当于以下两条命令:

Git学习(四)——分支管理

然后,用git branch 命令查看当前分支:

Git学习(四)——分支管理

git branch命令会列出所有分支,当前分支前面会标一个*号。

然后提交:

Git学习(四)——分支管理

现在,dev分支的工作完成,我们切换回master分支:

Git学习(四)——分支管理

切换回master后,再查看readme.txt文件,刚才添加的内容没有显示。因为那个提交实在dev分支上,而master分支此刻的提交点并没有变。

2.合并分支

最简单的合并分支的方法,就是直接把master指向dev的当前提交,就完成了合并:

Git学习(四)——分支管理

实际操作:

现在我们把dev分支合并到master上:

Git学习(四)——分支管理

git merge 命令用于合并指定分支到当前分支。

3.删除分支

删除dev分支就是把dev指针删掉,删掉后,我们就只剩下一条master分支:

Git学习(四)——分支管理

实际操作:

合并完成后,就可以放心地删除dev分支了:

Git学习(四)——分支管理

删除后查看branch,就只剩下master分支了:

Git学习(四)——分支管理

4.解决冲突

如果master分支和本地创建的feature1分支各自都分别有新的提交:

Git学习(四)——分支管理

这种情况下,Git无法执行“快速合并”,只能试图把各自的修改合并起来,但这种合并就可能会有冲突。

Git学习(四)——分支管理

当Git无法自动合并分支时,就必须手动解决冲突。解决冲突后,再提交。git status可以告诉我们冲突的文件:

Git学习(四)——分支管理

我们可以直接查看readme.txt的内容:

Git学习(四)——分支管理

Git用<<<<<<<=======>>>>>>>标记出不同分支的内容,我们修改如下后保存:

Creating a new branch is quick and simple.

再提交:

Git学习(四)——分支管理

现在,master分支和feature1分支变成了下图所示:

Git学习(四)——分支管理

git log --graph 命令可以查看分支合并图

Git学习(四)——分支管理

最后,删除feature1分支,工作完成。

5.Bug分支

当你接到一个修复一个代号101的bug的任务时,很自然地,你想创建一个分支issue-101来修复它,但是,等等,当前正在dev上进行的工作还没有提交:

Git学习(四)——分支管理

并不是你不想提交,而是工作只进行到一半,还没法提交,预计完成还需1天时间。但是,必须在两个小时内修复该bug,怎么办?

幸好,Git还提供了一个stash功能,可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作:

Git学习(四)——分支管理

现在,用git status查看工作区,就是干净的(除非有没有被Git管理的文件),因此可以放心地创建分支来修复bug。

首先确定要在哪个分支上修复bug,假定需要在master分支上修复,就从master创建临时分支。修完完成后提交,切换到master分支,完成合并,最后删除issue -101 分支即可。

现在,可以回到dev分支上干活了:

Git学习(四)——分支管理

工作区是干净的,刚才的工作现场存到哪去了?用git stash list命令看看:

Git学习(四)——分支管理

工作现场还在,Git把stash内容存在某个地方了,但是需要恢复一下,有两个办法:

一种是用git stash apply恢复,但恢复后,stash内容并不删除,需要用git stash drop 来删除;

另一种是用git stash pop,恢复的同时把stash内容也删除了:

Git学习(四)——分支管理

6.feature分支

开发一个新feature,最好新建一个分支;

如果有分支还没有被合并,但是必须要删除。这时删除会丢失掉修改,如果要强行删除,需要使用 命令git branch -D <分支名>.

7.多人协作

当你从远程仓库克隆时,实际上是Git把本地的master和远程的master分支对应起来了,并且,远程仓库的默认名称是origin。

要查看远程库的信息,用git remote:

Git学习(四)——分支管理

或者,用git remote -v 显示更详细的信息:

Git学习(四)——分支管理

上面显示了可以抓取和推送的origin地址。如果没有推送权限,就看不到push的地址。

(1)推送分支

推送分支,就是把该分支上的所有本地提交推送到远程库。推送时,要指定本地分支,这样,Git就会把该分支推送到远程库对应的远程分支上:Git学习(四)——分支管理

(2)抓取分支

如果你的小伙伴的最新提交和你试图推送的提交有冲突,解决办法也很简单,先用git pull把最新的提交从origin/dev抓下来,然后,在本地合并,解决冲突,再推送:

Git学习(四)——分支管理

git pull成功,但是合并有冲突,需要手动解决,解决的方法和解决冲突完全一样。解决后,提交,再push。

(3)小结

  • 查看远程库信息,使用git remote -v

  • 本地新建的分支如果不推送到远程,对其他人就是不可见的;

  • 从本地推送分支,使用git push origin branch-name,如果推送失败,先用git pull抓取远程的新提交;

  • 在本地创建和远程分支对应的分支,使用git checkout -b branch-name origin/branch-name,本地和远程分支的名称最好一致;

  • 建立本地分支和远程分支的关联,使用git branch --set-upstream branch-name origin/branch-name

  • 从远程抓取分支,使用git pull,如果有冲突,要先处理冲突。

  • 因此,多人协作的工作模式通常是这样:

    1. 首先,可以试图用git push origin branch-name推送自己的修改;

    2. 如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;

    3. 如果合并有冲突,则解决冲突,并在本地提交;

    4. 没有冲突或者解决掉冲突后,再用git push origin branch-name推送就能成功!

    如果git pull提示“no tracking information”,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream branch-name origin/branch-name

上一篇:Synchronized与ReentrantLock区别总结


下一篇:mysql 存储过程 -- 游标的使用(备忘)