你成功了,他妒嫉你;你失败了,他笑话你 [登录·注册]

吕滔博客

首页 开发 运维 工具 摄影

git分支及多人协助使用教程及视频演示

工具 memory发布于January 30, 2017 标签: Git

一开始的时候,master分支是一条线,Git用master指向最新的提交,再用HEAD指向master,就能确定当前分支,以及当前分支的提交点:
0.png
每次提交,master分支都会向前移动一步,这样,随着你不断提交,master分支的线也越来越长:
<video width="400" height="300" controls="">
<source src="http://michaelliao.gitcafe.io/video/master-branch-forward.mp4">
<source src="https://www.lvtao.net/usr/uploads/2017/01/1865069616.mp4">
</video>
当我们创建新的分支,例如dev时,Git新建了一个指针叫dev,指向master相同的提交,再把HEAD指向dev,就表示当前分支在dev上:
0.png
你看,Git创建一个分支很快,因为除了增加一个dev指针,改改HEAD的指向,工作区的文件都没有任何变化!
不过,从现在开始,对工作区的修改和提交就是针对dev分支了,比如新提交一次后,dev指针往前移动一步,而master指针不变:
0.png
假如我们在dev上的工作完成了,就可以把dev合并到master上。Git怎么合并呢?最简单的方法,就是直接把master指向dev的当前提交,就完成了合并:
0.png
所以Git合并分支也很快!就改改指针,工作区内容也不变!

合并完分支后,甚至可以删除dev分支。删除dev分支就是把dev指针给删掉,删掉后,我们就剩下了一条master分支:
0.png

下面开始实战。

首先,我们创建dev分支,然后切换到dev分支:

$ git checkout -b dev
Switched to a new branch 'dev'

git checkout命令加上-b参数表示创建并切换,相当于以下两条命令:

$ git branch dev
$ git checkout dev
Switched to branch 'dev'

然后,用git branch命令查看当前分支:

$ git branch
* dev
  master

git branch命令会列出所有分支,当前分支前面会标一个*号。
然后,我们就可以在dev分支上正常提交,比如对readme.txt做个修改
然后提交:

$ git add readme.txt 
$ git commit -m "branch test"

现在,dev分支的工作完成,我们就可以切换回master分支:

$ git checkout master

切换回master分支后,再查看一个readme.txt文件,刚才添加的内容不见了!因为那个提交是在dev分支上,而master分支此刻的提交点并没有变

现在,我们把dev分支的工作成果合并到master分支上:

$ git merge dev
Updating d17efd8..fec145a
Fast-forward
 readme.txt |    1 +
 1 file changed, 1 insertion(+)

git merge命令用于合并指定分支到当前分支。合并后,再查看readme.txt的内容,就可以看到,和dev分支的最新提交是完全一样的。

注意到上面的Fast-forward信息,Git告诉我们,这次合并是“快进模式”,也就是直接把master指向dev的当前提交,所以合并速度非常快。

当然,也不是每次合并都能Fast-forward,我们后面会讲其他方式的合并。

合并完成后,就可以放心地删除dev分支了:

$ git branch -d dev

删除后,查看branch,就只剩下master分支了:

$ git branch
* master

因为创建、合并和删除分支非常快,所以Git鼓励你使用分支完成某个任务,合并后再删掉分支,这和直接在master分支上工作效果是一样的,但过程更安全。

小结
Git鼓励大量使用分支:

查看分支:git branch
创建分支:git branch <name>
切换分支:git checkout <name>
创建+切换分支:git checkout -b <name>
合并某分支到当前分支:git merge <name>
删除分支:git branch -d <name>

解决合并冲突
<video width="648" height="434" controls="">
<source src="http://michaelliao.gitcafe.io/video/resolv-conflix-on-merge.mp4">
<source src="https://www.lvtao.net/usr/uploads/2017/01/2547952336.mp4"></video>

多人协作
<video width="648" height="434" controls="">
<source src="http://michaelliao.gitcafe.io/video/git-pull-push-fix.mp4">
<source src="http://github.liaoxuefeng.com/sinaweibopy/video/git-pull-push-fix.mp4">
</video>

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

首先,可以试图用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 branch-name origin/branch-name;

从远程抓取分支,使用git pull,如果有冲突,要先处理冲突。

相关推荐

添加新评论

网站状态

  • 栏目分类:35个
  • 发布文章:1109篇
  • 用户评论:620条

最新回复

  • 香港服务器: 很详细,学习了
  • memory: 对,这个密钥最好是自己换一下。当然不嫌麻烦甚至可以考虑将密钥做到...
  • 小明明: 在加密的时候 秘钥固定不就可以机密了吗
  • 上海代理记账: 看起来代码有一些复杂的呀。。。
  • 香港云服务器: 站长不错,不错的干货
  • yet handsome: 我看了你的这个发现历史真的是惊人的相似,我们已经做到redis集...
  • memory: 好久不玩它们了,我的相关知识来自谷歌...
  • 于小鱼: 你好,想请教一些关于xen和kvm的问题。
  • memory: 如果将图片 base64_encode 后,再想取回以前的路径不...
  • 陈凌风: 我要区正常的路径显示怎么办?
  • genuiner: 牛逼
  • haitongz: 赞
  • memory: php64位? 这个我还真没有注意。。。回头再试试
  • Kngstr: 这个很简单,你用的PHP不是64位的,64位的dll只能在64位...
  • memory: 使用的是typecho.
  • GavinHsueh: 您好,我了解下您的博客是自己开发的么?看着很不错
  • 个人博客: 看看先
  • memory: 谢谢,已修正。
  • jrotty: 方法一中next后面少个'符号
  • daxia: mark