热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

六百字读懂

译注:来自HackerSchool的MaryRoseCook实现了一个纯JavaScript(Node.js)写就的Git:Gitlet,包含了最主要的一些命令。这个项目一是为了了

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

六百字读懂 Git

设想你现在位于 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

推荐阅读
  • gitcommit-m提交所有本地文件 ... [详细]
  • Jenkins实例 Maven项目
    目录一.准备二.创建项目创建maven项目源码管理部分构建编译PostSteps打包构建后操作三.测试一.准备先看初始化设置,如果做完初始化,则跳过安装如下插件MavenInteg ... [详细]
  • 自己理解git是一个仓库工具,安装在本机上面。无需账号,gitbash和gitgui可以进行操作gitee和github是云仓库,用于 ... [详细]
  • 什么是git-lfsGithub对文件大小的限制如果你在命令行用gitpush50MB的文件,你会收到一个warning,但是你仍然可以正常push,但是100MB的时候就无法 ... [详细]
  • 201820192 20175226王鹏雲 实验四《Android程序设计》实验报告
    2018-2019-220175226王鹏雲实验四《Android程序设计》实验报告实验报告封面课程:Java程序设计班级:1752班姓名: ... [详细]
  • git将项目上传到远程仓库,如 github
    首先要先安装好git。初次安装git需要先配置好用户名和邮箱,否则git会提示:pleasetellmewhoyouare开始配置,配置命令分别为&# ... [详细]
  • 90.bower解决js的依赖管理
    转自:https:blog.csdn.netu011537073articledetails52951122前言一个新的web项目开始,我们总是很自然地 ... [详细]
  • 使用crypto-js的md5加密-cag2050-博客园https:www.cnblogs.comcag2050p8191301.htmlhttps:github. ... [详细]
  • 参考链接:http:blog.csdn.nethh5945articledetails51014705本文记录opencv3.1及其contrib模块在ubuntu ... [详细]
  • 偶然有需求了解别人的小程序实现方法,网上相关资料很多,顺便了解了一下,做个总结,没啥技术含量,分享出来。要求安装Nodejs一台root后的安卓手机或者装有可以打开微信小程序的安卓 ... [详细]
  • 继PHP、Ruby、Python和Perl以后,Elasticsearch近来宣布了Elasticsearch.js,Elasticsearch的JavaScript客户端库。能够 ... [详细]
  • 如何使用Nacos (简单示例)
    环境准备JDK1.80Maven下载源码或者安装包我们可以从Github上下载java源码,自己进行编译运行。克隆源码gitclonehttps:github.comal ... [详细]
  • 一,介绍与需求1.1,介绍定时任务(node-schedule),是针对Node.js的一种灵活的cron-like和not-cron-like作业调度程序。它允许您使用可选的递归规则将作业(任意函数)安排在特定日期执行。它在任何给定的时间只使用一个计时 ... [详细]
  • 之后创建一个标志,你怎么取消设置现有的密码,并使用令牌呢?我尝试运行osxkeychain命令,gitconfig--globalcredential ... [详细]
  • socket.io是个基于node.js的快平台实时通讯框架。只用不到10行代码,就可以搭建一个简单的多人实时聊天室。先来看看运行后的效果:socket.io多人聊天室只要简单几 ... [详细]
author-avatar
狠毒的水瓶_617_223_489_321
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有