程序员工具

Git学习笔记2-分支管理

2017-10-14  本文已影响0人  春风十里_不如睡你

一、原理

在Git里,初始的分支叫主分支,即master分支。HEAD严格来说不是指向提交,而是指向master,master才是指向提交的,所以,HEAD指向的就是当前分支。



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



从现在开始,对工作区的修改和提交就是针对dev分支了,比如新提交一次后,dev指针往前移动一步,而master指针不变。

假如在dev上的工作完成了,就可以把dev合并到master上,就是直接把master指向dev的当前提交,就完成了合并。



合并完分支后,甚至可以删除dev分支,删除dev分支就是把dev指针给删掉。

二、相关命令

 git checkout -b dev
git branch
git checkout master
git merge dev
git branch -d dev

三、解决冲突

当两个分支各自都分别有新的提交,变成了这样,这种情况下,Git无法执行“快速合并”,只能试图把各自的修改合并起来,但这种合并就可能会有冲突。



查看冲突的文件

git status

Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容,我们需要手动解决冲突,修改完成后再提交。

git add file.java
git commit -m "confilct fixed"

现在,两个分支变成了下图所示。



查看分支的合并情况

git log --graph --pretty=oneline --abbrev-commit

四、分支管理策略

git merge --no-ff -m "merge with no-ff" dev

首先,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;
那在哪干活呢?干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;
你和你的小伙伴们每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了。
所以,团队合作的分支看起来就像这样:


五、Bug分支

修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除;
当手头工作没有完成时,先把工作现场git stash一下,然后去修复bug,修复后,再git stash pop,回到工作现场。

git stash
git stash list
git stash pop

六、Feature分支

开发一个新feature,最好新建一个分支;
如果要丢弃一个没有被合并过的分支,可以通过git branch -D <name>强行删除。

git branch -D dev

七、多人协作

多人协作的工作模式通常是这样:
首先,可以试图用git push origin branch-name推送自己的修改;
如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;
如果合并有冲突,则解决冲突,并在本地提交;
没有冲突或者解决掉冲突后,再用git push origin branch-name推送就能成功!
如果git pull提示“no tracking information”,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream branch-name origin/branch-name。
这就是多人协作的工作模式,一旦熟悉了,就非常简单

git remote -v
git push origin branch-name
git pull
git checkout -b branch-name origin/branch-name
git branch --set-upstream-to origin/branch-name branch-name

八、标签管理

命令git tag <name>用于新建一个标签,默认为HEAD,也可以指定一个commit id;
git tag -a <tagname> -m "blablabla..."可以指定标签信息;
git tag -s <tagname> -m "blablabla..."可以用PGP签名标签;
命令git tag可以查看所有标签。

命令git push origin <tagname>可以推送一个本地标签;
命令git push origin --tags可以推送全部未推送过的本地标签;
命令git tag -d <tagname>可以删除一个本地标签;
命令git push origin :refs/tags/<tagname>可以删除一个远程标签。

上一篇 下一篇

猜你喜欢

热点阅读