git+github+markdown+jekyll blog系列(四)
2015-11-17
- 作者:tomfans
- 本文地址:http://f-olivia.github.io/ruby/2015/11/17/jekyll/
- 转载请注明出处
首先唠叨几句,应该说想放弃这篇文的选写,觉得跟这系列文太遥远,再就是没有什么干料可说;结果遇上一篇文章,我觉得把这个系列做完整了。
#####三、参考
(一) 参考blog:
- 启蒙文章:阮一峰的文章《搭建一个免费的,无限流量的Blog—-github Pages和Jekyll入门》
- 模版blog:寞踪
- 建议参考Github Pages极简教程 - 雁起平沙的网络日志
(二) 来自 Hacker School 的 Mary Rose Cook 最近实现了一个纯 JavaScript 写就的 Git:Gitlet,包括了 Git 核心命令的概念实现。Mary 说,这个项目一是为了了解 Git 内部原理,二是希望写一篇深入浅出解释 Git 核心概念的短文:Git in 600 words。短文很有趣,思路清晰也足够深入,值得一看。
- git init:设想你现在位于alpha/目录下,这里有一个文本文件number.txt,里面的内容只有一个词:“first”。现在执行git init将这个 alpha 文件夹初始化为 Git 仓库。
- git add:执行git add number.txt会将number.txt添加到 Git 的索引(index)中。这个索引记录了所有 Git 保持追踪的文件,现在它有了一个映射记录number.txt -> first,同时add命令还会把一个包含了first字符串的二进制对象加入 Git 的对象数据库里。
- git commit:现在执行git commit -m first。这条命令会做三件事情。首先在对象数据库内创建一个树对象,用以记录alpha目录下的文件列表,这个对象有一个指针指向前面git add命令创建的first二进制对象;第二,这条命令还会创建一个 commit 对象用以代表刚刚提交的版本,它包含一个指针指向刚刚的树对象;第三,master 分支也会指向这个新创建的 commit 对象。
- git clone:现在执行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 提交。
- git remote:回到 alpha 目录,执行git remote add beta ../beta,将 beta 仓库设为远程仓库。
- 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 提交的内容,并且相应更新工作目录中的文件。 - git branch red:现在执行git branch red,创建一个名为“red”、指向 second 提交的新分支。
- git checkout red:然后执行git checkout red。在 checkout 之前,HEAD指向 master 分支,执行命令之后它就指向了 red 分支,使得 red 成为当前分支。
- 重复2、3步骤:接下来把number.txt的内容修改为 “third”,执行git add numbers.txt和run git commit -m third。
- 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