Git 教程之盘古开天地

Ruijun Gao @ Nov 30, 2020

准备

  1. 一个 shell
  2. 还有 git
  3. GitHub Account;
  4. Git Book
  5. 最重要的是随时能够动的手。

盘古会在 shell 中使用 git --version 命令来检视 git 的版本号。遇到不理解或者感兴趣的问题还会主动去查阅文档和书籍。

基础

进入项目目录。

mkdir git-tutorial && cd git-tutorial

初始化一个 git 仓库。

$ git init
Initialized empty Git repository in /Users/rickygao/Projects/git-tutorial/.git/

$ ls -la
total 0
drwxr-xr-x   3 rickygao  staff   96 11 29 12:56 .
drwxr-xr-x  17 rickygao  staff  544 11 29 12:56 ..
drwxr-xr-x   9 rickygao  staff  288 11 29 12:56 .git

git 将维护 .git 达成各种魔法​​。相信大家已经很了解什么是工作区暂存区版本库了。

盘古决定种一棵树!

$ touch tree
$ ls -l
total 0
-rw-r--r--  1 rickygao  staff  0 11 29 13:09 tree

这里已经有一棵树了,盘古对于创世很谨慎,它还没有被提交到了版本库中,因为:

$ git status
On branch master

No commits yet

Untracked files:
  (use "git add <file>..." to include in what will be committed)
  tree

nothing added to commit but untracked files present (use "git add" to track)

这告诉我们,盘古还没有任何提交,同时有一个未被追踪的文件。git 很贴心地提示了使用 git add 去追踪这个文件。盘古决定试一下:

$ git add
Nothing specified, nothing added.
Maybe you wanted to say 'git add .'?

git 居然是个大骗子,可恶啊。(其实是没看到需要加 <file> 参数)还好盘古会英语,发现是没有指定文件,于是他决定把当前目录所有的文件添加进去。

$ git add .
$ git status
On branch master

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)
  new file:   tree

盘古对这棵树很满意,决定提交到版本库。

$ git commit -m 'plant a tree'
[master (root-commit) a88008d] plant a tree
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 tree

大意了啊,0 insertions(+) 忘记了添加内容了。

$ echo 'Here is a tree, a beautiful tree.' > tree
$ cat tree
Here is a tree, a beautiful tree.

$ git status
On branch master
Changes not staged for commit:
 (use "git add <file>..." to update what will be committed)
 (use "git restore <file>..." to discard changes in working directory)
  modified:   tree

no changes added to commit (use "git add" and/or "git commit -a")

git 发现了 tree 被修改了,这真是太强了,这下盘古修改了什么就一览无余了!同时,git 还告诉盘古可以试试:

$ git commit -a -m 'tree is beautiful'
[master f476c1c] tree is beautiful
 1 file changed, 1 insertion(+)

干了这么多活儿,盘古决定回顾一下之前都做了什么:

$ git log
commit f476c1c57eeb29c1e0eff31d737c97d0dd903dc6 (HEAD -> master)
Author: gaoruijun <rckgao@gmail.com>
Date:   Sun Nov 29 13:26:06 2020 +0800

    tree is beautiful

commit a88008d64e110bad1ed8dd4442e0e20cb08bb0ba
Author: gaoruijun <rckgao@gmail.com>
Date:   Sun Nov 29 13:19:34 2020 +0800

    plant a tree
(END)

为了更好地完成开天地的工作,盘古决定去了解重制分支等魔法。

交流

盘古登录了盘古交流平台,阅读了创建新仓库并创建了一个远程仓库。

热爱学习的盘古还阅读了使用命令行添加现有项目到 GitHub,决定试一下。

$ git remote add origin https://github.com/rickygao/git-tutorial.git
$ git branch -M main
$ git push -u origin main
Username for 'https://github.com': rckgao@gmail.com
Password for 'https://rckgao@gmail.com@github.com':
Enumerating objects: 6, done.
Counting objects: 100% (6/6), done.
Delta compression using up to 4 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (6/6), 437 bytes | 218.00 KiB/s, done.
Total 6 (delta 0), reused 0 (delta 0)
To https://github.com/rickygao/git-tutorial.git
 * [new branch]      main -> main
Branch 'main' set up to track remote branch 'main' from 'origin'.

芜湖,这样其他盘古也能看到这个仓库了!

盘古很孤独,但是又想体验协作开发,于是他为了模拟别人向远程仓库提交内容,点击了仓库页面上的 Add a READMECommit new file。这样一来本地的版本库就比远程仓库慢了一个提交。他会使用:

$ git pull
remote: Enumerating objects: 4, done.
remote: Counting objects: 100% (4/4), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), done.
From https://github.com/rickygao/git-tutorial
   f476c1c..05d0fe3  main       -> origin/main
Updating f476c1c..05d0fe3
Fast-forward
 README.md | 1 +
 1 file changed, 1 insertion(+)
 create mode 100644 README.md

并发现本地已经取得了远程仓库的最新版本,也就是 git log 可以看到 README.md 的提交了。

之后盘古将使用 git push 向远程仓库「推」,而不需要指定 origin main 参数,这是因为刚刚他使用了 -u 选项,已经将本地的 main 分支和远程仓库 originmain 分支对应上了。

盘古现在可以愉快地使用线性版本进行版本控制啦!如果他需要更复杂的版本控制特性,就需要去了解分支了。