add by zhj:还是原文 六百字读懂 Git 看着更舒服一些,显示更好

原文:六百字读懂 Git

英文原文: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 提交。就酱。

最新文章

  1. Python Day5
  2. DOM节点
  3. 主要由顶点容器构成的平面图形类(Shape)——(第一次作业Draw类定义升级)
  4. cocos2dx中对象的两步初始化
  5. Oracle的FRA(Flash Recovery Area)的好处
  6. target标签对于优化用户体验的作用
  7. 【Open Search产品评测】- 来往,7天轻松定制属于自己的搜索引擎
  8. 关于sharepoint事件接收器中properties.AfterProperties[""].Tostring()取值的问题。
  9. myeclipse使用SVN团队开发
  10. Codeforces 331A2 - Oh Sweet Beaverette (70 points)
  11. shortcut to open a linux terminal
  12. Linux批量部署工具Expect
  13. pom.xml配置详解
  14. Hash冲突解决
  15. Maximum Subarray(最大子数组)
  16. JS实现快速排序,冒泡排序
  17. SecureCRT 使用 rz命令提示waiting to receive.**B0100000023be50
  18. myeclipse使用步骤总结
  19. Confluence 6 临时目录(安装目录)
  20. dom4j 操作总结

热门文章

  1. Spark调研笔记第6篇 - Spark编程实战FAQ
  2. Silverlight实例教程 - Validation数据验证基础属性和事件(转载)
  3. SpringCloud系列十二:手动创建Feign
  4. nginx服务器的负载均衡和动静分离(未完)
  5. 经常使用的Hql语句
  6. layui表格的批量删除功能
  7. vue 组件1
  8. c 编译异常 switch 之a label can only be part of a statement and a declaration is not a statement
  9. centos7 笔记本盒盖不睡眠
  10. iOS学习笔记(十七)——文件操作(NSFileManager)