Git 学习笔记

Git 仓库中的提交记录保存的是你的目录下所有文件的快照,就像是把整个目录复制,然后再粘贴一样,但比复制粘贴优雅许多!

Git 希望提交记录尽可能地轻量,因此在你每次进行提交时,它并不会盲目地复制整个目录。条件允许的情况下,它会将当前版本与仓库中的上一个版本进行对比,并把所有的差异打包到一起作为一个提交记录。

Git 还保存了提交的历史记录。这也是为什么大多数提交记录的上面都有 parent 节点的原因 —— 我们会在图示中用箭头来表示这种关系。对于项目组的成员来说,维护提交历史对大家都有好处。

前言:

Git 学习笔记_第1张图片

Git 学习笔记_第2张图片

Git 学习笔记_第3张图片

基础篇

 一个(小型)Git 代码库。当前有两个提交记录 —— 初始提交 C0 和其后可能包含某些有用修改的提交 C1

Git commit

git commit  创建一个新的提交记录。

Git 学习笔记_第4张图片

操作修改了代码库,并把这些修改保存成了一个提交记录 C2C2 的 parent 节点是 C1, parent 节点是当前提交中变更的基础

Git branch

即使创建再多的分支也不会造成储存或内存上的开销,并且按逻辑分解工作到不同的分支要比维护那些特别臃肿的分支简单多了。

Git 学习笔记_第5张图片

 分支与合并 - 1️⃣Git merge

例1: 

Git 学习笔记_第6张图片

Git 学习笔记_第7张图片

 例2:

Git 学习笔记_第8张图片

 main 继承自 bugFix,Git 什么都不用做,只是简单地把 bugFix 移动到 main 所指向的那个提交记录。

2️⃣Git Rebase

Rebase 实际上就是取出一系列的提交记录,“复制”它们,然后在另外一个地方逐个的放下去。

Rebase 的优势就是可以创造更线性的提交历史,这听上去有些难以理解。如果只允许使用 Rebase 的话,代码库的提交历史将会变得异常清晰。

Git 学习笔记_第9张图片

⭕注意:把 bugFix 分支里的工作直接移到 main 分支上。移动以后会使得两个分支的功能看起来像是按顺序开发,但实际上它们是并行开发的。 

现在 bugFix 分支上的工作在 main 的最顶端,同时我们也得到了一个更线性的提交序列。

⭕提交记录 C3 依然存在(树上那个半透明的节点),而 C3' 是我们 Rebase 到 main 分支上的 C3 的副本。

Git 学习笔记_第10张图片

由于 bugFix 继承自 main,所以 Git 只是简单的把 main 分支的引用向前移动了一下而已。


高级篇 

HEAD 

HEAD 是一个对当前所在分支的符号引用 —— 也就是指向你正在其基础上进行工作的提交记录。

HEAD 总是指向当前分支上最近一次提交记录。大多数修改提交树的 Git 命令都是从改变 HEAD 的指向开始的。

HEAD 通常情况下是指向分支名的

Git 学习笔记_第11张图片

如果想看 HEAD 指向,可以通过 cat .git/HEAD 查看, 如果 HEAD 指向的是一个引用,还可以用 git symbolic-ref HEAD 查看它的指向。 

分离的 HEAD

分离的 HEAD 就是让其指向了某个具体的提交记录而不是分支名。在命令执行之前的状态如下所示:

HEAD -> main -> C1

HEAD 指向 main, main 指向 C1

 Git 学习笔记_第12张图片


相对应用

通过指定提交记录哈希值的方式在 Git 中移动不太方便。在实际应用时,并没有像本程序中这么漂亮的可视化提交树供你参考,所以你就不得不用 git log 来查查看提交记录的哈希值。

并且哈希值在真实的 Git 世界中也会更长(译者注:基于 SHA-1,共 40 位)。例如前一关的介绍中的提交记录的哈希值可能是 fed2da64c0efc5293610bdd892f82a58e8cbc5d8。舌头都快打结了吧...

但Git 对哈希的处理很智能。只需要提供能够唯一标识提交记录的前几个字符即可。

通过哈希值指定提交记录很不方便,所以 Git 引入了相对引用。这个就很厉害了!

使用相对引用的话,你就可以从一个易于记忆的地方(比如 bugFix 分支或 HEAD)开始计算。

相对引用非常给力,这里我介绍两个简单的用法:

  • 使用 ^ 向上移动 1 个提交记录
  • 使用 ~ 向上移动多个提交记录,如 ~3

Git 学习笔记_第13张图片

Git 学习笔记_第14张图片

Git 学习笔记_第15张图片

 Git 学习笔记_第16张图片

Git 学习笔记_第17张图片

 Git 学习笔记_第18张图片

Rebase 实际上就是取出一系列的提交记录,“复制”它们,然后在另外一个地方逐个的放下去。

Git 学习笔记_第19张图片

Git 学习笔记_第20张图片

Git 学习笔记_第21张图片

 Git 学习笔记_第22张图片

Git 学习笔记_第23张图片

 Git 学习笔记_第24张图片

Git 学习笔记_第25张图片


Git 学习笔记_第26张图片

 git pull 就是 fetch 和 merge 的简写,类似的 git pull --rebase 就是 fetch 和 rebase 的简写!

Git 学习笔记_第27张图片

你可能感兴趣的:(git,学习,笔记)