深入理解Git - 一切皆commit

在对 git 有了基本理解和知道常规操作之后,如何对 git 的使用有进一步的理解?
一切皆 commit 或许是个不错的理解思路。

本文将从『一切皆 commit 』的角度,通过 git 中常见的名词,如 commit, branch, tag, HEAD 和动词,如 cherry-pick, rebase, reset, revert, stash 来理解 git。通过这些理解,期望能够更好地处理使用 git 中遇到的问题。

比如:

1 做了两个提交的修改,然后删掉分支了,过会发现刚才两个提交有价值,怎么找回来?

2 基于当前 release 分支开发功能,中途误合并了 dev 分支,
然后又进行了几次提交,怎么取消合并dev的操作?

3 rebase(变基)究竟是什么意思?
等等。

配合希沃白板课件食用,效果更佳:
【希沃白板5】课件分享 : 《Git 进阶 - 从使用角度深入理解Git》
https://r302.cc/ke8XdO?platform=enpc&channel=copylink
点击链接直接预览课件

一切皆 commit 1 commit 的原子性

深入理解Git - 一切皆commit

在 git 中有工作区,暂存区和代码仓库三个概念,那为什么要有暂存区呢?为了保证提交的原子性,在 git 的应用层面上,提交(commit,名词)是 git 主要命令的操作的最小单位了。

关于此,可以查看这篇知乎贴:为什么要先 git add 才能 git commit ? - Ivony的回答 - 知乎

本文中的内容很少涉及工作区和暂存区的操作,有了 commit 是 git 操作的基本单位这个概念,接下来将从『一切皆 commit』来理解 git。

2 一切皆 commit :名词部分 2.1 本地仓库

深入理解Git - 一切皆commit

如上图,其实比较好理解,我们知道 commit 有一个 commit id,另外还是 branch(分支),tag(标签),HEAD(当前分支头结点)这些概念。他们都是指向某个提交的引用(或者理解为指针)。

branch(分支):指向你当前工作分支的最新的那个提交,当在当前分支有了新的提交,则 git 自动更新这个分支指针,以指向最新的提交。

tag(标签):对某个提交或者分支打 tag 之后,将固定指向那个提交,后续即使分支有更新甚至删除,tag 所指向的提交不变,且一直存在。

HEAD(头结点):指向当前工作的分支,即 HEAD 是当前分支的一个引用,如果切换了分支,HEAD 随之更新。

如此,便理解了,branch,tag,HEAD 这些,本质上都是指向某个提交的引用,即:一切都是 commit 。

深入理解Git - 一切皆commit

深入理解Git - 一切皆commit

2.2 远端仓库

有一个引用,需要单独说明,就是 origin/branch ,通常称之为远程分支,那这个远程分支指向哪里呢?
如何在 『一切皆commit』 这句咒语下理解远程仓库?

以 master 分支为例,origin/master 指向的,就是当前远端 master 分支最新的那个提交。等等,其实这句话有点小问题,应该是最后一次更新本地仓库时,远端 master 分支最新的那个提交。那什么时候会更新远程仓库?在执行 pull push fetch 时更新。

你或许听说过 git pull = git fetch + git merge 的说法。
当执行 git fetch 命令时,只更新 origin/master 分支(包括所有其它的 origin 远端分支),但并不会影响本地的任何分支。

那要更新本地的 master 分支怎么办? git merge origin/master ,将远端的分支合并到本地分支,即完成了对本地 master 分支的更新。所以,实际上,git pull = git fetch + git merge 。
(@master)git pull = git fetch & git merge origin/master

案例

你在 f/table 分支开发功能,现在需要合并最新dev,可以怎么做?

刚学 git 时,可能会这么做:

(@f/table) git checkout dev (@dev) git pull (@dev) git checkout f/table (@f/table) git merge dev

实际上,不需要切到 dev 分支,先更新 dev,则合并。以下命令即可:

(@f/table) git fetch (@f/table) git merge origin/dev

小结:origin/branch 是指向此分支云端最新提交的引用(最新=最后一次更新),在执行 fetch pull push 指令时自动更新。

深入理解Git - 一切皆commit

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wppxfz.html