转:六百字读懂Git
原文来自于:http://www.techug.com/git-in-600-words
译注:来自 Hacker School 的 Mary Rose Cook 最近实现了一个纯 JavaScript 写就的 Git:Gitlet,包括了 Git 核心命令的概念实现。Mary 说,这个项目一是为了了解 Git 内部原理,二是希望写一篇深入浅出解释 Git 核心概念的短文。最好的学习方法就是亲自去实现它,而 Git 的核心功能代码也不过 300 行。相应的代码在 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 提交。就酱。
英文原文:Git in 600 words
转:六百字读懂Git的更多相关文章
- 六百字读懂 Git(转)
add by zhj:还是原文 六百字读懂 Git 看着更舒服一些,显示更好 原文:六百字读懂 Git 英文原文:Git in 600 words 译注:来自 Hacker School 的 Mary ...
- 600字读懂 Git
译注:来自 Hacker School 的 Mary Rose Cook 实现了一个纯 JavaScript 写就的 Git:Gitlet,包含了最主要的一些命令.这个项目一是为了了解 Git 内部原 ...
- 600字让你读懂Git
设想你现在位于 alpha/ 目录下,这里有一个文本文件 number.txt,里面的内容只有一个词:“first”. 现在执行 git init 将这个 alpha 文件夹初始化为 Git 仓库. ...
- 2000字读懂Java的来源
title: Java的来源 blog: CSDN data: Java学习路线及视频 1.Java市场 截至2020-03: Java的市场份额为17.78% 2. Java语言简介 是SUN(St ...
- 读懂IL代码就这么简单(二)
一 前言 IL系列 第一篇写完后 得到高人指点,及时更正了文章中的错误,也使得我写这篇文章时更加谨慎,自己在了解相关知识点时,也更为细致.个人觉得既然做为文章写出来,就一定要保证比较高的质量,和正确率 ...
- Gradle学习系列之三——读懂Gradle语法
在本系列的上篇文章中,我们讲到了创建Task的多种方法,在本篇文章中,我们将学习如何读懂Gradle. 请通过以下方式下载本系列文章的Github示例代码: git clone https://git ...
- 读懂diff
作者: 阮一峰 日期: 2012年8月29日 diff是Unix系统的一个很重要的工具程序. 它用来比较两个文本文件的差异,是代码版本管理的基石之一.你在命令行下,输入: $ diff <变动前 ...
- 读懂IL
读懂IL 先说说学IL有什么用,有人可能觉得这玩意平常写代码又用不上,学了有个卵用.到底有没有卵用呢,暂且也不说什么学了可以看看一些语法糖的实现,或对.net理解更深一点这些虚头巴脑的东西.最重要的理 ...
- 一步步教你读懂NET中IL(附带图)
一步步教你读懂NET中IL(附带图) 接触NET也有1年左右的时间了,NET的内部实现对我产生了很大的吸引力,在msdn上找到一篇关于NET的IL代码的图解说明,写的挺不错的.个人觉得:能对这些底部的 ...
随机推荐
- c#基础语言编程-程序集和反射
程序集 什么是程序集? 1.程序集(assembly)是一个及一个以上托管模块,以及一些资源文件的逻辑组合. 2.程序集是组件复用,以及实施安全策略和版本策略的最小单位. 3.程序集是包含一个或者多个 ...
- FZU 2104 (13.11.28)
Problem 2104 Floor problem Accept: 376 Submit: 433 Time Limit: 1000 mSec Memory Limit : 32768 ...
- 搜索框中“请输入搜索keyword”
$(function(){ $("#ctl00_txtKey").val("请输入搜索keyword").addClass("search&qu ...
- Java设计模式02:常用设计模式之工厂模式(创建型模式)
一.工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的. 工厂模式在<Java与模式>中分为三类: 1)简单工厂模式(Simple Fact ...
- URLConnection类详解
为了防止无良网站的爬虫抓取文章,特此标识,转载请注明文章出处.LaplaceDemon/SJQ. http://www.cnblogs.com/shijiaqi1066/p/3753224.html ...
- 10.18 noip模拟试题
分火腿 (hdogs.pas/.c/.cpp) 时间限制:1s:内存限制 64MB 题目描述: 小月言要过四岁生日了,她的妈妈为她准备了n根火腿,她想将这些火腿均分给m位小朋友,所以她可能需要切火腿. ...
- JAVA学习笔记--二
一.抽象类: 访问修饰符 abstract class 类名{ } 抽象类和普通类的区别: 1. 抽象类不能被实例化 2. 抽象类一般含有抽象方法 抽象方法:在抽象类中只有方法签名(方法声明),没有方 ...
- 谁是谁的first-child
看过CSS伪类选择器之后,心想也就如此嘛,:first-child选择元素的第一个子元素,有什么难的,可一到实践中,还是到处碰壁啊. <body> <ul class="f ...
- 国人编写的开源 .net Ioc 框架——My.Ioc 简介
My.Ioc 是作者开发的一款开源 IoC/DI 框架,下载地址在此处.它具有下面一些特点: 高效 在实现手段上,My.Ioc 通过使用泛型.缓存.动态生成代码.延迟注册.尽量使用抽象类而非接口等方式 ...
- Notepad++在编程使用时的小技巧
http://blog.csdn.net/freewaywalker/article/details/8010790 为了编程时更快捷和适应个人习惯,我们可以对Notepad++进行一系列的设置,这当 ...