在正式開始之前
windows用戶,你需要先安裝好Git Bash
你還需要了解一些基本的Git Bash命令行操作
這是我總結的一些基本Git Bash命令行操作
http://www.itdecent.cn/p/f318276bf6f2
在本地體驗版本比較
我們先在桌面上創(chuàng)建一個example文件夾方便進行后續(xù)試驗。
接下來我們在這個example文件夾里,創(chuàng)建version_1.txt,version_2.txt兩個文件,文件內(nèi)的內(nèi)容不同

diff
【different】版本比較。比較兩個版本的文件之間的不同
$ diff version_1.txt version_2.txt
2c2
< I am version 1.
---
> I am version 2.
得到了兩個文件之間存在不同的兩行字
推薦下載sublime text作為文本編輯器

安裝配置完后,在Git Bash中輸入:
$ sublime_text
即可代開sublime_text進行文本編輯
還可以用sublime_text打開特定文件
$ sublime_text desktop/example/version_1.txt
正式開始
git
依然以桌面下的example文件夾作為我們的實驗文件夾,把之前試驗用的文件刪除。創(chuàng)建新的version_1.txt,內(nèi)容如下:

$ cd desktop/example
-a是all的意思,顯示全部
$ ls -a
得到當前目錄(桌面下的example文件夾)下的包含所有文件和路徑的列表
./ ../ version_1.txt
git init
git initialization,在當前文件夾下建立.git文件,相當于在當前文件夾里建立了跟蹤文件的倉庫
$ git init
Initialized empty Git repository in C:/Users/SUNING/Desktop/example/.git/
打開當前文件夾可以看到(請設置成顯示隱藏文件)

本地版本修改并放到本地倉庫中
git add
【git add】add添加。添加要跟蹤的文件
$ git add version_1.txt
git status
【git status】status狀態(tài)。查看git的狀態(tài)
$ git status
On branch master
No commits yet
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: version_1.txt
No commits yet顯示還沒有提交,但是 new file: version_1.txt顯示已經(jīng)添加version_1.txt為要跟蹤的文件了
git commit
【git commit】commit提交。將目標文件提交到本地倉庫中
在使用commit之前你需要先配置一下你的默認文本編輯器,我嘗試使用sublime text作為默認文本編輯器但是commit后會報錯,在這里推薦繼續(xù)使用nano
$ git config --global core.editor "nano"
再執(zhí)行git commit
$ git commit
會彈出nano文本編輯器,第一行的文字要對你提交的版本進行說明,這里我輸入了Add my init commit(習慣來說,都要使用英文,并且第一個單詞為動詞)。ctrl + o保存,ctrl + x退出

得到結果
[master (root-commit) 3b837c7] Add my init commit
1 file changed, 5 insertions(+)
create mode 100644 version_1.txt
接下來,我們對我們的version_1.txt文件進行更改、保存,就又可以重新commit了

$ git add version_1.txt
$ git commit
得到
[master 63a2ec8] Upgrade to version 2
1 file changed, 1 insertion(+), 1 deletion(-)
意思是一個文件發(fā)生改變,一個文件被添加,一個文件被刪除
查看各版本文件的提交日志(版本控制的作用開始顯現(xiàn))
git log
【git log】LOG是日志的意思。查看日志。
$ git log
我們可以看到我們兩次的版本提交,還能看到我們每次書寫的版本說明。
commit 63a2ec88ba2af431fc00075593e792e2d70828a7 (HEAD -> master)
Author: UJ
Date: Thu Oct 17 16:22:29 2019 +0800
Upgrade to version 2
commit 241a02153d30d5dcf88df0c1cb54a98c09f1aedc
Author: UJ
Date: Thu Oct 17 16:14:36 2019 +0800
Add my init commit
git diff
【git different】different不同。比較文件間的不同
接下來我們可以把兩個版本的摘錄下來進行比較(關注到上面每個版本都有一長串數(shù)字和字母組成的編碼,這個編碼可以供給我們對相應版本的文件進行比較)
$ git diff 241a02153d30d5dcf88df0c1cb54a98c09f1aedc 63a2ec88ba2af431fc00075593e792e2d70828a7
(大家可以試試把兩長串編碼位置互換,看看運行差異。git diff 63a2ec88ba2af431fc00075593e792e2d70828a7 241a02153d30d5dcf88df0c1cb54a98c09f1aedc)
得到
diff --git a/version_1.txt b/version_1.txt
index 18cb40d..297782d 100644
--- a/version_1.txt
+++ b/version_1.txt
@@ -2,4 +2,4 @@ Hello
I
am
version
-1
+2
意思是version后面的字符,減少了個“1”(原版本),增加了個“2”(新版本)
為什么要add之后再commit呢?
這里涉及到了git的工作機制
https://git-scm.com/about/staging-area
working directory本地
staging area暫存區(qū)
repository倉庫
git add命令:將本地文件存儲到暫存區(qū)
git commit命令:將暫存區(qū)文件存儲到倉庫

接下來做個小實驗理解一下這個過程
修改本地文件并保存

此時

$ git add version_1.txt
此時

$ git commit
此時

再改

此時

比較本地和暫存區(qū)
$ git diff
diff --git a/version_1.txt b/version_1.txt
index 97c002e..7fc0e1f 100644
--- a/version_1.txt
+++ b/version_1.txt
@@ -2,4 +2,4 @@ Hello
I
am
version
-3
+4
可以發(fā)現(xiàn),本地是4,暫存區(qū)是3,存在區(qū)別
比較暫存區(qū)和倉庫
$ git add version_1.txt

$ git diff --staged
diff --git a/version_1.txt b/version_1.txt
index 97c002e..7fc0e1f 100644
--- a/version_1.txt
+++ b/version_1.txt
@@ -2,4 +2,4 @@ Hello
I
am
version
-3
+4
好了測試好多遍了,大家應該對機制有了比較清晰的了解了吧?我們把最新版本version4 commit上去吧。
$ git commit
前面之所以講得這么啰嗦,是想讓大家理解其中的機制,如果大家能很好地理解前面的機制,后面的重點就會得心應手
后面是重點
后面是重點
后面是重點
git reset
假設你的本地文件變得亂七八糟

$ git reset --hard
HEAD is now at d504e89 Upgrade to version 4
再打開你本地的version_1.txt看看,又回來了?。?!

甚至你把本地壞掉的文件add到了暫存區(qū),使用上述命令仍然可以回到倉庫最新的版本
我們不僅能回到倉庫你的最新版本,我們還可以回到倉庫里的任何版本?。。?/h1>
打開日志
$ git log
commit d504e89510fc210c3be567648eaa578373879623 (HEAD -> master)
Author: UJ
Date: Thu Oct 17 17:38:59 2019 +0800
Upgrade to version 4
commit e8bc851c9e7df062e505d3886382c5357e2fd11b
Author: UJ
Date: Thu Oct 17 17:19:23 2019 +0800
Upgrade to version 3
commit 63a2ec88ba2af431fc00075593e792e2d70828a7
Author: UJ
Date: Thu Oct 17 16:22:29 2019 +0800
Upgrade to version 2
commit 241a02153d30d5dcf88df0c1cb54a98c09f1aedc
Author: UJ
Date: Thu Oct 17 16:14:36 2019 +0800
Add my init commit
我們選取最先前創(chuàng)建的版本的commit號碼 241a02153d30d5dcf88df0c1cb54a98c09f1aedc
$ git reset --hard 241a02153d30d5dcf88df0c1cb54a98c09f1aedc
我們居然回到了版本 1 ?。?!

好吧太刺激了,我們回到版本4吧!
但是當我執(zhí)行
$ git log
commit 3b837c7b22c29338d366b5b14494b5ad29878c56 (HEAD -> master)
Author: UJ
Date: Thu Oct 17 16:01:01 2019 +0800
Add my init commit
我的版本四呢?版本四呢,怎么除了第一個版本全不見了?玩大了,這下玩大了!......別擔心
git reflog
https://blog.csdn.net/DDD_QQQ/article/details/95485626
https://ask.csdn.net/questions/666490
git reflog能顯示你的所有操作
$ git reflog
3b837c7 (HEAD -> master) HEAD@{0}: reset: moving to 3b837c7b22c29338d366b5b14494b5ad29878c56
d504e89 HEAD@{1}: reset: moving to d504e89
3b837c7 (HEAD -> master) HEAD@{2}: reset: moving to 3b837c7
3b837c7 (HEAD -> master) HEAD@{3}: reset: moving to 3b837c7
3b837c7 (HEAD -> master) HEAD@{4}: reset: moving to 3b837c7
3b837c7 (HEAD -> master) HEAD@{5}: reset: moving to 3b837c7b22c29338d366b5b14494b5ad29878c56
d504e89 HEAD@{6}: reset: moving to HEAD
d504e89 HEAD@{7}: reset: moving to HEAD
d504e89 HEAD@{8}: commit: Upgrade to version 4
e8bc851 HEAD@{9}: reset: moving to HEAD
e8bc851 HEAD@{10}: commit: Upgrade to version 3
63a2ec8 HEAD@{11}: commit: Upgrade to version 2
241a021 HEAD@{12}: commit: Add my init commit
a0467a6 HEAD@{13}: commit: Add my init commit
3b837c7 (HEAD -> master) HEAD@{14}: commit (initial): Add my init commit
我們回到Upgrade to version 4的操作,它對應的ID為d504e89(這也可以看出為什么我們要認真寫每個版本commit的說明)
$ git reset --hard d504e89
HEAD is now at d504e89 Upgrade to version 4
現(xiàn)在再打開version_1.txt看看,再執(zhí)行git log看看
$ git log
commit d504e89510fc210c3be567648eaa578373879623 (HEAD -> master)
Author: UJ
Date: Thu Oct 17 17:38:59 2019 +0800
Upgrade to version 4
commit e8bc851c9e7df062e505d3886382c5357e2fd11b
Author: UJ
Date: Thu Oct 17 17:19:23 2019 +0800
Upgrade to version 3
commit 63a2ec88ba2af431fc00075593e792e2d70828a7
Author: UJ
Date: Thu Oct 17 16:22:29 2019 +0800
Upgrade to version 2
commit 241a02153d30d5dcf88df0c1cb54a98c09f1aedc
Author: UJ
Date: Thu Oct 17 16:14:36 2019 +0800
Add my init commit
commit a0467a67f0fcc940457bfba113ca8b22ca8aa0f7
Author: UJ
Date: Thu Oct 17 16:10:11 2019 +0800
Add my init commit
commit 3b837c7b22c29338d366b5b14494b5ad29878c56
Author: UJ
Date: Thu Oct 17 16:01:01 2019 +0800
Add my init commit

全都回來了