六百字读懂 Git

简介:

六百字读懂 Git

译注:来自 Hacker School 的 Mary Rose Cook 实现了一个纯 JavaScript (Node.js)写就的 Git:Gitlet,包含了最主要的一些命令。这个项目一是为了了解 Git 内部原理,二是希望写一篇深入浅出解释 Git 核心概念的短文。学习一件东西的原理最好的方法就是去亲自实现它,而设计精巧的 Git 核心功能代码也不过 300 行。这就是这篇精巧的小文:Git in 600 words,相应的代码在 Github 上。短文很有趣,思路清晰也足够深入,值得一看。

设想你现在位于 alpha/ 目录下,这里有一个文本文件 number.txt,里面的内容只有一个词:“first”。

现在执行 git init 将这个 alpha 文件夹初始化为 Git 仓库。

执行 git add number.txt 会将 number.txt 添加到 Git 的索引(index)中。这个索引记录了所有 Git 保持追踪的文件,现在它有了一个映射记录 number.txt -> first,同时 add 命令还会把一个包含了 first 字符串的二进制对象加入 Git 的对象数据库里。

现在执行 git commit -m first。这条命令会做三件事情。首先在对象数据库内创建一个树对象,用以记录 alpha 目录下的文件列表,这个对象有一个指针指向前面 git add 命令创建的 first 二进制对象;第二,这条命令还会创建一个 commit 对象用以代表刚刚提交的版本,它包含一个指针指向刚刚的树对象;第三,master 分支也会指向这个新创建的 commit 对象。

现在执行 git clone . ../beta。它会创建一个新目录 beta 并将其初始化为 Git 仓库,然后把 alpha 仓库的对象数据库中所有对象拷贝给 beta 的对象数据库,将 beta 的 master 分支像 alpha 的 master 一样指向相应的对象。它还根据 first 提交的内容配置索引,并根据索引更新目录下的文件——也就是 number.txt。

现在切换到 beta 目录,修改 number.txt 的内容为“second”,执行 git add number.txt 和 git commit -m second,新创建的提交对象 second(译注:姑且称之为 second)会有一个指向父提交(first)的指针,表示 second 继承自 first,而 master 分支则指向 second 提交。

回到 alpha 目录,执行 git remote add beta ../beta,将 beta 仓库设为远程仓库。然后执行 git pull beta master。

在这条命令背后,它其实会执行 git fetch beta master,从 beta 仓库中找到 second 提交的相关对象拷贝到 alpha 仓库;把 alpha 中关于 beta 的 master 分支记录指向这个 second 提交;更新 FETCH_HEAD 指向刚刚从 beta 仓库拉取的 master 分支,还是这个 second 提交。

此外,pull 命令还会执行 git merge FETCH_HEAD。从 FETCH_HEAD 得知最近拉取的分支是 beta 仓库的 master 分支,据此拿到相应的对象,也就是 second 提交对象。此时 alpha 的 master 分支指着 first 提交,正好是 second 的祖先提交,于是对于 merge 命令来说只需要将 master 分支指向 second 提交即可。接下来 merge 命令还会更新索引以匹配 second 提交的内容,并且相应更新工作目录中的文件。

现在执行 git branch red,创建一个名为“red”、指向 second 提交的新分支。

然后执行 git checkout red。在 checkout 之前,HEAD 指向 master 分支,执行命令之后它就指向了 red 分支,使得 red 成为当前分支。

接下来把 number.txt 的内容修改为 “third”,执行 git add numbers.txt 和 run git commit -m third。

之后再执行 git push beta red,这条命令会把 alpha 仓库内跟 third 提交相关的对象拷贝至 beta 仓库,并且将(alpha 仓库内记录的)beta 仓库 red 分支指向 third 提交。就酱。

原文发布时间:2015-02-02

本文来自云栖合作伙伴“linux中国”

目录
相关文章
|
jenkins 开发工具 数据库
Git高级篇(1.3w字)(上)
Git高级篇(1.3w字)(上)
118 0
|
4月前
|
存储 缓存 开发工具
【GIT 第一篇章】认识一下GIT
Git是一款分布式版本控制系统,以高效敏捷著称,适用于从小到大的各类项目管理。其核心特性包括分布式的仓库设计,让每位开发者都能拥有完整的项目历史记录;版本控制功能追踪文件变化并保存每次提交的快照;以及强大的分支管理,支持实验性开发而不干扰主分支。Git的工作流程涉及初始化仓库、暂存更改、提交版本及查看历史等步骤。Git具备快速高效的数据处理能力、保证版本完整性的哈希机制、多协议支持和缓存机制,广泛应用于软件开发、项目管理和学术研究领域。与集中式版本控制系统SVN相比,Git在系统架构、数据存储、分支管理、性能效率和安全性等方面表现出更强的灵活性和高效性,尤其适合分布式团队和大规模项目。
43 0
|
7月前
|
缓存 数据可视化 开发工具
学习 Git,看这一篇就够了!(下)
学习 Git,看这一篇就够了!(下)
129 0
|
7月前
|
存储 Linux Shell
学习 Git,看这一篇就够了!(上)
学习 Git,看这一篇就够了!(上)
117 0
|
存储 开发工具 git
Git复习题及其答案
Git是一个帮助开发者追踪代码变化和团队协作的工具。它记录了代码修改的历史,并允许回到过去的版本。开发者可以创建分支来独立开发新功能,而不影响主代码。团队成员可以共享代码,并轻松合并修改。Git提供了高效的工作流程和协作机制,使代码管理更简单。总之,Git是一个强大而灵活的工具,适用于个人和团队开发。
105 1
|
存储 开发工具 数据库
Git高级篇(1.3w字)(下)
Git高级篇(1.3w字)(下)
47 0
|
网络安全 开发工具 git
学 git 看这一篇就够了!
学 git 看这一篇就够了!
76 0
|
存储 Linux 开发工具
学会使用Git,看这一篇文章就够了
以上是 Git 的简介绍和常用命令说明。希望这篇文章能够帮助初学者更好地理解和掌握 Git 的使用。Git 在代码管理中是一个非常重要的工具,尤其是在多人协作的情况下。因此,掌握好这些基本命令是非常有必要的。
|
Shell 开发工具 git
Git 分支操作 | 青训营笔记
昨天我们大致学习了Git分支的意义和作用。今天就聚焦在git的分支操作来记录一篇笔记。
Git 分支操作 | 青训营笔记
|
安全 前端开发 Shell
git相关问题解析,你想要的都有🔥
git相关问题解析,你想要的都有🔥
184 0
git相关问题解析,你想要的都有🔥