xuzhengfu / pilot

进入编程世界的第一课
1 stars 0 forks source link

<Git 与 GitHub 入门>笔记 #16

Open xuzhengfu opened 4 years ago

xuzhengfu commented 4 years ago

1. Git 与 GitHub 入门

版本控制解决什么问题

Git 基本概念

Git 基本用法:A Tutorial

在了解了上面的基本概念之后,下面就请跟着我们的指引一步步的操作来熟悉 git 的基本用法吧。

使用前的基本设置

git config --global user.name "your name"
git config --global user.email your_email@foo.bar
git config --global core.editor "code -w"
git config --list

基本操作

cd ~/Code
mkdir learn-git
cd learn-git
pwd

最后一个 pwd 命令会打印出你当前所在目录供确认,这就是我们的工作目录working directory),里面还没有文件。

git init

这个 .git 目录下就是我们的版本仓库,使用 git 的特定数据格式保存。这也就意味着,我们的工作目录已经成为一个“由 git 进行版本控制”的目录,我们在这里做的任何事情都会被 git 跟踪,也可以作为版本提交到 repo 中去。

git status

上面的命令将显示目前工作目录的状态,比如有没有文件被修改,目前还什么都没有。这个命令对我们初学者很有用,我们应该养成习惯经常执行一下,看看在 git 的视角发生了什么。

touch README.md
code README.md
On branch master

No commits yet

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

    README.md

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

这些信息的含义是:

git add README.md

git add 这个命令一般用来把有变化的文件加入待提交的“暂存区域(staging area)”,但对 untracked files 它具有双重功效,先将其加入到版本管理中(从 untracked 变成 tracked),再加入 staging area

On branch master

No commits yet

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

    new file:   README.md

这次就没有 Untracked files 了,因为 README.md 这个文件已经放到了 Changes to be committed 列表下,表示这个文件的变化已经准备好提交commit),其实就是表示它被我们放到了暂存区域staging area)。下面还有一行提示,告诉我们如果想把文件“移出暂存区域(unstage)”,可以用 git rm --cached <file> 这个命令,我们后面会试试这个命令。

git commit

这个命令会 commit 目前在 staging area 的任何文件变化到版本仓库,在实际执行前会打开文本编辑器让我们输入 commit message 也就是版本说明:

git-commit-message

另外选择一次提交哪些修改(事实上可以指定到具体某一行)也很有学问,一般来说,为一个明确而单一的目标所做的修改应该放在一次 commit 中,这也是我们需要慢慢去体会的一个重要原则。

回到命令行可以看到执行结果:

[master (root-commit) 7451a00] Init commit
 1 file changed, 3 insertions(+)
 create mode 100644 README.md

这些信息告诉我们:

On branch master
nothing to commit, working tree clean

也就是说我们刚提交完,工作目录和仓库里的最新 commit 是完全一样的,没有什么可以提交的新变化。

每一次 commitgit 都会在 repo 中创建工作目录的一个完整的快照snapshot),相当于记录了这个 commit 对应的工作目录的完整状态(但不包括未放进暂存区域staging area)的那些修改),也就是说这个快照是在上一个快照基础上加上这一次 commit 中所有修改得到的,而唯一的 commit id 就指向这个状态,以后我们可以用这个 id 来恢复到这个状态,或者拿来和别的状态进行比较等等。

版本历史

git log

git log 命令列出了版本仓库中已有的 commit history,每一个 commit 一段,从新到旧排列(最后的 commit 在最上面)。最新的 commit 后面有个 HEAD -> master 的标志,这个和分支有关,我们后面会讲。

每一段开头都是 commit 字样后面跟着 commit id,非常长,但我们一般可以用前几位来代替;之后是提交作者、提交日期时间,然后是 commit message。信息简明扼要、一目了然,谁什么时候做了什么都被清晰记录在案,真是非常合适的“工作证明Proof of Work)”。

git checkout 7451a00

会有一大段提示说明文字,提到什么 HEAD 之类的奇怪概念,先不管它(后面到分支一节会讲),看看你的工作目录,是不是回到了你最初提交 README.md 一个文件的状态?新加入的文件和对 README.md 的修改都不见了,仿佛是进行了时间旅行一般。不用担心,时间旅行的只是你的 working directory,所有的修改记录都还在 repo 里。

git checkout master

你会发现一切又回到了最新的状态(再一次,我们会在关于分支的一节讲这个 master 是啥)。

git diff 7451a00
git diff 7451a00 5d4f3df

前一行命令比较指定 commit 和工作目录当前状态,第二行命令比较两个指定的 commit。输出的内容是一种专门的 diff format,是 Unix 系统做文件比较的标准输出格式,其中列出了有差异的文件,以及这些文件中有差异的行,列出了哪些行是新增,哪些行被删除,那些行有变化。对于现在的你来说这个格式可能有点难懂,没有关系,以后会熟悉起来的,而且 VSCode 提供了图形化的界面来做文件比较和合并,很多时候也更好用一些。

这个简单的 tutorial 就到此结束。

分支和协同

git tag v1.0

这种相当于 commit 别名的 tag 叫“轻量标签(lightweight tag)”,Git 还支持一种带标注的标签(annotated tag),这里就不详细介绍了,本质差不多,只是增加了标签本身的属性,比如是谁打的,什么时候打的等等。不管是哪种标签,我们都可以将其用在需要指定一个 commit 的场合,比如 checkoutdiff 等操作中。

git tag v0.9 5d4f3df
git branch bug/fix1

git branch 在当前 commit 上创建分支,注意创建分支并不会自动切换到新创建的分支,目前我们还工作在 master 分支,HEAD 指针指向 master 分支。

git checkout bug/fix1

切换分支其实就是让 HEAD 指针指向该分支。这时候 HEAD 指向的 bug/fix1 分支指针就会跟着我们提交的新 commit 走了,比如我们提交了新的 f843665commit,就会变成这样:

git checkout master

于是 HEAD 指针指回 master 分支,现在轮到 master 分支指针跟着我们提交的新 commit 走了。

GitHub 简介

Reference

  1. https://github.com/neolee/pilot/blob/master/x3-git-github.ipynb

Logging

2020-02-09 10:35:54 continue 2020-02-08 14:54:03 initialize