阿宁的linux学习----Git分支管理

这是我学习linux的过程,每天都会更新所学习的知识总结,每个例子都是我自己的亲手实践的,作为新人的我希望各位大佬提出宝贵的意见!!

分支在实际中有什么用呢?假设你准备开发一个新功能,但是需要两周才能完成,第一周你写了50%的代码,如果立刻提交,由于代码还没写完,不完整的代码会导致别人不能干活了。如果等代码全部写完再一次提交,又存在丢失每天进度的巨大风险。

现在有了分支,就不用怕了。你创建了一个属于你自己的分支,别人看不到,还继续在原来的分支上正常工作,而你在自己的分支上干活,想提交就提交,直到开发完毕后,再一次性合并到原来的分支上,这样,既安全,又不影响别人工作。

创建与合并分支

在版本回退里,你已经知道,每次提交,Git都把它们串成一条时间线,这条时间线就是一个分支。截止到目前,只有一条时间线,在Git里,这个分支叫主分支,即master分支。HEAD严格来说不是指向提交,而是指向master,master才是指向提交的,所以,HEAD指向的就是当前分支。
一开始的时候,master分支是一条线,Git用master指向最新的提交,再用HEAD指向master,就能确定当前分支,以及当前分支的提交点:
在这里插入图片描述

每次提交,master分支都会向前移动一步,这样,随着你不断提交,master分支的线也越来越长。
当我们创建新的分支,例如master1时,Git新建了一个指针叫master1,指向master相同的提交,再把HEAD指向dev,就表示当前分支在master1上:
在这里插入图片描述
你看,Git创建一个分支很快,因为除了增加一个master1指针,改改HEAD的指向,工作区的文件都没有任何变化!

不过,从现在开始,对工作区的修改和提交就是针对master1分支了,比如新提交一次后,master1指针往前移动一步,而master指针不变:
在这里插入图片描述
假如我们在msater1上的工作完成了,就可以把mastr1合并到master上。Git怎么合并呢?最简单的方法,就是直接把master指向master1的当前提交,就完成了合并:
在这里插入图片描述
所以Git合并分支也很快!就改改指针,工作区内容也不变!

合并完分支后,甚至可以删除master1分支。删除master1分支就是把master1指针给删掉,删掉后,我们就剩下了一条master分支:
在这里插入图片描述现在我们实际操作一下:

#首先我们创造一个版本库
[root@localhost ~]# mkdir gitfz
[root@localhost ~]# cd gitfz
[root@localhost gitfz]# git init
初始化空的 Git 版本库于 /root/gitfz/.git/
[root@localhost gitfz]# vim learnfz.txt
apple
[root@localhost gitfz]# git add learnfz.txt
[root@localhost gitfz]# git commit -m 'fz'
[master(根提交) 994fa97] fz
 Committer: root <root@localhost.localdomain>
 ....
 1 file changed, 1 insertion(+)
 create mode 100644 learnfz.txt
 
[root@localhost gitfz]# git checkout -b master1
切换到一个新分支 'master1'
#查看当前分支  当前分支前面会标一个*号。
[root@localhost gitfz]# git branch
  master
* master1
我们就可以在master1分支上正常提交,比如对learnfz.txt做个修改,加上一行:banana
[root@localhost gitfz]# vim learnfz.txt
apple
banana
#提交
[root@localhost gitfz]# git add learnfz.txt
[root@localhost gitfz]# git commit -m 'fz1'
[master1 0c064fa] fz1
 Committer: root <root@localhost.localdomain>
 1 file changed, 1 insertion(+)
#切换回master分支
[root@localhost gitfz]# git checkout master
切换到分支 'master'
#切换回master分支后,再查看一个learnfz.txt文件,刚才添加的内容不见了!因为那个提交是在master1分支上,而master分支此刻的提交点并没有变:
[root@localhost gitfz]# vim learnfz.txt
apple              

在这里插入图片描述把master1分支的工作成果合并到master上

[root@localhost gitfz]# git merge master1
更新 994fa97..0c064fa
Fast-forward
 learnfz.txt | 1 +
 1 file changed, 1 insertion(+)
 合并后,再查看readme.txt的内容,就可以看到,和master1分支的最新提交是完全一样的。
[root@localhost gitfz]# vim learnfz.txt
apple
banana

删除分支

[root@localhost gitfz]# git branch -d master1
已删除分支 master1(曾为 0c064fa)。

删除后查看

[root@localhost gitfz]# git branch
* master

解决冲突

首先我们创建一个master1分支,修改learnfz.txt

[root@localhost gitfz]# git checkout -b master1
切换到一个新分支 'master1'
[root@localhost gitfz]# vim learnfz.txt
apple
banana
watermelon

提交并切换回master分支修改learnfz.txt提交

[root@localhost gitfz]# git add learnfz.txt
[root@localhost gitfz]# git commit -m 'ct'
[master1 90b1feb] ct
 Committer: root <root@localhost.localdomain>
 1 file changed, 1 insertion(+)
[root@localhost gitfz]# git checkout master
切换到分支 'master'
[root@localhost gitfz]# vim learnfz.txt
apple
banana
durian
[root@localhost gitfz]# git add learnfz.txt
[root@localhost gitfz]# git commit -m 'ct1'
[master 58ec427] ct1
 Committer: root <root@localhost.localdomain>
 1 file changed, 1 insertion(+)

现在master分支和master1分支各部分都有新的提交变成了:
在这里插入图片描述现在我们将两个分支合并起来:

[root@localhost gitfz]# git merge master1
自动合并 learnfz.txt
冲突(内容):合并冲突于 learnfz.txt
自动合并失败,修正冲突然后提交修正的结果。

果然冲突了,我们直接查看learnfz.txt内容

root@localhost gitfz]# vim learnfz.txt
apple
banana
<<<<<<< HEAD
durian
=======
watermelon
>>>>>>> master1                              

Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容,我们修改后保存:

[root@localhost gitfz]# vim learnfz.txt
apple
banaa
#提交
[root@localhost gitfz]# git add learnfz.txt
[root@localhost gitfz]# git commit -m 'ct2'
[master ed00a5c] ct2

[root@localhost gitfz]# git status
# 位于分支 master
无文件要提交,干净的工作区

现在,master分支和master1分支变成了这样:
在这里插入图片描述这个分支我们用完之后,最后删除分支

[root@localhost gitfz]# git branch -d master1
已删除分支 master1(曾为 90b1feb)。

分支管理策略

通常,合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息。
如果要强制禁用Fast forward模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。
实验:

#首先我们先创建一个分支master1 并切换到master1 
[root@localhost gitfz]# git checkout -b master1
切换到一个新分支 'master1'
#修改learn.txt文件并提交新的commit
[root@localhost gitfz]# vim learnfz.txt
apple
banaa
watermelon                                                                           [root@localhost gitfz]# git add learnfz.txt
[root@localhost gitfz]# git commit -m 'add merge'
[master1 a725f02] add merge
 Committer: root <root@localhost.localdomain>
 1 file changed, 1 insertion(+)
 #切回到master分支
 [root@localhost gitfz]# git checkout master
切换到分支 'master'
#用--no-ff参数合并master1分支,表示禁用Fast forward
[root@localhost gitfz]# git merge --no-ff -m 'merge --no-ff' master1
Merge made by the 'recursive' strategy.
 learnfz.txt | 1 +
 1 file changed, 1 insertion(+)
#查看分支历史
[root@localhost gitfz]#  git log --graph --pretty=oneline --abbrev-commit
*   7b0ea83 merge --no-ff
|\  
| * a725f02 add merge
|/  
*   ed00a5c ct2

可以看到不用Fast forward 模式,merge后就变成了这样:
在这里插入图片描述

Bug分支

软件开发中,bug就像家常便饭一样。有了bug就需要修复,在Git中,由于分支是如此的强大,所以,每个bug都可以通过一个新的临时分支来修复,修复后,合并分支,然后将临时分支删除。
当你接到一个修复一个代号1的bug的任务时,很自然地,你想创建一个分支issue来修复它,但是,等等,当前正在master上进行的工作还没有提交:

#保存当前状态
[root@localhost gitfz]# git stash
Saved working directory and index state WIP on master: 7b0ea83 merge --no-ff
HEAD 现在位于 7b0ea83 merge --no-ff
#创建issue分支处理bug
[root@localhost gitfz]# git checkout -b issue
切换到一个新分支 'issue'
#修复bug后切换回master完成合并,最后删除issue分支
[root@localhost gitfz]# git checkout master
切换到分支 'master'
[root@localhost gitfz]# git merge --no-ff -m "merged bug " issue
Merge made by the 'recursive' strategy.
 learnfz.txt | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
#查看当前状态列表
[root@localhost gitfz]# git stash list
stash@{0}: WIP on master: 7b0ea83 merge --no-ff
#恢复修复bug之前的状态,恢复同时把stash内容也删了
[root@localhost gitfz]# git stash pop
#再查看当前状态列表
[root@localhost gitfz]# git stash list

Feature分支

在开发打过程中肯定有很多的新功能不断添加进来,在添加新功能时肯定不希望一些实验性质的代码,把主分支搞乱了,所以,每添加一个新功能,最好新建一个feature分支,在上面开发,完成后,合并,最后,删除该feature分支。
在实际开发的过程中这个东西也可以不用删除的,留着万一哪天又要用了就可以直接拿出来用就可以了。
其实这就是一个强制删除没有被合并的分支的命令

[root@localhost gitfz]# git branch -D master1
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值