【Git 学习笔记】1.3 Git 的三个阶段

1.3 Git 的三个阶段

由于远程代码库后续存在新的提交,因此实操过程中的结果与书中并不完全一致。根据书中 HEAD 指向的 SHA-134acc370b4d6ae53f051255680feaefaf7f7850d,可通过以下命令切换到对应版本,并新建一个 newdemo 分支来避免后续版本的干扰:

bash 复制代码
# Stay the same with the book in a new branch
$ git checkout && git reset --hard 13dcada077e446d3a05ea9cdbc8ecc261a94e42d && git checkout -b newdemo
# Check commit info in advance for use
$ git cat-file -p HEAD | grep tree
tree 34fa038544bcd9aed660c08320214bafff94150b
$ git cat-file -p HEAD^{tree} | grep another-file
100644 blob b50f80ac4d0a36780f9c0636f43472962154a11a    another-file.txt

实战练习:

bash 复制代码
# Repo initialization
$ git clone https://github.com/PacktPublishing/Git-Version-Control-Cookbook-Second-Edition.git demo
$ cd demo
# Add new content to another-file.txt
$ echo "Another line" >> another-file.txt
# Check git status
$ git status
# Add modified file and check status again
$ git add another-file.txt 
$ git status
# When a file is moved to the staging area, the SHA-1 hash of the file is created and the blob object is written to Git's database. This happens every time a file is added, but if nothing changes for a file, it means that it is already stored in the database. At first, this might seem that the database will grow quickly, but this is not the case. Garbage collection kicks in at times, compressing, and cleaning up the database and keeping only the objects that are required.
# Some more modification
$ echo 'Whoops almost forgot this' >> another-file.txt
# check status
$ git status
# both 'Changes to be committed' and 'Changes not staged for commit' are observed due to the second update
# add again to merge the status
$ git add another-file.txt
$ git status
# Now, all the changes we have made to the file are ready to be committed, and we can record a commit
$ git commit -m 'Another change to another file'
# Error: fatal: empty ident name (for <z@LAPTOP-QVS7NVNN.localdomain>) not allowed
# Config user name and email
$ git config user.email 'john.doe@example.com'
$ git config user.name 'John Doe'
$ git commit -m 'Another change to another file'
[newdemo 9cfa61c] Another change to another file
 1 file changed, 2 insertions(+)

此时,再次查看 HEAD 信息,可以发现根节点树 root treeanother-file.txtSHA-1 都因为 commit 操作更新了:

bash 复制代码
$ git cat-file -p HEAD | grep tree
tree 162201200b5223d48ea8267940c8090b23cbfb60
# before: 
# tree 34fa038544bcd9aed660c08320214bafff94150b
$ git cat-file -p HEAD^{tree} | grep another-file
100644 blob 35d31106c5d6fdb38c6b1a6fb43a90b183011a4b    another-file.txt
# before:
# 100644 blob b50f80ac4d0a36780f9c0636f43472962154a11a    another-file.txt

然而,文本文件 another-file.txt 在最后提交前添加到暂存区了两次,如果每次 git add 命令都会产生 blobtree 以及 commit 对象,那么 Git 仓库中势必会有中间那次 add 操作的对象,被一同计入 Git 数据库。查看该对象可以使用命令 git fsck

bash 复制代码
$ git fsck --dangling
Checking object directories: 100% (256/256), done.
Checking objects: 100% (49/49), done.
dangling blob ad46f2da274ed6c79a16577571a604d3281cd6d9

进一步验证查到的对象:

bash 复制代码
$ git cat-file -p ad46f2da274ed6c79a16577571a604d3281cd6d9
This is just another file
Another line

验证成功。

个人小结

由于源码库后续有新版本提交(取消了之前的某个促销活动),导致实际代码和书中不完全一致。好在 Git 可以直接切到变更前的版本,才有了上面一系列实操验证内容。不得不说,Git 确实很强大。

现在想想,其实 Git 的用途远远不止源码版本管理,日常生活中只要遇到切换多个历史版本的场景,都可以用 Git 进行管理。前提是对 Git 的基本概念和命令行得相当熟悉才行。这恐怕也是 Git 难以大面积推广的一个重要原因。不过话说回来,掌握了 Git 的知识后,再去看其他行业涉及版本控制的一些场景,基本也是降维打击的存在了。。。

相关推荐
mykj15519 小时前
英语单词APP解锁学习新方式,智能高效背单词
学习·英语单词app
知识分享小能手9 小时前
深度学习学习教程,从入门到精通,深度学习中的正则化 — 完整知识点与代码示例(7)
人工智能·深度学习·学习
console.log('npc')10 小时前
Git 冲突与 AI 协助指南
前端·人工智能·git·大模型
~kiss~10 小时前
Agent 的 未来吗?String: An Agentic OS Where Every App Is a Markdown File
学习
HugoStudio_SWAN11 小时前
洛谷 B4450 / B3867 / B3923 智慧购物、储蓄与做题——从程序到生活
c++·学习·程序人生·算法·生活
猎头南楼12 小时前
VLA 模型落地端侧:从架构选型到量化部署的工程实践笔记
笔记·架构·大模型
Capricorn198813 小时前
日志级幻觉排障:GPT-6 Astra 迈入 AGI 时代,知芽 Notebook Skill 如何以引用校验与零命中诚实弃权解决长文失忆
论文阅读·人工智能·笔记·gpt·agi
UIU11413 小时前
scanf与cout的误区:探究其内部的机制
c++·学习·c#·scanf
疯狂打码的少年13 小时前
【数据库技术】多值依赖与第四范式(4NF)
数据库·笔记·算法
tq108613 小时前
算法的另一面
笔记