2015-11-17
  • 作者:tomfans
  • 本文地址:http://f-olivia.github.io/ruby/2015/11/17/jekyll/
  • 转载请注明出处

首先唠叨几句,应该说想放弃这篇文的选写,觉得跟这系列文太遥远,再就是没有什么干料可说;结果遇上一篇文章,我觉得把这个系列做完整了。

#####三、参考

(一) 参考blog:

  1. 启蒙文章:阮一峰的文章《搭建一个免费的,无限流量的Blog—-github Pages和Jekyll入门
  2. 模版blog:寞踪
  3. 建议参考Github Pages极简教程 - 雁起平沙的网络日志

(二) 来自 Hacker School 的 Mary Rose Cook 最近实现了一个纯 JavaScript 写就的 Git:Gitlet,包括了 Git 核心命令的概念实现。Mary 说,这个项目一是为了了解 Git 内部原理,二是希望写一篇深入浅出解释 Git 核心概念的短文:Git in 600 words。短文很有趣,思路清晰也足够深入,值得一看。

  1. git init:设想你现在位于alpha/目录下,这里有一个文本文件number.txt,里面的内容只有一个词:“first”。现在执行git init将这个 alpha 文件夹初始化为 Git 仓库。
  2. git add:执行git add number.txt会将number.txt添加到 Git 的索引(index)中。这个索引记录了所有 Git 保持追踪的文件,现在它有了一个映射记录number.txt -> first,同时add命令还会把一个包含了first字符串的二进制对象加入 Git 的对象数据库里。
  3. git commit:现在执行git commit -m first。这条命令会做三件事情。首先在对象数据库内创建一个树对象,用以记录alpha目录下的文件列表,这个对象有一个指针指向前面git add命令创建的first二进制对象;第二,这条命令还会创建一个 commit 对象用以代表刚刚提交的版本,它包含一个指针指向刚刚的树对象;第三,master 分支也会指向这个新创建的 commit 对象。
  4. git clone:现在执行git clone . ../beta。它会创建一个新目录 beta 并将其初始化为 Git 仓库,然后把 alpha 仓库的对象数据库中所有对象拷贝给 beta 的对象数据库,将 beta 的 master 分支像 alpha 的 master 一样指向相应的对象。它还根据first提交的内容配置索引,并根据索引更新目录下的文件——也就是number.txt。
  5. 现在切换到 beta 目录,修改number.txt的内容为“second”,执行git add number.txt和git commit -m second,新创建的提交对象 second(译注:姑且称之为 second)会有一个指向父提交(first)的指针,表示 second 继承自 first,而 master 分支则指向 second 提交。
  6. git remote:回到 alpha 目录,执行git remote add beta ../beta,将 beta 仓库设为远程仓库。
  7. git pull:执行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 提交的内容,并且相应更新工作目录中的文件。
  8. git branch red:现在执行git branch red,创建一个名为“red”、指向 second 提交的新分支。
  9. git checkout red:然后执行git checkout red。在 checkout 之前,HEAD指向 master 分支,执行命令之后它就指向了 red 分支,使得 red 成为当前分支。
  10. 重复2、3步骤:接下来把number.txt的内容修改为 “third”,执行git add numbers.txt和run git commit -m third。
  11. git push:之后再执行git push beta red,这条命令会把 alpha 仓库内跟 third 提交相关的对象拷贝至 beta 仓库,并且将(alpha 仓库内记录的)beta 仓库 red 分支指向 third 提交。

具体引用了gitlet的代码

	---
	$ npm install -g gitlet

	$ mkdir a
	$ cd a
	./a $ gitlet init
	
	./a $ echo first > number.txt
	./a $ gitlet add number.txt
	./a $ gitlet commit -m "first"
		[master 2912d7a2] first
	
	./a $ cd ..
		$ gitlet clone a b
	
		$ cd b
	./b $ echo second > number.txt
	./b $ gitlet add number.txt
	./b $ gitlet commit -m "second"
	      [master 484de172] second
	
		$ cd ../a
	./a $ gitlet remote add b ../b
	./a $ gitlet fetch b master
		From ../b
		Count 6
		master -> b/master
	./a $ gitlet merge FETCH_HEAD
		Fast-forward
	
	./a $ gitlet branch other
	./a $ gitlet checkout other
		Switched to branch other
	
	./a $ echo third > number.txt
	./a $ gitlet add number.txt
	./a $ gitlet commit -m "third"
		[other 656b332d] third
	
	./a $ gitlet push b other
		To ../b
		Count 9
		other -> other

好了,这个系列就到这里。谢谢几位的带领!



blog comments powered by Disqus