【git操作】高级篇

分支 (branch)

Git的分支功能可以支持同时进行多个功能的开发和版本管理。
分支是为了将修改记录的整体流程分叉保存。分叉后的分支不受其他分支的影响,所以在同一个数据库里可以同时进行多个修改。在这里插入图片描述
分叉的分支可以合并。
为了不受其他开发人员的影响,您可以在主分支上建立自己专用的分支。完成工作后,将自己分支上的修改合并到主分支。因为每一次提交的历史记录都会被保存,所以当发生问题时,定位和修改造成问题的提交就容易多了。

master分支

在数据库进行最初的提交后, Git会创建一个名为master的分支。因此之后的提交,在切换分支之前都会添加到master分支里。

分支的运用

Merge分支

Merge分支是为了可以随时发布release而创建的分支,它还能作为Topic分支的源分支使用。保持分支稳定的状态是很重要的。如果要进行更改,通常先创建Topic分支,而针对该分支,可以使用Jenkins之类的CI工具进行自动化编译以及测试。

通常,大家会将master分支当作Merge分支使用。

Topic分支

Topic分支是为了开发新功能或修复Bug等任务而建立的分支。若要同时进行多个的任务,请创建多个的Topic分支。

Topic分支是从稳定的Merge分支创建的。完成作业后,要把Topic分支合并回Merge分支

分支的切换

若要切换作业的分支,就要进行checkout操作。

HEAD
HEAD指向的是现在使用中的分支的最后一次更新。通常默认指向master分支的最后一次更新。通过移动HEAD,就可以变更使用的分支。

stash
stash是临时保存文件修改内容的区域。stash可以暂时保存工作树和索引里还没提交的修改内容,您可以事后再取出暂存的修改,应用到原先的分支或其他的分支上。

分支的合并

合并分支有2种方法:使用merge或rebase。使用这2种方法,合并后分支的历史记录会有很大的差别。

merge
使用merge可以合并多个历史记录的流程。
如下图所示,bugfix分支是从master分支分叉出来的。

合并 bugfix分支到master分支时,如果master分支的状态没有被更改过,那么这个合并是非常简单的。 bugfix分支的历史记录包含master分支所有的历史记录,所以通过把master分支的位置移动到bugfix的最新分支上,Git 就会合并。这样的合并被称为fast-forward(快进)合并。

但是,master分支的历史记录有可能在bugfix分支分叉出去后有新的更新。这种情况下,要把master分支的修改内容和bugfix分支的修改内容汇合起来。

因此,合并两个修改会生成一个提交。这时,master分支的HEAD会移动到该提交上。

执行合并时,如果设定了non fast-forward选项,即使在能够fast-forward合并的情况下也会生成新的提交并合并。

rebase
如果使用rebase方法进行分支合并,会出现下图所显示的历史记录。现在我们来简单地讲解一下合并的流程吧。
首先,rebase bugfix分支到master分支, bugfix分支的历史记录会添加在master分支的后面。历史记录成一条线,相当整洁。

这时移动提交X和Y有可能会发生冲突,所以需要修改各自的提交时发生冲突的部分。

rebase之后,master的HEAD位置不变。因此,要合并master分支和bugfix分支,即是将master的HEAD移动到bugfix的HEAD这里。

Merge和rebase的区别:
merge
保持修改内容的历史记录,但是历史记录会很复杂。
rebase
历史记录简单,是在原有提交的基础上将差异内容反映进去。
因此,可能导致原本的提交内容无法正常运行。

建立分支

创建名为issue1的分支。

您可以通过branch命令来创建分支。

$ git branch

切换分支

若要在新建的issue1分支进行提交,需要切换到issue1分支。

要执行checkout命令以退出分支。

$ git checkout

在checkout命令指定 -b选项执行,可以创建分支并进行切换。

$ git checkout -b

合并分支

$ git merge
该命令将指定分支导入到HEAD指定的分支。
先切换master分支,然后把issue1分支导入到master分支
先切换,再merge
$ git checkout master
Switched to branch ‘master’

$ git merge issue1
Updating 1257027…b2b23c4
Fast-forward
myfile.txt | 1 +
1 files changed, 1 insertions(+), 0 deletions(-)

master分支指向的提交移动到和issue1同样的位置。这个是fast-forward(快进)合并。

删除分支

$ git branch -d

查看分支

$ git branch

解决合并的冲突

假设已经有master、issue2、issue3分支,需要合并issue2、issue3到master。
切换master分支后,与issue2分支合并。
$ git checkout master
Switched to branch ‘master’
$ git merge issue2
Updating b2b23c4…8f7aa27
Fast-forward
myfile.txt | 2 ++
1 files changed, 2 insertions(+), 0 deletions(-)

接着合并issue3分支。
$ git merge issue3
Auto-merging myfile.txt
CONFLICT (content): Merge conflict in myfile.txt
Automatic merge failed; fix conflicts and then commit the result.

**自动合并失败。由于在同一行进行了修改,所以产生了冲突。**这时myfile.txt的内容如下:
在发生冲突的地方,Git生成了内容的差异。请做以下修改:

修改冲突的部分,重新提交。

$ git add myfile.txt
$ git commit -m “合并issue3分支”
On branch master
nothing to commit (working directory clean)在这里插入图片描述

用rebase合并

切换到issue3分支后,对master执行rebase。
$ git checkout issue3
$ git rebase master


和merge时的操作相同,修改在myfile.txt发生冲突的部分。

rebase的时候,修改冲突后的提交不是使用commit命令,而是执行rebase命令指定 --continue选项。若要取消rebase,指定 --abort选项。
$ git add myfile.txt
$ git rebase --continue
Applying: 添加pull的说明

这样,在master分支的issue3分支就可以fast-forward合并了。切换到master分支后执行合并。
$ git checkout master
Switched to branch ‘master’
$ git merge issue3

git merge优点是分支代码合并后不破坏原分支的代码提交记录,缺点就是会产生额外的提交记录并进行两条分支的合并,

git rebase 优点是无须新增提交记录到目标分支,rebase后可以将对象分支的提交历史续上目标分支上,形成线性提交历史记录,进行review的时候更加直观

不能在一个共享的分支上进行Git rebase操作,避免出现项目分支代码提交记录错乱和浪费存储空间的现象。

pull操作

执行pull就可以进行合并。这时,如果没有冲突的修改,就会自动创建合并提交。如果发生冲突的话,要先解决冲突,再手动提交。

fetch操作

执行pull,远程数据库的内容就会自动合并。但是,有时只是想确认本地数据库的内容而不想合并。这种情况下,请使用fetch。

执行fetch就可以取得远程数据库的最新历史记录。取得的提交会导入到没有名字的分支,这个分支可以从名为FETCH_HEAD的退出。

合并后,历史记录会和pull相同。实际上pull的内容是fetch + merge组成的。

push操作

从本地数据库push到远程数据库时,要fast-forward合并push的分支。如果发生冲突,push会被拒绝的。
若要共享在本地数据库创建的分支,需要明确的push。因此,没有执行push就不会给远程数据库带来影响,因而可以自由的创建自己的分支。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值