分支管理是git的精华所在!
文章结构:
1. 理解分支操作
说明:图中一个圆圈代表一个commit id,即一次提交。
①当用户创建一个新的分支(假设叫做myBranch)时,GIT会建立一个新的myBranch指针指向master的提交点。再将HEAD指向myBranch(HEAD永远指向当前工作的分支):
②当myBranch分支commit后:
③此时master分支的版本号落后于子分支了(而master分支与发布版本保持一致),将子分支与master分支进行合并
以上便是一个完整的分支操作模型。
2. 熟悉几个命令:
- 创建分支
$ git branch brh |
- 重命名分支(brh分支重命名为brh2)
$ git branch -m brh brh2 |
- 查看分支
$ git branch -a |
查看全部分支(本地和远程) |
$ git branch -r |
只查看远程分支 |
$ git branch -l |
只查看本地分支 = git branch |
- 删除分支
$ git branch -d brh(需要先切换到别的分支) |
$ git branch -D brh (强制删除,无论提交合并与否) |
- 创建并切换分支到brh
$ git checkout -b brh |
- 查询状态(在哪个分支就显示哪个分支状态)
$ git status |
- 推送两个分支到远端仓库
$ git remote set-url origin https://github.com/fanta/project.git #远端切换回origin主机
$ git push origin master
$ git push origin brh
- 合并两个分支
$ git merge brh #必须先切换到其他分支上再操作,表示将brh分支合并到当前分支
这是一种“Fast-forward”,即“快速合并”方式。master分支上并不会产生commit id。如下图所示
合并完成后brh分支便没有了意义,可以删除掉:
$git branch -d brh
提交master到远端
$ git push origin master
此时,只是删除了本地分支,远端分支还在,删除远端分支:
$git push origin --delete brh
3. 冲突
myBranch分支在原来版本基础上修改并提交了一个文件,接下来master分支也修改并提交了同一文件。
冲突示意图:
接下来合并分支的时候 $ git merge brh 便会产生冲突。
示例:
此时master分支的文件会展示冲突的部分(中间的“=======”用来分隔),此时需要手动解决冲突
假如说我们需要同时保留这两个分支的更改,那么将代码改成我们想要的样子:
之后master分支提交即可: $ git commit -a -m"conflict print"
冲突处理完毕,向远端服务器提交最终信息:
$ git push origin master
可能会用到的命令:
$ git log --graph --pretty=oneline
$ git branch -d brh |
4. 分支管理策略
4.1 --no-ff 参数
与“Fast forword”方式不同。此方式合并时会自动再生成一个新的commit id.
$ git merge--no-ff -m "no ff commit" brh
策略:
- master分支应非常稳定,仅用来发布新版本,不要再次分支上开发;
- 在各个子分支上进行开发工作
- 团队中的每个成员都在各个分支上工作
5. 分支暂存
使用情境:当前分支未开发完成,故不能提交,却有事得走开做其他开发任务。此时便需要分支暂存
步骤:
①先加入暂存区中 $git add
将工作暂存起来 $ git stash
②切换到其他任务的分支上:$ git checkout other完成任务,切换回分支
③调出暂存列表进行查看$git stash list
总暂存区中恢复(两种)
- $ git stash apply #先恢复
$ git stash drop #再手工删除暂存
- $ git stash pop #恢复同时删除暂存
6. 补丁
只将不一样的数据打成补丁传输给开发者,而不需要进行大量代码的传输。
(1)git diff 生成标准patch——兼容性好、容易接受
首先需要保证两个开发者在同一个版本
模拟第一个开发者:
$ git checkout -b brh1
修改文件…
$ git diff 文件名 可查看修改内容
$ git commit -a -m "修改了XXX"
$ git diffmaster > mypatch
此时工作区也产生了一个mypatch的文件:
模拟第二个开发者:
要从master分支切换,以保证brh1和brh2在同一个版本。
$ git checkout -b brh2
应用补丁信息:
$ git apply mypatch
$ git commit -a -m "提交一号开发者的补丁"
切换回master进行分支合并:
$ git checkout master
$ git merge --no-ff -m "Merge Path" brh2
(2) git format-patch生成GIT专用补丁——多应用于社区公共开发。有一个号码更正人信息会向社区公布
首先要保证两个开发者要在同一个版本。
$ git format-patch -M master
"-M" 表示“指定分支” 与master分支对比。
会生成一个补丁信息: 如001-add-Hello.java.patch
此时目录中也会生成patch文件
将其名称用email发给另一个开发者。
从master切换到另一个分支 $ git checkout -b brh2 以保证和brh1同一个版本
应用补丁信息:$ git am001-Add-toString-Method.path
7. 多人协作开发
开发者一号:
完成作业,提交远端:git push origin master:master
开发者二号(单机实验时注意要重新建立仓库充当另一开发者):
克隆: $ git clone https://github.com/github-fanta/test.git
此时这拷贝了master分支,拷贝其他远端brh分支:
$ git merge origin/brh
作业完成
推送到远端master分支上 $ git push origin brh:master
开发者一号此时的数据已经过时,成为脏数据,更新数据有两种方式:
在更新之前需要先进行分支关联,确定从那个分支抓取
$ git branch --set-upstream-to=origin/master
$ git fetch 只取得最新的分支数据,但不会发生merge 合并
$ git pull 取得最新分支数据,且发生merge
一号开发者在pull的时候可能会产生冲突(二号开发者的推送和自己在本地修改了同一文件)
这时需要手动解决修改成自己需要的样子
然后提交本地,提交远端