git01

分支

基本概念

作用:假设我们正在开发一个新功能,但是需要两个周才能完成,第一周写了50%的代码,如果立刻提交,由于代码还没有写完,不完整的代码库会导致别人不能干活了。如果等代码全部写完再一次性提交,又存在丢失每天进度的巨大风险。而分支,就是属于我们自己的分支,别人看不到,它们还继续在原来的分支上正常工作,但是我们就可以在自己的分支上干活,想提交就提交,直到开发完毕后,再一次性合并到原来的分支上,这样既安全又不影响别人工作。

创建与合并分支

每次提交,git都把它们串成一条时间线,这条时间线就是一个分支。只有一条线的这个分支叫做主分支,即master。HEAD严格来说不是指向提交,而是指向master,master才是指向提交的,所以HEAD指向的就是当前的分支。

当我们创建新的分支,例如dev的时候,git创建了一个指针叫dev,指向master相同的提交,再把HEAD指向dev。就表示当前分支在dev上。所以git创建一个分支很快,只是增加了一个dev指针,改改HEAD的指向,工作区的文件都没有任何变化。不过从现在开始,对工作取得修改和提交就是针对dev分支了,比如新提交一次后,dev指针往前移动一步,而master指针保持不变。

在dev分支上的工作完成了,就可以把dev合并到master上。怎么合并呢?直接把master指针指向dev当前的提交,所以git合并分支也很快,就改改指针,工作区内容也不变。

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

创建dev分支

1
$ git checkout -b dev//创建dev分支并且切换到dev分支
checkout```命令加上```-b```参数表示创建并切换,相当于以下两条命令
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
~~~
$ git branch dev
$ git checkout dev
~~~
然后使用```git branch```命令查看当前分支
~~~
$ git branch
* dev
master
~~~
该```git branch```命令会列出所有分支,当前分支会有一个* 号
然后就可以在dev分支上正常提交。

当dev分支的工作完成,我们就可以切换到master分支
~~~
$ git checkout master
~~~
当我们切换到master分支上,会发现刚刚在dev分支上添加的内容不见了,这是因为哪个提交是在dev分支上,而master分支此刻的提交点并没有改变。

#### 合并分支
~~~
$ git merge dev
~~~
该```git merge```命令用于合并并指定分支到当前分支。

#### 删除分支
~~~
$ git branch -d dev
~~~

#### 注意
切换分支使用```git checkout <branch>```,而前面讲过的撤销修改则是```git checkout --<file>```。所以切换分支这个动作,用```switch```更合理。所以新版的git提供了```git switch```魔魁切换分支。
创建并切换到新的dev分支
~~~
$ git switch -c dev
~~~
直接切换到已有的master分支
~~~
$ git switch master
~~~

#### 总结
+ 查看分支: git branch
+ 创建分支: git branch < name>
+ 切换分支: git checkout < name>或者git switch < name>
+ 创建+切换分支: git checkout -b < name>或者git switch -c < name>
+ 合并某分支到当前分支: git merge < name>
+ 删除分支: git branch -d < name>
+ 分支合并图: git log --graph
+ 如果要丢弃一个没有被合并过的分支,可以通过git branch -D < name>强行删除
+ 查看远程库的命令: git remote
+ git remote -v显示更详细的信息
+ 如果从远程仓库克隆时,git自动把本地的master分支和远程的master分支对应起来了
+ 分支推送
- master分支时主分支,时刻要与远程同步
- dev分支时开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步
- bug分支只用于在本地修改bug,就没必要推送到远程了,除非老板要看每周修复了几个bug
- feature分支是否推送放到远程,取决于我们是否和团队合作在上面开发
+ 从远程抓取分支使用:git pull

## 标签
+ 创建标签: git tag < name>
+ 查看所有标签: git tag
+ 默认标签是打在最新提交的commit上的。有时候如果忘了打标签,就可以找到历史提交的commit id,然后在此打上就可以了
- git log --pretty=online --abbrev-commit
- 找到对应commit id敲入命令:git tag < tag-name> < commit id >
+ 标签不是按照时间顺序输出,而是按照字母序列排序,可以使用git show < tagname>查看标签信息
+ 标签总是和某个commit挂钩,如果这个commit既出现在master分支,又出现在dev分支,那么在这两个分支上都可以看到这个标签

### 操作标签
如果标签打错了,也可以删除:
~~~
$ git tag -d v0.1
~~~
因为创建的标签都只存储在本地,不会自动推送到远程。所以打错的标签可以在本地安全删除。

推送标签到远程:使用git push origin < name>
或者一次性全部瑞送到远程的本地标签:git push origin --tags

如果标签已经推送到远程要删除远程标签就要麻烦一点:先从本地删除```git tag -d < name>

然后从远程删除。删除命令也是pushgit push origin:refs/tags/< name>

-------------本文结束感谢您的阅读-------------