Git的分支在实际应用中有什么作用呢?分支就像一个平行的宇宙,同时工作互不影响,在某个时间点再进行合并,两者的效果同时拥有。在实际工作中我们在一个分支上工作,如果代码完成不了提交会影响别人的工作,但是如果不提交还会面临着代码丢失的危险。所以我们可以创建一个自己的分支,在自己的分支上进行编码,提交。在完成后再将分支合并。这样既不影响工作也大大提高了安全。
1.创建合并分支
Git会把每次提交串成一个时间线,时间线就是一个分支。而Git会为我们自动创建master
分支。所以说分支是指向提交的,而HEAD
是指向当前分支的
最开始master
是指向最新提交的,而HEAD
又是指向master
这样就可以确定最新提交以及当前分支
每次提交master
分支都会向前推移一个节点,分支就会越来越长
首先说一下如何创建分支
$ git checkout -b dev
Switched to a new branch 'dev'
创建并且换到dev
分支上
相当于
git branch dev
git checkout dev
使用git branch
命令查看分支
* dev
master
可见展示了所有分支 并在当前分支前面打上了*
号
接下来我们修改a.txt
并进行提交
diff --git a/a.txt b/a.txt
index 14b6e9f..159b2d1 100644
--- a/a.txt
+++ b/a.txt
@@ -3,4 +3,5 @@ Git is Good
I am am new line
Manage Edit
-Manage Edit2
\ No newline at end of file
+Manage Edit2
+study master
\ No newline at end of file
git add a.txt
git commit -m "sixcommit"
切回master
分支
git checkout master
发现我们刚才新添加的内容没有了,因为我们是在dev
分支上进行提交 而master
分支并没有此时的提交点
我们合并分支git merge dev
此命令是将分支合并到当前分支
$ git merge dev
Updating 35bf98d..3a07802
Fast-forward
a.txt | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
注意到上面的Fast-forward
信息,Git告诉我们,这次合并是“快进模式”,也就是直接把master
指向dev
的当前提交,所以合并速度非常快。
再次查看文件
接下来删除分支git branch -d dev
* master
只剩下master
分支了
2.解决冲突
在平时的工作中master
分支是非常稳定的只能用来发布新版本不能在上面干活。
现在模拟一下这种情况
我们创建分支并在上面提交a.txt
我们切回master
分支并在a.txt
文件相同位置坐了不同修改并且提交.那么当我们合并分支的时候就有极大的可能出现冲突
此时我们查看一下冲突文件
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
Git tracks changes of files.
<<<<<<< HEAD
Creating a new branch is quick & simple.
=======
Creating a new branch is quick AND simple.
>>>>>>> feature1
我们手动删掉冲突部分并且重新提交。合并后结果
我们可以使用git log --graph
查看分支合并图
$ git log --graph --pretty=oneline --abbrev-commit
* 59bc1cb conflict fixed
|\
| * 75a857c AND simple
* | 400b400 & simple
|/
* fec145a branch test
...
3.分支管理策略
Git在合并分支的时候如果可以会使用Fast Forward
模式,但是这种情况下删除分支会丢掉分支信息
我们可以使用--no-ff
参数来禁用Fast Forward
模式 这样在合并的时候就会生成一个新的commit
但是我们可以从分支历史记录查看到分支信息
$ git merge --no-ff -m "merge with no-ff" dev
Merge made by the 'recursive' strategy.
readme.txt | 1 +
1 file changed, 1 insertion(+)
因为本次合并要创建一个新的commit
,所以加上-m
参数,把commit
描述写进去。
不使用Forward
合并之后
团队合作的分支看起来就像这样
Git分支十分强大,在团队开发中应该充分应用。
合并分支时,加上--no-ff
参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward
合并就看不出来曾经做过合并。