您的位置:首页 > 其它

Git学习序列4---分支管理

2016-02-01 22:50 281 查看

引言

分支是版本管理系统里面一个重要的概念, 使得版本管理变得更加灵活. 项目分支可以用来建立临时的代码分支, 当我们编辑测试好之后再推送到主分支上, 使得项目开发变得更可控. 每个开发者可以通过创建自己的分支来方便整体项目的管理和项目成员之间的交流. 而Git相比于SVN这种集中式版本管理系统, 能够迅速地进行分支的创建, 切换和删除, 所以对于项目开发来说很方便高效.

Git进行版本控制的时候, 把每次提交作为时间线的一个节点, 每条分支都是一条时间线, 每个项目都至少有一条时间线, 对应着项目的主分支(
master
分支), 如果创建了别的分支, 就会产生新的时间线,
HEAD
指针, 严格来说, 指向的是分支, 而分支指向的则是提交, HEAD指向的便是当前的分支.

分支的创建和合并

当我们创建新的分支的时候, 比如
dev
分支, Git会创建一个新的指针
dev
指向此时
master
时间线末端, 此时的
HEAD
指针也会转而指向
dev
分支, 然而工作的文件都没有任何变化, 此后的工作的修改和提交就会变成在
dev
分支上的提交, 提交时,
master
指针不会移动, 而
dev
指针则会向前移动. 当你在
dev
分支工作完成, 就可以把
dev
分支的更改合并到
master
分支了.

分支的合并, 最简单的方式就是把
master
指针指向
dev
的最新提交, 合并完分支之后就可以删除
dev
分支了, 删除’dev
指针即可, 此时的
HEAD 指针重新会指向
master
.

下面介绍一些关于分支的一些命令

-查看分支

git branch
命令会罗列出当前工作区内所有的分支, 当前分支会用
*
在分支名前标示.

-创建和切换分支

git branch <name>
命令会创建一个名字为
name
的分支, 而使用
git checkout <name>
则可以把当前分支切换为
<name>
分支.而
git checkout -b <name>
命令则可以快速地创建一个名字为
<name>
的分支并且默认切换过去.

此时要注意, Git提交的是修改, 所以在分支内进行修改后, 也要和主分支一样, 先把修改提交到暂存区, 再进行提交.

-合并分支

git merge <name>
命令可以实现分支的合并, 把
<name>
分支的更改合并到当前分支上.此时默认使用的快速合并选项(fast-forward).

然而当本地端的提交和远程端的提交存在冲突时, 快速合并选项就不能处理这种情况了, Git会提示你冲突, 并提示你冲突的类型, 此时我们就需要根据提示先解决存在的冲突, 再进行操作. 在冲突解决后, Git会自动继续之前的合并操作.

Git合并分支是, 默认会使用fast forward方式, 但是这种模式下, 删除分之后, 会丢失分支的信息. 如果强制禁用fast forward模式, Git就会在合并的时候生成一个新的提交(在合并的时候加上
--no-ff -m
, 所以此时要在添加
-m
参数和提交的描述), 这样从分支历史上就可以看出分支的信息.

-删除分支

git branch -d <name>
命令可以用来删除分支, 要注意删除操作不能删除当前所在的分支. 在进行删除的时候, 参数
-d
会先确认分支是否已经完全合并再进行删除, 而
-D
则不会检查是否已经合并直接进行删除.

分支管理策略

通常在实际的开发中, 我们通常使用
master
分支来管理较为稳定的项目内容, 用
dev
分支来进行所有的不稳定的开发工作, 开发完成之后就把
dev
分支合并懂啊
master
分支上, 同时同一个项目的不同开发人员通常都有自己的分支, 再在需要的时候把自己的开发内容合并到
dev
分支.此外由于程序都避免不了bug的问题, 所以我们还可以建立bug分支来进行bug修复, 在修复bug的时候, 为了不破坏原有的开发流程与顺序, 我们可以利用Git的
stash
功能,

$ git stash


把当前的开发环境进行快照保存, 此时的工作区将是clean的, 然后我们就可以有序地创建bug分支来进行bug的修复.

bug的修复首先要先确定要在哪个分支上进行修复.然后在那个分支上创建临时分支进行bug修复, 修复完成之后进行合并并删除临时分支即可. 此时我们就可以回到我们之前离开的位置, 首先我们可以使用
git stash list
命令查看stash储存的情况, 此时我们可以使用
git stash apply
命令进行恢复, 这样做, stash内容并没有被删除, 需要在用
git stash drop
命令才能删除stash 储存的内容. 我们也可以直接用
git stash pop
命令直接在恢复的同时把stash里的内容也删了.如果stash list里有多个保存的内容, 我们就可以先使用
git stash list
查看哥哥stash内容的序号, 再使用
git stash apply ?
进行恢复(?为你指定的内容)

多人协作

利用Git进行多人协作, 我们可以根据分支的不同进行本地库与远端库之间的同步过程. 像
master
分支, 属于项目的主分支, 所以要时时与云端的版本进行同步, 同理,
dev
分支作为
master
分支的候选版本的诞生分支, 开发人员要经常进行同步进行交流. 而通常bug分支再修复之后就被删除了, 就没有很大必要推送到云端.

我们可以使用

git push origin to_push_branch
来进行向云端的推送(origin是远程仓库的默认名称).

通常从远程库进行clone的时候, 本地只能看到项目的master分支, 如果想要在dev分支上进行开发, 就必须手动在本地创建dev分支并和远程的dev分支连接起来.

$ git checkout -b dev origin/dev
此时就可以通过
git push
向云端的dev分支推送更改了.

如果多个开发者对同一个文件进行了修改, 那么第一个开发者推送后, 云端的dev分支就已经发生了变化, 此时第二个开发者进行dev分支更改的推送时便会发生冲突, 此时, 我们需要把最新的云端的dev分支抓取下来

$ git branch --set-upstream dev origin/dev


$ git pull


然后在本地进行合并(可以参看上一节), 解决冲突之后进行推送.

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

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

如果推送失败,则因为远程分支比你的本地更新,需要先用
git pull
试图合并;如果
git pull
提示“no tracking information”,则说明本地分支和远程分支的链接关系没有创建,用命令
git branch --set-upstream branch-name origin/branch-name
。如果合并有冲突,则解决冲突,并在本地提交;没有冲突或者解决掉冲突后,再用
git push origin branch-name
推送就能成功!

参考文献:

1. 廖雪峰的Git教程

2. 阮一峰的网络日志

3. 网络
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: