Git 分布式版本控制工具详解以及在Gitee,Github中的使用和GitLab部署(六)

148 阅读5分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第24天,点击查看活动详情

七、补充一些 相关的Git 知识

1 head 的理解

HEAD 指向当前所在的分支,类似一个活动的指针,表示一个「引用」。

HEAD 既可以指向「当前分支」的最新 commit,也可以指向历史中的某一次 commit (「分离头指针」的情况)。归根结底,HEAD 指向的就是某个提交点。

当我们做分支切换时,HEAD 会跟着切换到对应分支。

2. fast-forward 与 —no-ff 的区别

假如有一个场景:有两个分支,master 分支和 feature 分支。现在,feautre 分支需要合并回 master 分支。

在这里插入图片描述

fast-forward 合并方式是条件允许的情况,通过将 master 分支的 HEAD 位置移动到 feature 分支的最新提交点上,这样就实现了快速合并。这种情况,是不会新生成 commit 的。(快进模式)

在这里插入图片描述

git checkout master # 先切换到master分支
git merge feature # 将feature分支合并到当前分支上(master)
  • --no-ff 的方式进行合并,master 分支就会新生成一次提交记录。

在这里插入图片描述

git checkout master # 先切换到master分支
git merge --no-ff feature # 将feature分支合并到当前分支上(master)

如果条件满足时,merge 默认采用的 fast-forward 方式进行合并,除非你显示的加上 --no-ff 选项;而条件不满足时,merge 也是无法使用 fast-forward 合并成功的!

3. merge操作

git merge 操作是区分上下文的。当前分支始终是目标分支,其他一个或多个分支始终合并到当前分支。这个注意点记住了,方便记忆!所以,当需要将某个分支合并到目标分支时,需要先切到目标分支上。

条件满足的含义

快进模式能够进行的条件是:**源分支和目标分支之间没有分叉。**下图则是无法通过 HEAD 的快速移动实现分支的合并。

在这里插入图片描述

如果执行合并操作,默认会尝试 fast-forward 的方式进行合并,但是因为分叉了,所以此时会采用 no-ff 的方式进行合并,有新的 commit 生成了。最终的结果图如下:

git checkout master # 先切换到目标分支
git merge feature

在这里插入图片描述

4.rebase操作

rebase 合并往往又被称为 「变基」。这里的「基」就是一个「基点」、「起点」的意思。git rebase 命令通常称为向前移植(forward porting)。

「变基」就是改变当前分支的起点。注意,是当前分支! rebase 命令后面紧接着的就是「基分支」。与merge操作相反。

变基前:

在这里插入图片描述

执行命令:

git checkout feature # 切换到当前分支,或待变基分支
git rebase master # 变基

# 可合并为下面的语句
git rebase master feature

变基后:

在这里插入图片描述

解释:rebase,变基,可以直接理解为改变基底。feature分支是基于master分支的B拉出来的分支,feature的基底是B。而master在B之后有新的提交,就相当于此时要用master上新的提交来作为feature分支的新基底。实际操作为把B之后feature的提交存下来,然后删掉原来这些提交,再找到master的最新提交位置,把存下来的提交再接上去(新节点新commit id),如此feature分支的基底就相当于变成了E而不是原来的B了。(注意,如果master上在B以后没有新提交,那么就还是用原来的B作为基,rebase操作相当于无效,此时和git merge就基本没区别了,差异只在于git merge会多一条记录Merge操作的提交记录)

推荐使用场景

往公共分支上合代码的时候,推荐使用merge。

拉公共分支最新代码的时候,推荐使用rebase,也就是git pull -r或git pull --rebase,但有个缺点就是rebase以后我就不知道我的当前分支最早是从哪个分支拉出来的了,因为基底变了嘛。

图示

从Develop分支分出两个分支,分属两个人员进行开发。F1分支开发完毕后,push到总分支。F2分支开发到F2_5时需要拉取最新代码。

如果F2分支采用git pull拉取最新代码:

F1分支的视角(F1分支的commit记录):

在这里插入图片描述

F2分支的视角:这将会把F1分支的修改直接拉下来于本地代码merge,且产生一个commit F2_5,也就是merge commit。

在这里插入图片描述

如果F2分支采用git pull --rebase 拉取最新代码:

F1分支视角不变 F2分支视角:

在这里插入图片描述

5.强制拉取到本地仓库

有些时候本地仓库提交管理混乱,需要从远程仓库强制拉取,以刷新本地仓库,覆盖所有add和commit操作。可执行以下代码:

git fetch --all  
git reset --hard origin/master 
git pull

6.远程分支合并

该项职责由git管理员来完成。例如当开发分支Develop上的所有功能已经完成时,需要合并到master上时:

代码clone到本地仓库:

git clone 在本地创建dev分支并与远程dev分支对应:

git checkout -b dev origin/dev 切换到master分支

git checkout master 本地的dev合并到master上(遇到冲突解决完后再次提交)

git merge dev 推送到远程的master上(执行这项操作时,需要有操作远程master分支的权限)

git push origin master

释放权限:

在这里插入图片描述