天天看点

Git教程5(bug分支和多人协作及标签管理)

bug分支

 在开发中,会经常碰到bug问题,那么有了bug就需要修复,在Git中,分支是很强大的,每个bug都可以通过一个临时分支来修复,修复完成后,合并分支,然后将临时的分支删除掉。

比如我在开发中接到一个404 bug时候,我们可以创建一个404分支来修复它,但是,当前的dev分支上的工作还没有提交。比如如下:

Git教程5(bug分支和多人协作及标签管理)
 并不是我不想提交,而是工作进行到一半时候,我们还无法提交,比如我这个分支bug要2天完成,但是我issue-404 bug需要5个小时内完成。怎么办呢?还好,Git还提供了一个stash功能,可以把当前工作现场 ”隐藏起来”,等以后恢复现场后继续工作。如下:
Git教程5(bug分支和多人协作及标签管理)
 所以现在我可以通过创建issue-404分支来修复bug了。首先我们要确定在那个分支上修复bug,比如我现在是在主分支master上来修复的,现在我要在master分支上创建一个临时分支,演示如下:
Git教程5(bug分支和多人协作及标签管理)
 修复完成后,切换到master分支上,并完成合并,最后删除issue-404分支。演示如下:
Git教程5(bug分支和多人协作及标签管理)
 现在,我们回到dev分支上干活了。
Git教程5(bug分支和多人协作及标签管理)
 工作区是干净的,那么我们工作现场去哪里呢?我们可以使用命令 git stash list来查看下。如下:
Git教程5(bug分支和多人协作及标签管理)

 工作现场还在,Git把stash内容存在某个地方了,但是需要恢复一下,可以使用如下2个方法:

git stash apply恢复,恢复后,stash内容并不删除,你需要使用命令git stash drop来删除。

另一种方式是使用git stash pop,恢复的同时把stash内容也删除了。

演示如下

Git教程5(bug分支和多人协作及标签管理)

小结:修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除;

当手头工作没有完成时,先把工作现场git stash一下,然后去修复bug,修复后,再git stash pop,回到工作现场

多人协作

 当你从远程库克隆时候,实际上Git自动把本地的master分支和远程的master分支对应起来了,并且远程库的默认名称是origin。

要查看远程库的信息 使用 git remote

要查看远程库的详细信息 使用 git remote –v

Git教程5(bug分支和多人协作及标签管理)

推送通知

 推送分支就是把该分支上所有本地提交到远程库中,推送时,要指定本地分支,这样,Git就会把该分支推送到远程库对应的远程分支上: 使用命令 git push origin master,比如我现在的github上的read.txt代码如下:

Git教程5(bug分支和多人协作及标签管理)
本地的read.txt代码如下:
Git教程5(bug分支和多人协作及标签管理)
 现在我想把本地更新的read.txt代码推送到远程库中,使用命令如下:
Git教程5(bug分支和多人协作及标签管理)
 我们可以看到如上,推送成功,我们可以继续来截图github上的read.txt内容 如下:
Git教程5(bug分支和多人协作及标签管理)

 可以看到 推送成功了,如果我们现在要推送到其他分支,比如dev分支上,我们还是那个命令 git push origin dev,那么一般情况下,那些分支要推送呢?

master分支是主分支,因此要时刻与远程同步。

一些修复bug分支不需要推送到远程去,可以先合并到主分支上,然后把主分支master推送到远程去。

抓取分支

 多人协作时,大家都会往master和dev分支上推送各自的修改。现在,模拟一个你的小伙伴,可以在另一台电脑(注意要把SSH Key添加到GitHub)或者同一台电脑的另一个目录下克隆

我在本地目录下新建一个文件夹来模拟另一个用户。

Git教程5(bug分支和多人协作及标签管理)
在此目录下克隆
Git教程5(bug分支和多人协作及标签管理)
 当你的小伙伴从远程库clone时,默认情况下,你的小伙伴只能看到本地的master分支。不信可以用git branch命令看看
Git教程5(bug分支和多人协作及标签管理)
 现在,你的小伙伴要在dev分支上开发,就必须创建远程origin的dev分支到本地,于是他用这个命令创建本地dev分支:
Git教程5(bug分支和多人协作及标签管理)
将dev1分支push到远程
Git教程5(bug分支和多人协作及标签管理)
如果还是这个错误
Git教程5(bug分支和多人协作及标签管理)
那么先执行 git fetch。
Git教程5(bug分支和多人协作及标签管理)
 现在,他就可以在dev上继续修改,然后,时不时地把dev分支push到远程:
Git教程5(bug分支和多人协作及标签管理)
Git教程5(bug分支和多人协作及标签管理)
Git教程5(bug分支和多人协作及标签管理)
 你的小伙伴已经向origin/dev分支推送了他的提交,而碰巧你也对同样的文件作了修改,并试图推送:
Git教程5(bug分支和多人协作及标签管理)
推送失败
Git教程5(bug分支和多人协作及标签管理)
 推送失败了,因为你的小伙伴的最新提交和你试图推送的提交有冲突,解决办法也很简单,Git已经提示我们,先用git pull把最新的提交从origin/dev抓下来,然后,在本地合并,解决冲突,再推送:
Git教程5(bug分支和多人协作及标签管理)
git pull也失败了,原因是没有指定本地dev分支与远程origin/dev分支的链接,根据提示,设置dev和origin/dev的链接:
Git教程5(bug分支和多人协作及标签管理)

$ git branch --set-upstream-to=origin/dev1 dev1
Branch 'dev1' set up to track remote branch 'dev1' from 'origin'.      

这回git pull成功,但是合并有冲突,需要手动解决,解决的方法和分支管理中的解决冲突完全一样。解决后,提交,再push:

Git教程5(bug分支和多人协作及标签管理)
Git教程5(bug分支和多人协作及标签管理)
Git教程5(bug分支和多人协作及标签管理)

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

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

如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;

如果合并有冲突,则解决冲突,并在本地提交;

没有冲突或者解决掉冲突后,再用git push origin <branch-name>推送就能成功!

如果git pull提示no tracking information,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to <branch-name> origin/<branch-name>。

这就是多人协作的工作模式,一旦熟悉了,就非常简单。

标签管理

 git里边默认的版本好不容易记。对于一些里程碑版本,需要记下来,此时可以使用标签,给项目的发布版本打标签,也是标签的一个重要功能之一

创建标签

在Git中打标签非常简单,首先,切换到需要打标签的分支上:

Git教程5(bug分支和多人协作及标签管理)

然后执行 git tag <name> 就可以打一个新标签

Git教程5(bug分支和多人协作及标签管理)

可以用命令git tag查看所有标签:

Git教程5(bug分支和多人协作及标签管理)

默认标签是打在最新提交的commit上的。有时候,如果忘了打标签,比如,现在已经是周五了,但应该在周一打的标签没有打,怎么办?

方法是找到历史提交的commit id,然后打上就可以了:

Git教程5(bug分支和多人协作及标签管理)

比如要对’添加了一个文件同时修改了一个文件’打个标签

Git教程5(bug分支和多人协作及标签管理)

注意,标签不是按时间顺序列出,而是按字母排序的。可以用git show <tagname>查看标签信息:

Git教程5(bug分支和多人协作及标签管理)

还可以创建带有说明的标签,用-a指定标签名,-m指定说明文字:

Git教程5(bug分支和多人协作及标签管理)
Git教程5(bug分支和多人协作及标签管理)

操作标签

删除标签

git tag -d <tagname>

Git教程5(bug分支和多人协作及标签管理)

推送标签到远程

 因为创建的标签都只存储在本地,不会自动推送到远程。所以,打错的标签可以在本地安全删除。如果要推送某个标签到远程,使用命令git push origin <tagname>

Git教程5(bug分支和多人协作及标签管理)

如果要一次性把所有标签推送到远程,可以如下:

Git教程5(bug分支和多人协作及标签管理)

删除远程标签

 如果标签已经推送到远程,要删除远程标签就麻烦一点,先从本地删除

Git教程5(bug分支和多人协作及标签管理)

 然后,从远程删除。删除命令也是push,但是格式如下:

Git教程5(bug分支和多人协作及标签管理)
Git教程5(bug分支和多人协作及标签管理)

远程上的v0.8版本没有了。