简介
- 本文是廖雪峰 Git 教程个人学习笔记。
- Git 是 Linux 创始人 Linus 为了方便管理 Linux 代码写的一个分布式版本控制系统。
- 集中式和分布式:除了分布式的版本控制系统,对应的还有集中式版本控制系统,例如 CVS 和 SVN,集中式版本控制系统需要一个主服务器,像一个图书馆,借完书还要还书。分布式版本控制系统通常也有一台充当“中央服务器”的电脑,但这个服务器的作用仅仅是用来方便“交换”大家的修改。
- 实际情况往往是这样,找一台电脑充当服务器的角色,每天24小时开机,其他每个人都从这个“服务器”仓库克隆一份 到自己的电脑上,并且各自把各自的提交推送到服务器仓库里,也从服务器仓库中拉取别人的提交。GitHub 就是 这么一个 Git 远程仓库。
初始化 Git 设置 - git config
- 因为Git是分布式版本控制系统,所以,每个机器都必须自报家门。Git 需要设置一个 username 和 email 地址作为身份来关联你的 commit 操作,这里的 username 和 Github 用户名不是一个东西。
初始化 Git 仓库 & 提交
提交为什么要分成两步?
参考:https://www.zhihu.com/question/19946553/answer/13759819
查看变动状态 - git status & git diff
- 修改 readme.txt 的内容:
Git is a distributed version control system.
Git is free software.
- 运行
git status 查看仓库当前状态。输出告诉我们,readme.txt被修改过了,但修改还未准备提交。 :$ 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: readme.txt
no changes added to commit (use "git add" and/or "git commit -a")
- 运行
git diff 看看具体修改了什么内容,即显示当前工作区的文件和暂存区文件的差异。得到如下输出:$ git diff
diff --git a/readme.txt b/readme.txt
index d8036c1..013b5bc 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,2 +1,2 @@
-Git is a version control system.
+Git is a distributed version control system.
Git is free software.
git diff :显示工作区和暂存区的差异
git diff --staged :显示暂存区和上次提交的差异
git diff HEAD :显示工作区和上次提交的差异
- 再使用
git add 命令之后运行 git status,输出告诉我们对 readme.txt 的修改已准备好提交:$ git add readme.txt
$ git status
On branch master
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
modified: readme.txt
- 最后使用
git commit -m "add distributed" 提交即可
查看 commit 日志 - git log
- 再一次修改 readme.txt:
Git is a distributed version control system.
Git is free software distributed under the GPL.
- 然后提交:
$ git add readme.txt
$ git commit -m "append GPL"
- 现在对 readme.txt 的修改了相当经历了三个版本,使用
git log 命令查看从最近到最远的提交日志:$ git log
commit 6c6c620d747bf718d25c720dc56ec4c4ca1a1699 (HEAD -> master)
Author: Max <max@max.com>
Date: Thu Apr 30 03:07:40 2020 +0800
append GPL
commit 173bd040d5a795dec81586f7da03a27395199901
Author: Max <max@max.com>
Date: Thu Apr 30 03:02:37 2020 +0800
add distributed
commit 08035c7d90fbedf8b88030f456cd0c3c9c0cfcbb
Author: Max <max@max.com>
Date: Thu Apr 30 02:34:20 2020 +0800
wrote a readme file
- 如果输出信息过多,加上
--pretty=oneline 参数:$ git log --pretty=oneline
6c6c620d747bf718d25c720dc56ec4c4ca1a1699 (HEAD -> master) append GPL
173bd040d5a795dec81586f7da03a27395199901 add distributed
08035c7d90fbedf8b88030f456cd0c3c9c0cfcbb wrote a readme file
- 上面每条日志中一大串类似 6c6c6... 的是 commit id(版本号)
时光机 - 版本回退 - git reset
- 现在我们要把当前版本 "append GPL" 回退到上一个版本 "add distributed" ,就可以使用
git reset 命令,执行后文件会被立刻还原:$ git reset --hard HEAD~
HEAD is now at 173bd04 add distributed
- 在 Git 中 HEAD 表示当前分支的最新提交(即最新版本),上一个版本就是 HEAD^,上上一个版本就是HEAD^^。
- 上 n 个版本也可以写成 HEAD~n。注意在 Windows 命令行中换行符是 ^,所以用 HEAD~ 或 HEAD~1 表示上一个版本也行。
- 运行
git log 会发现 commit 日记也被还原了:$ git log
commit 173bd040d5a795dec81586f7da03a27395199901 (HEAD -> master)
Author: Max <max@max.com>
Date: Thu Apr 30 03:02:37 2020 +0800
add distributed
commit 08035c7d90fbedf8b88030f456cd0c3c9c0cfcbb
Author: Max <max@max.com>
Date: Thu Apr 30 02:34:20 2020 +0800
wrote a readme file
- 如果又要取消回退怎么办?可以在命令行窗口往上翻,找到之前 append GPL 的 commit id 是 6c6c62...,于是就可以用commid id 指定回到未来的某个版本,版本号没必要写全,前几位就可以了:
$ git reset --hard 6c6c62
HEAD is now at 6c6c620 append GPL
如果之前的 commit id 命令行里找不到,可以用 git reflog ,这个命令可以查看所有使用过的命令历史:$ git reflog
6c6c620 (HEAD -> master) HEAD@{0}: reset: moving to 6c6c62
173bd04 HEAD@{2}: reset: moving to HEAD~
6c6c620 (HEAD -> master) HEAD@{3}: commit: append GPL
173bd04 HEAD@{4}: commit: add distributed
08035c7 HEAD@{5}: commit (initial): wrote a readme file
使用 git checkout 和 git reset HEAD 撤销修改
- 如果文件修改还未使用
git add 添加到暂存区,要想撤销修改,既可选择手动将文件恢复,
也可以使用 git checkout -- readme.txt 。这个命令可以方便地把文件恢复到上次添加到暂存区时的状态,即让这个文件回到最近一次 git add 或 git commit 时的状态。
- 如果修改已经添加到了暂存区,但是要恢复到上次提交时的状态 ,
则先需要执行 git restore --staged readme.txt 或 git reset HEAD readme.txt,用于撤销往暂存区的修改(unstage)。最后再用上面讲的 git checkout -- readme.txt 即可最终恢复到上次提交时的状态。
- 如果修改已经 commit,直接版本回退即可。
删除文件 git rm
- 删除文件同样是一种修改操作。
- 当从工作目录中删除了文件后,导致工作区和版本库不一致,所以运行
git status 命令便会立刻告诉你有文件被删除了。
- 如果确实要删除,那就用命令
git rm 从版本库中删掉,然后 git commit。
- 如果属于误删,使用
git checkout -- readme.txt 即可恢复到上次提交时的状态。