Git管理分支
在实际开发中,我们应该按照价格基本原则进行分制管理:
首先,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;
那在哪干活呢?干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;
你和你的小伙伴们每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了。
所以,团队合作的分支看起来就像这样:
当我们创建新的分支,例如dev时,Git新建了一个指针叫dev,指向master相同的提交,再把HEAD指向dev,就表示当前分支在dev上:
那么从现在开始,对工作区的修改和提交就是针对dev分支了,比如新提交了一个修改后,dev指针往前移一步,而master的指针是不变的。
假如我们已经在dev上完成了工作,就可以把dev合并到master上,如何合并?
最简答的就是直接把master指向dev的当前提交,就完成了合并~
如图:
所以git的合并也很快,就改改指针,工作区内容不改变~
合并完成后,甚至可以删除dev分支,删除后,就只剩下一条master分支了!
实战:
创建dev分支,并切换至dev分支:
[root@VM-75-64 test]# ll
total 8
-rw-r--r-- 1 root root 9 May 15 11:41 readme.md
-rw-r--r-- 1 root root 7 May 15 11:41 test.txt
[root@VM-75-64 test]# pwd
/root/test
[root@VM-75-64 test]#
[root@VM-75-64 test]#
[root@VM-75-64 test]# git branch #查看分支列表,* 所在的分支就是当前分支
* master
[root@VM-75-64 test]# git checkout -b dev #相当于两步操作,git branch dev:创建分支;git checkout dev:切换分支
Switched to a new branch 'dev'
[root@VM-75-64 test]# git branch # 成功切换至dev分支
* dev
master
[root@VM-75-64 test]# ll #本地工作区的文件是不变的~
total 8
-rw-r--r-- 1 root root 9 May 15 11:41 readme.md
-rw-r--r-- 1 root root 7 May 15 11:41 test.txt
[root@VM-75-64 test]#
此时我们在dev分支上正常提交:
修改readme.md
添加一行:
[root@VM-75-64 test]# vim readme.md
Git test
Create a new branch is quick
[root@VM-75-64 test]# git add readme.md
[root@VM-75-64 test]# git commit -m 'branch test'
[dev 3501a30] branch test
1 files changed, 1 insertions(+), 0 deletions(-)
[root@VM-75-64 test]# git status
# On branch dev
nothing to commit (working directory clean)
[root@VM-75-64 test]#
好,提交成功~
此时dev的工作提交完成,我们切回master分支~
[root@VM-75-64 test]# git checkout master
Switched to branch 'master'
[root@VM-75-64 test]# git status
# On branch master
nothing to commit (working directory clean)
[root@VM-75-64 test]# git branch
dev
* master
[root@VM-75-64 test]# ll
total 8
-rw-r--r-- 1 root root 9 May 15 14:42 readme.md
-rw-r--r-- 1 root root 7 May 15 11:41 test.txt
[root@VM-75-64 test]# cat readme.md #切回master分支以后我们发现,readme.md还是原来的版本!
Git test
现在,我们把dev分支的成果合并到master分支上!
[root@VM-75-64 test]# git merge dev #git merge ***:就是把***分支的代码合并到当前分支的指令。
Updating df4ceaf..3501a30
Fast-forward #这里git告诉我们,这次合并是快进模式,也即是直接把master的HEAD指向到dev上!
readme.md | 1 + #修改的目标文件
1 files changed, 1 insertions(+), 0 deletions(-) #具体的修改情况
[root@VM-75-64 test]# cat readme.md
Git test
Create a new branch is quick #你会发现,dev的修改,已经合并到当前的master上了!
[root@VM-75-64 test]#
上面说到的快进模式,其实还有其他种的合并方式,后面在讲解。
合并完成后,我们就能放心的删除dev分支了~
[root@VM-75-64 test]# git branch
dev
* master
[root@VM-75-64 test]# git branch -d dev
Deleted branch dev (was 3501a30).
[root@VM-75-64 test]# git branch
* master #ok,这里只剩下master分支了!
好的,现在来看下除了fast forward模式的其他的模式:
我们知道 Fast forward 模式在删除掉分支之后,会丢掉分支的信息,如果要强制禁用Fast forward 模式,就要在合并的回收加一个参数: --no-ff方式的git merge
我们再重演下上面的步骤:
[root@VM-75-64 test]# git checkout -b dev
Switched to a new branch 'dev'
[root@VM-75-64 test]# vim readme.md
Git test
Create a new branch is quick
Create a new branch is quick and simple
Ok let us deploy it together
dev branch deploy
[root@VM-75-64 test]# git add readme.md
[root@VM-75-64 test]# git commit -m 'dev deploy'
[dev 762a637] dev deploy
1 files changed, 1 insertions(+), 0 deletions(-)
[root@VM-75-64 test]# git checkout master #切回master主分支
Switched to branch 'master'
Your branch is ahead of 'origin/master' by 10 commits.
[root@VM-75-64 test]# ll
total 8
-rw-r--r-- 1 root root 107 May 15 18:12 readme.md
-rw-r--r-- 1 root root 7 May 15 11:41 test.txt
[root@VM-75-64 test]# cat readme.md
Git test
Create a new branch is quick
Create a new branch is quick and simple
Ok let us deploy it together
[root@VM-75-64 test]# git merge --no-ff -m 'merge with --no-ff' dev #这里使用了--no-ff参数,去把dev分支的代码合并到本地!
Merge made by recursive. #这里没有提示fast forward 模式了!
readme.md | 1 +
1 files changed, 1 insertions(+), 0 deletions(-)
[root@VM-75-64 test]# cat readme.md
Git test
Create a new branch is quick
Create a new branch is quick and simple
Ok let us deploy it together
dev branch deploy
[root@VM-75-64 test]# git log --graph --pretty=oneline --abbrev-commit
* eec652d merge with --no-ff
|\
| * 762a637 dev deploy
|/
这里可以看到分支合并的信息...
好的,这部分的内容也就到这里了!
注意 git merge 的时候,使用--no-ff参数,同时 -m 加上备注信息。
在这里,git鼓励用户大量使用分支,因为每一个分支都是master的一个缩影,在真实的企业环境中,大多也只是配置文件的不同,功能大多都是一样的!所以,这里多分支就相当于一个备份~
Git分支十分强大,在团队开发中应该充分应用。
合并分支时,加上--no-ff参数就可以用普通模式合并,合并后的历史中会保留有分支记录,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。
总结下指令:
查看分支:git branch
创建分支:git branch <name>
切换分支:git checkout <name>
创建+切换分支:git checkout -b <name>
合并某分支到当前分支:git merge <name>
合并某分支到当前分支:git merge --no-ff -m '**' <name>
删除分支:git branch -d <name>(已经合并过的分支)
删除分支: git branch -D <name> (还没有合并到master的分支)
以上,共勉!