Git 笔记 | Github + Jekyll

在 Github 创建名为 username.github.io 的库

按照 Github Pages 上的说明,首先要创建一个新的库,把它命名为 username.github.io。库名的第一部分需要与用户名一致才能生效。另外,不需要勾选「Initialize this repository with a README」。

创建成功后,会跳转到一个页面(如果你勾选了「Initialize this repository with a README」,则看不到这个页面),提示把已经创建的库 clone 到本地,或者输入以下命令:

echo "# username.github.io" >> README.md
git init
git add README.md
git commit -m "first commit"
git remote add origin https://github.com/username/username.github.io.git
git push -u origin master

我们不按这些来做。为了理解这些指令,这里我们先一条一条地看看这些指令到底是什么意思:

首先,我们在本地创建一个同名文件夹 username.github.io (之所以这样做,是为了与在网站上的库保持一致。如果我们直接把 Github 上创建的库 clone 到本地,就是一个同名的文件夹;但我们选择不直接 clone,而是自己创建一个,目的只是学习这些指令):

$ mkdir username.github.io
$ cd username.github.io

第一行 echo "# username.github.io" >> README.md。命令 echo
「display a line of text」的作用,>> 则起「输出到文件」的作用。所以整行翻译成中文,就是把 echo 的输出(也就是引号里的「# username.github.io」),输入到 README.md 这个文件里。输入这行后,在当前文件夹就会出现一个名为 README 的 markdown 文件,里面有一行 ‘# username.github.io’;

第二行 git init,把当前文件夹 Git 初始化;

第三行,git add README.md,把 README.md 加到 Staged Area;

第四行,git commit -m "first commit", 把 README.md 的信息写到 .git 里,相当于给这个文件在当前的时刻截了图,这要找到这次 commit 的哈希码,就总能返回这个时刻的状态;

第五行,我们没遇到过。先不执行这行,我们输入 git remote -v,会发现什么都没有,也就是说,我们的 Git 文件夹还没有绑定任何的远程库(remote repository)。现在输入第五行

$ git remote add origin https://github.com/username/username.github.io.git

再输入 git remote -v,则会出现

origin	https://github.com/username/username.github.io.git (fetch)
origin	https://github.com/username/username.github.io.git (push)

所以,这一行的意思是,给我们本地的 Git 文件夹登记一个远程库,然后在第六行的时候,它就知道该把文件夹里的内容推送到哪里去了。更详细一点:命令 git remote 等于是告诉 Git 我们要关于远程库(remote)做点什么;add 表明要登记一些信息;origin 是我们给那个远程库的名字,没有必要一定要叫 origin,只是习惯如此,可以叫任何名字;最后就是要告诉 Git 那个远程库的具体地址是什么。

如果我又创建另一个叫做 Tardis 的库,它的地址是 https://github.com/username/tardis.git,我也可以把这个地址登记到我们本地的 username.github.io 文件夹里。输入

$ git remote add tardis https://github.com/username/tardis.git

再输入 git remote -v,则会出现

origin	https://github.com/username/username.github.io.git (fetch)
origin	https://github.com/username/username.github.io.git (push)
tardis	https://github.com/username/tardis.git (fetch)
tardis	https://github.com/username/tardis.git (push)

第六行,git push -u origin master,意思就是把我们本地目录 master 分支(branch)里的文件,推送到(push)名为 origin 实际上代表以下地址的库:

https://github.com/username/username.github.io.git

我们本地在哪个分支,就会推送到远程库的哪个分支。再直白一点,命令 git push 是告诉 Git,我要推送当前文件夹里的东西到某个地方了,origin 指向我们要把内容推向的那个远程库,后面的 master 则是想要推向远程库的、本地的分支。假设,我们想要把本地一个名为 timeVortex 的分支里的文件,推送到一个名为 tardis 的远程库(无论我们当前到底是处在哪个分支),那么我们就输入 git push tardis timeVortex,那样子,timeVortex 分支里的文件就会被推送到 tardis 库的一个同样叫做 timeVortex 的分支上。那么,如果希望把本地 master 分支上的文件推送到远程库里的 doctor 分支上,又该怎样做呢?可以输入 git push origin master:doctor。冒号前面是本地的分支,冒号后面是远程的分支。

以上只是讲解,现在,我们可以把 xxx.github.io 文件夹删掉,再进行下一步。

选择模板

再次重新从零出发。这一次从选模板开始。

本文余下部分用 Scribble 为例。

把博客托管到 Github Pages

首先,我们把 Scribble 这个库 clone 到本地:

$ git clone https://github.com/username/scribble.git

前面我们说过 git remote -v。因为我们直接 clone 了别人的库,所以 clone 下来的文件夹里,已经登记了模板作者的远程库信息:

$ git remote -v
origin	https://github.com/muan/scribble.git (fetch)
origin	https://github.com/muan/scribble.git (push)

我们要把 origin 的地址改成我们之前创建的 username.github.io 库的地址:

$ git remote set-url origin https://github.com/username/username.github.io.git
$ git remote -v
origin	https://github.com/username/username.github.io.git (fetch)
origin	https://github.com/username/username.github.io.git (push)

最后输入

$ git push -u origin master 

如果没有绑定 SSH key,一般会要求输入用户名和密码。