一、原理
在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
四、分支管理策略
- 合并时创建一个commit
git merge --no-ff -m "merge with no-ff" dev
-
使用Fast forward模式和不使用Fast forward模式,merge后的对比
- 分支策略
首先,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>可以删除一个远程标签。
网友评论