linux-git-04 git分支管理

linux-git-04 git分支管理

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

我们依然用本地仓库:firstgit来演示,首先看看里面的已有文件内容

1
2
3
4
5
6
7
8
9
[root@localhost firstgit]# ls
1.txt readme.txt
[root@localhost firstgit]# cat readme.txt
hello readme
[root@localhost firstgit]# cat 1
cat: 1: 没有那个文件或目录
[root@localhost firstgit]# cat 1.txt
i am first
[root@localhost firstgit]#

快速合并

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
创建分支“dev”,合并分支
[root@localhost firstgit]# git checkout -b dev
M readme.txt
切换到一个新分支 'dev'
[root@localhost firstgit]# git branch
* dev
master
[root@localhost firstgit]# cat 1.txt
i am first
[root@localhost firstgit]# echo "This is dev operation" > 1.txt
[root@localhost firstgit]# git add 1.txt
[root@localhost firstgit]# git commit -m "modify 1.txt"
[dev a0d7502] modify 1.txt
1 file changed, 1 insertion(+), 1 deletion(-)
[root@localhost firstgit]# git checkout master
M readme.txt
切换到分支 'master'
[root@localhost firstgit]# cat 1.txt
i am first
[root@localhost firstgit]# git merge dev
更新 6f7081e..a0d7502
Fast-forward
1.txt | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
[root@localhost firstgit]# cat 1.txt
This is dev operation
[root@localhost firstgit]# git branch -d dev
已删除分支 dev(曾为 a0d7502)。
[root@localhost firstgit]# cat 1.txt
This is dev operation
[root@localhost firstgit]#


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

  在上面这个例子中,主分支没有修改1.txt,只有dev分支修改了1.txt,那么主分支与dev分支合并的时候就不会产生冲突。与其说是合并,倒不如理解成没有主见的主分支采取了dev分支的意见,可以完成快速合并。

  那么,如果除了dev分支,还有主分支对1.txt也进行了修改,导致二者之间各抒己见,就会产生冲突,这时候就没有办法快速合并了,你得手动解决二者之间的冲突之后,才能完成合并,下面我们新建一个test分支来测试一下如何进行冲突合并。

冲突合并

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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
[root@localhost firstgit]# git checkout -b test
M readme.txt
切换到一个新分支 'test'
[root@localhost firstgit]# cat 1.txt
This is dev operation
[root@localhost firstgit]# echo "test1" >> 1.txt
[root@localhost firstgit]# cat 1.txt
This is dev operation
test1
[root@localhost firstgit]# git add 1.txt
[root@localhost firstgit]# git commit -m "add test1"
[test 11e4e6b] add test1
1 file changed, 1 insertion(+)
[root@localhost firstgit]# git checkout master
M readme.txt
切换到分支 'master'
您的分支领先 'origin/master' 共 1 个提交。
(使用 "git push" 来发布您的本地提交)
[root@localhost firstgit]# echo "test2" >> 1.txt
[root@localhost firstgit]# cat 1.txt
This is dev operation
test2
[root@localhost firstgit]# git add 1.txt
[root@localhost firstgit]# git commit -m "add test2"
[master bbf9686] add test2
1 file changed, 1 insertion(+)
[root@localhost firstgit]# git merge test
自动合并 1.txt
冲突(内容):合并冲突于 1.txt
自动合并失败,修正冲突然后提交修正的结果。
[root@localhost firstgit]#
合并失败:因为现在test分支和master分支同级,而且二者之间产生了冲突!




解决办法:
[root@localhost firstgit]# git status
# 位于分支 master
# 您的分支领先 'origin/master' 共 2 个提交。
# (使用 "git push" 来发布您的本地提交)
#
# 您有尚未合并的路径。
# (解决冲突并运行 "git commit")
#
# 未合并的路径:
# (使用 "git add <file>..." 标记解决方案)
#
# 双方修改: 1.txt
#
# 尚未暂存以备提交的变更:
# (使用 "git add <file>..." 更新要提交的内容)
# (使用 "git checkout -- <file>..." 丢弃工作区的改动)
#
# 修改: readme.txt
#
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
[root@localhost firstgit]#
[root@localhost firstgit]# cat 1.txt
This is dev operation
<<<<<<< HEAD
test2
=======
test1
>>>>>>> test
[root@localhost firstgit]#
上面这个echo显示出来的结果表示,主分支写的是test2但是test分支写的是test1,那么二者之间就产生了冲突。

这里需要我们手动修改1.txt冲突的内容,然后再次添加和提交
[root@localhost firstgit]# vim 1.txt
[root@localhost firstgit]# cat 1.txt
This is dev operation
test12
[root@localhost firstgit]#
[root@localhost firstgit]# git add 1.txt
[root@localhost firstgit]# git commit -m "test12"
[master 6caac74] test12
[root@localhost firstgit]# cat 1.txt
This is dev operation
test12
[root@localhost firstgit]#
上面重新对1.txt进行了修改和提交之后,冲突得到了解决,那么合并过程到此彻底完成。

查看分支合并情况:
[root@localhost firstgit]# git log --graph --pretty=oneline --abbrev-commit
* 6caac74 test12
|\
| * 11e4e6b add test1
* | bbf9686 add test2
|/
* a0d7502 modify 1.txt
* 6f7081e add 1.txt
* 01633f9 change messages
* c391307 write something
[root@localhost firstgit]#

Bug分支
  环境:当我们正在dev开发新功能的时候,突然有个紧急bug111需要修复,这是我们就需要将当前dev分支通过git stash命令打快照,然后假设去修改master分支上的bug,然后就需要先切换到master分支,然后再创建并切换到issue-111分支,进行修复,修复后将issue-111分支合并到master分支即可。

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
81
在test分支,修改1.txt文件,然后stash将现场快照
[root@localhost firstgit]# git checkout test
M readme.txt
切换到分支 'test'
[root@localhost firstgit]# cat 1.txt
This is dev operation
test1
[root@localhost firstgit]# echo "111" > 1.txt
[root@localhost firstgit]# cat 1.txt
111
[root@localhost firstgit]# git stash # 打快照
Saved working directory and index state WIP on test: 11e4e6b add test1
HEAD 现在位于 11e4e6b add test1
[root@localhost firstgit]#


创建issue-111分支,修复bug(修改1.txt)的内容,然后add,commit
[root@localhost firstgit]# git checkout -b issue-111
切换到一个新分支 'issue-111'
[root@localhost firstgit]# echo "11111" > 1.txt
[root@localhost firstgit]# git add 1.txt
[root@localhost firstgit]# git commit -m "change 11111"
[issue-111 93d8aa1] change 111
1 file changed, 1 insertion(+)
create mode 100644 money.txt
[root@localhost firstgit]# git status
# 位于分支 issue-111
无文件要提交,干净的工作区
[root@localhost firstgit]#


将issue-111分支合并到master分支
[root@localhost firstgit]# git checkout master
切换到分支 'master'
您的分支领先 'origin/master' 共 6 个提交。
(使用 "git push" 来发布您的本地提交)
[root@localhost firstgit]# git merge issue-111
自动合并 1.txt
冲突(内容):合并冲突于 1.txt
自动合并失败,修正冲突然后提交修正的结果。
[root@localhost firstgit]# vim 1.txt
[root@localhost firstgit]# cat 1.txt
This is dev operation
test12
11111
[root@localhost firstgit]#
[root@localhost firstgit]# git add 1.txt
[root@localhost firstgit]# git commit -m "11111"
[master bfd7bf0] 11111
[root@localhost firstgit]# git checkout test
切换到分支 'test'
[root@localhost firstgit]# git status
# 位于分支 test
无文件要提交,干净的工作区
[root@localhost firstgit]# git stash list
stash@{0}: WIP on test: 11e4e6b add test1

[root@localhost firstgit]# git stash pop # 恢复快照
# 位于分支 test
# 尚未暂存以备提交的变更:
# (使用 "git add <file>..." 更新要提交的内容)
# (使用 "git checkout -- <file>..." 丢弃工作区的改动)
#
# 修改: 1.txt
# 修改: readme.txt
#
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
丢弃了 refs/stash@{0} (0fe7895c82dba8d77ed308963093c362ce5edfe6)
[root@localhost firstgit]#


[root@node1 Shell]# cat 1.txt
111
然后继续在test分支上进行工作。


删除分支命令:
git branch -d (branchname)

若要删除一个还未合并的feature分支,可以通过
git branch -D <name>强行删除!

多人协作

  1. 查看远程库信息,使用git remote -v
  2. 本地新建的分支如果不推送到远程,对其他人就是不可见的 从本地推送分支,使用git push origin branch-name,如果推送失败,先用git pull抓取远程的新提交;
  3. 在本地创建和远程分支对应的分支,使用git checkout -b branch-name origin/branch-name,本地和远程分支的名称最好一致;
  4. 建立本地分支和远程分支的关联,使用git branch –set-upstream branch-name origin/branch-name;
  5. 从远程抓取分支,使用git pull,如果有冲突,要先处理冲突。

rebase作用

  1. rebase操作可以把本地未push的分叉提交历史整理成直线
  2. rebase的目的是使得我们在查看历史提交的变化时更容易,因为分叉的提交需要三方对比

标签管理

创建标签

  1. 命令git tag 用于新建一个标签,默认为HEAD,也可以指定一个commit id;
  2. 命令git tag -a -m “blablabla…”可以指定标签信息;
  3. 命令git tag可以查看所有标签。

管理标签

  1. 命令git push origin 可以推送一个本地标签;
  2. 命令git push origin –tags可以推送全部未推送过的本地标签;
  3. 命令git tag -d 可以删除一个本地标签;
  4. 命令git push origin :refs/tags/可以删除一个远程标签。
欢迎打赏,谢谢
------ 本文结束------
0%