摘要:git的分支功能
关键词:分支;多人协作。
创建简单分支
分支管理(branch)是git的重要功能,可以用交通上的行车来类比。主分支类似于主干道,名为master。分支管理的过程可以看做:一部分车流因任务需要从主干道上离开,前往分支干道上完成任务,然后再回到主干道。从主干道上离开前往分支干道,为创建分支;完成任务后回到主干道,为合并分支。这种只有一次分支的情况是简单分支,是分支管理的基础情况。简单分支操作步骤为:
0.先查看目前所在的分支,指令为:git branch 。分支名前的星号标记当前工作分支,新建的仓库一般只有一个名为master的分支。
1.通过指令:git checkout -b dev ,创建一个新的分支'dev’,'-b’的意义是创建分支的同时工作分支也会切换到dev上。
2.在文件夹中新建一个learnBranch.txt 文本。然后输入指令:git add learnBranch.txt 和 git commit -m 'new branch‘,将文本提交到版本库。如果这时候再输入指令:git checkout master,将工作分支切换到master,可以发现文件夹中的learnBranch.txt文本消失了,说明master的版本库和dev的版本库是不同的。
3.现在假设分支dev的工作完成了,需要将其合并回主分支master,并将失去作用的分支dev删除。
(1)先切换回主分支master:git checkout master
(2)将分支dev的工作成果合并到master上:git merge dev
(3)删除dev分支:git branch -d dev (即用-d表示删除)
git与GitHub在分支上的联动
1.在本地git上创建的分支,如dev,可以通过指令:git push origin dev,将新分支推送到GitHub即可更新新的分支。
2.在本地完成工作后,分支dev合并到master,并删除dev。此时:git push origin master 可以将工作成果更新到GitHub。
3.但会发现虽然在本地上删除了dev,但GitHub上还是有着dev分支的,而此时已经不能用 git push origin dev 了,因为dev已经被删除。正确做法是 git push origin --delete dev 或者 git push origin :dev 。其中后者语句的意义是推送一个空的分支到远程的dev分支,所以也是删除远程的dev分支。
4.如果在远程删除了一个不再需要分支,要在本地上删除,指令为:gti remote prune origin。
(注:本地仓库做出的改动和记录都会在GitHub上留下记录。但分支被删除时记录也被删除,最后之只留下master的记录)
分支上的冲突
分支上的冲突一般是指合并master与dev时git发现两个仓库本应相同的地方出现了差别,导致合并分支不能进行下去。
例如,创建dev分支后更改了文件的全部内容:
master分支的文本:this is master
dev分支的文本:this is dev
git add 并git commit -m '',然后切回master分支并 git merge dev时会报错(因为不同无法合并),点击文件发现文件已经被git改变成这个样子:
<<<<<<< HEAD
this is master
=======
this is dev
>>>>>>> dev
(注:这时候已经不能再在dev和master间切换分支了,因为git正在等待你将文本间的差异修正,然后合并分支)
这时应该把这一片段的文本改成你所希望的样子,然后git add 和git commit -m ' ',git就会按你的修改修正文本间的差异然后自动合并分支。
输入指令git log --graph --pretty=oneline --abvert-commit
可以查看这一部分的操作日志。
临时分支
假设现在有主分支master和分支dev,正在分支dev上工作且工作还未提交时,接到新任务,要创建一个临时分支issue去完成任务。这时候如果直接创建并切换到新的分支issue,会导致分支dev上的工作丢失。所以需要通过在dev分支上执行指令:git stash,将dev分支上的工作冻结起来。待新任务完成后,再次回到dev分支时,通过执行指令:git stash pop解冻。(或者git stash apply 然后 git stash drop)
强制删除
假设上一个情境中,新任务最后被取消,所以临时分支issue要删除。但在输入指令:git branch -d issue后会报错,因为临时分支并未被合并。这时候(先切换到其他分支,因为不能再issue分支上删除issue自己) 要通过指令强制删除临时分支:git branch -D issue 。
多人协作
0.在GitHub上完成多人协作的任务,在分支dev上工作。合作者从远程仓库‘origin'上clone到本地仓库时,默认只能得到master分支。要创建远程仓库origin的dev分支到本地,需要执行命令:git checkout -b dev origin/dev 。
1.多人合作时,不同人的dev肯定是不一样的。所以在执行:git push origin dev时遇到失败很正常,因为dev已经被合作者更新过了,需要将新版本的dev与本地的合并。
2.先创建本地dev分支与远程origin/dev分支的链接(否则git pull会失败):git branch --set-upstream dev origin/dev 。
3.然后执行git pull ,把最新的origin/dev抓取下来,在本地合并后再推送更新origin/dev。
(图片来源:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/0013758410364457b9e3d821f4244beb0fd69c61a185ae0000)
所以,在最后,多人协作的分支情况如上。每个人在自己的分支上工作,然后把工作成果更新到dev上,最后在合并到master上。