目錄
-
- 0. Git的安裝
- 1. 建立本地倉庫
- 2. `add`和`commit`
- 3. `status`
- 4. `log`
- 6. `reset`
- 7. 找回本地庫删除的檔案
- 8. 找回暫存區删除的檔案
- 9. `diff`指令
Git這個東西,你說不會吧,但是平時也能用,你說很會吧,但是好多東西不太明晰,這次必須好好總結總結!将知識體系穩固住!
0. Git的安裝
省略
1. 建立本地倉庫
- 建立檔案夾:
- 打開Git,
:Git Bash Here
- 檢視Git版本:
[email protected] MINGW64 /e/code/GitResp $ git --version git version 2.30.0.windows.2
- 設定Git使用者名:
- 設定郵箱:
- 本地倉庫的初始化操作:
生成隐藏檔案:[email protected] MINGW64 /e/code/GitResp $ git init Initialized empty Git repository in E:/code/GitResp/.git/
- 檢視
檔案夾: .git目錄下的本地庫相關的子目錄和子檔案不要删除,不要胡亂修改。.git
2. add
和 commit
add
commit
先建立一個檔案,demo.txt:
将檔案送出到暫存區
git add demo.txt
:
[email protected] MINGW64 /e/code/GitResp (master)
$ git add demo.txt
将檔案從暫存區放入本地庫
git commit -m "注釋"
:
[email protected] MINGW64 /e/code/GitResp (master)
$ git commit -m "這是第一次送出,建立了一個demo.txt"
[master (root-commit) db44fb0] 這是第一次送出,建立了一個demo.txt
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 demo.txt
3. status
status
status
是檢視工作區和暫存區的狀态的指令。
[email protected] MINGW64 /e/code/GitResp (master)
$ git status
On branch master
nothing to commit, working tree clean
上面的内容顯示,沒有東西要送出。
我們建立一個demo2.txt, 再次執行該指令檢視:
[email protected] MINGW64 /e/code/GitResp (master)
$ git status
On branch master
Untracked files:
(use "git add <file>..." to include in what will be committed)
demo2.txt
nothing added to commit but untracked files present (use "git add" to track)
我們可以看到,上面顯示,有
untracked files:
,就是未追蹤的檔案:demo2.txt,還提醒我們使用git add 來添加到追蹤。
然後我們将demo2.txt添加到暫存區, 再次檢視status:
[email protected] MINGW64 /e/code/GitResp (master)
$ git add demo2.txt demo2.txt
[email protected] MINGW64 /e/code/GitResp (master)
$ git status
On branch master
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
new file: demo2.txt
再次送出:
[email protected] MINGW64 /e/code/GitResp (master)
$ git commit -m "這是第二次送出,添加了demo2.txt"
[master 73799af] 這是第二次送出,添加了demo2.txt
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 demo2.txt
檢視狀态:
[email protected] MINGW64 /e/code/GitResp (master)
$ git status
On branch master
nothing to commit, working tree clean
我們在檔案demo2.txt裡面添加一些内容:
檢視狀态
git status
:
[email protected] MINGW64 /e/code/GitResp (master)
$ 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: demo2.txt
no changes added to commit (use "git add" and/or "git commit -a")
提示我們可以使用add來更新,有檔案已經被修改了。
這個時候需要我們重新添加,再次檢視狀态:
[email protected] MINGW64 /e/code/GitResp (master)
$ git add demo2.txt
[email protected] MINGW64 /e/code/GitResp (master)
$ git status
On branch master
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
modified: demo2.txt
然後我們再commit一次,檢視狀态:
[email protected] MINGW64 /e/code/GitResp (master)
$ git commit -m "第三次送出,修改了demo2.txt"
[master 26c58cd] 第三次送出,修改了demo2.txt
1 file changed, 1 insertion(+)
[email protected] MINGW64 /e/code/GitResp (master)
$ git status
On branch master
nothing to commit, working tree clean
4. log
log
我們可以使用
git log
來檢視日志:
[email protected] MINGW64 /e/code/GitResp (master)
$ git log
commit 26c58cddfbdabb0c1f466420d71ed8e80540b9e5 (HEAD -> master)
Author: veejaLiu <[email protected]>
Date: Thu Jan 28 14:48:20 2021 +0800
第三次送出,修改了demo2.txt
commit 73799afcf2ccf6588b817098041d0a88687095f0
Author: veejaLiu <[email protected]>
Date: Thu Jan 28 14:32:52 2021 +0800
這是第二次送出,添加了demo2.txt
commit db44fb0fa1fa65a039277c9c7071907d13b30293
Author: veejaLiu <[email protected]>
Date: Thu Jan 28 14:18:20 2021 +0800
這是第一次送出,建立了一個demo.txt
當我們進行多次操作的時候,
git log
指令不足以顯示全部的日志資訊,在下面會出現一個
:
這個時候我們按
空格鍵
就可以往下翻,按
B鍵
就可以往前退。
到尾頁的時候,就顯示
END
。
我們可以按
Q鍵
退出檢視,繼續我們的操作。
上面展示的資訊太過于啰唆,我們可以采取幾種簡潔的展示方式:
# 将一個版本的資訊放到一行裡面
[email protected] MINGW64 /e/code/GitResp (master)
$ git log --pretty=oneline
2bce1d3176c95f082f49fbbda3b8c2e9952e6866 (HEAD -> master) 删除了demo3~10.txt檔案
e5eca9f79628ef76570f568884bde59c62c3140c 添加了demo3~10的檔案
26c58cddfbdabb0c1f466420d71ed8e80540b9e5 第三次送出,修改了demo2.txt
73799afcf2ccf6588b817098041d0a88687095f0 這是第二次送出,添加了demo2.txt
db44fb0fa1fa65a039277c9c7071907d13b30293 這是第一次送出,建立了一個demo.txt
# 更簡潔的一行顯示
[email protected] MINGW64 /e/code/GitResp (master)
$ git log --oneline
2bce1d3 (HEAD -> master) 删除了demo3~10.txt檔案
e5eca9f 添加了demo3~10的檔案
26c58cd 第三次送出,修改了demo2.txt
73799af 這是第二次送出,添加了demo2.txt
db44fb0 這是第一次送出,建立了一個demo.txt
# reflog指令 一行顯示
# 多了 HEAD@{數字}資訊:
# 這個數字的含義是指針回到目前的曆史版本需要走的步數。
[email protected] MINGW64 /e/code/GitResp (master)
$ git reflog
2bce1d3 (HEAD -> master) HEAD@{0}: commit: 删除了demo3~10.txt檔案
e5eca9f HEAD@{1}: commit: 添加了demo3~10的檔案
26c58cd HEAD@{2}: commit: 第三次送出,修改了demo2.txt
73799af HEAD@{3}: commit: 這是第二次送出,添加了demo2.txt
db44fb0 HEAD@{4}: commit (initial): 這是第一次送出,建立了一個demo.txt
6. reset
reset
我們可以看到我們的版本記錄,目前的版本為
2bce1d3
。
我們在最近的版本中,删除了demo3~10的檔案,如果我們想恢複,這個時候應該怎麼辦?
[email protected] MINGW64 /e/code/GitResp (master)
$ git reflog
2bce1d3 (HEAD -> master) HEAD@{0}: commit: 删除了demo3~10.txt檔案
e5eca9f HEAD@{1}: commit: 添加了demo3~10的檔案
26c58cd HEAD@{2}: commit: 第三次送出,修改了demo2.txt
73799af HEAD@{3}: commit: 這是第二次送出,添加了demo2.txt
db44fb0 HEAD@{4}: commit (initial): 這是第一次送出,建立了一個demo.txt
我們需要使用
git reset
指令:
# git reset --hard 索引号
[email protected] MINGW64 /e/code/GitResp (master)
$ git reset --hard e5eca9f
HEAD is now at e5eca9f 添加了demo3~10的檔案
我們可以再次檢視日志:
[email protected] MINGW64 /e/code/GitResp (master)
$ git reflog
e5eca9f (HEAD -> master) HEAD@{0}: reset: moving to e5eca9f
2bce1d3 HEAD@{1}: commit: 删除了demo3~10.txt檔案
e5eca9f (HEAD -> master) HEAD@{2}: commit: 添加了demo3~10的檔案
26c58cd HEAD@{3}: commit: 第三次送出,修改了demo2.txt
73799af HEAD@{4}: commit: 這是第二次送出,添加了demo2.txt
db44fb0 HEAD@{5}: commit (initial): 這是第一次送出,建立了一個demo.txt
我們看到,
HEAD -> master
指向的節點已經變成了e5eca9f對應的版本了。
我們甚至可以在檔案夾裡面看到,那幾個檔案又神奇的回來了。
reset還有其他的參數,
- 其中上面使用的
參數的含義是,當我們的本地庫檔案改變的時候,工作區和暫存區的内容也随之回退或者前進。這一個參數也是我們使用的最多的。--hard
- –
參數:本地庫改變的時候,暫存區随之改變,但是工作區不變。mixed
-
:本地庫改變的時候,暫存區和工作區都不改變。--soft
7. 找回本地庫删除的檔案
我們建立一個檔案Test2.txt,
并将它add到暫存區當中,
再将它送出到本地庫。
[email protected] MINGW64 /e/code/GitResp (master)
$ git add Test2.txt
[email protected] MINGW64 /e/code/GitResp (master)
$ git commit -m "add Test2.txt"
[master da8d40b] add Test2.txt
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 Test2.txt
删除工作區中的Test2.txt:
将删除的操作同步到暫存區:
[email protected] MINGW64 /e/code/GitResp (master)
$ git add Test2.txt
[email protected] MINGW64 /e/code/GitResp (master)
$ git status
On branch master
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
deleted: Test2.txt
将删除的操作同步到本地庫:
[email protected] MINGW64 /e/code/GitResp (master)
$ git commit -m "删除Test2.txt"
[master 6e9fc2f] 删除Test2.txt
1 file changed, 0 insertions(+), 0 deletions(-)
delete mode 100644 Test2.txt
檢視日志:
[email protected] MINGW64 /e/code/GitResp (master)
$ git reflog
6e9fc2f (HEAD -> master) HEAD@{0}: commit: 删除Test2.txt
da8d40b HEAD@{1}: commit: add Test2.txt
e5eca9f HEAD@{2}: reset: moving to e5eca9f
2bce1d3 HEAD@{3}: commit: 删除了demo3~10.txt檔案
e5eca9f HEAD@{4}: commit: 添加了demo3~10的檔案
26c58cd HEAD@{5}: commit: 第三次送出,修改了demo2.txt
73799af HEAD@{6}: commit: 這是第二次送出,添加了demo2.txt
db44fb0 HEAD@{7}: commit (initial): 這是第一次送出,建立了一個demo.txt
找回檔案,也就是回退版本:
[email protected] MINGW64 /e/code/GitResp (master)
$ git reflog
6e9fc2f (HEAD -> master) HEAD@{0}: commit: 删除Test2.txt
da8d40b HEAD@{1}: commit: add Test2.txt
e5eca9f HEAD@{2}: reset: moving to e5eca9f
2bce1d3 HEAD@{3}: commit: 删除了demo3~10.txt檔案
e5eca9f HEAD@{4}: commit: 添加了demo3~10的檔案
26c58cd HEAD@{5}: commit: 第三次送出,修改了demo2.txt
73799af HEAD@{6}: commit: 這是第二次送出,添加了demo2.txt
db44fb0 HEAD@{7}: commit (initial): 這是第一次送出,建立了一個demo.txt
[email protected] MINGW64 /e/code/GitResp (master)
$ git reset --hard da8d40b
HEAD is now at da8d40b add Test2.txt
8. 找回暫存區删除的檔案
先删除檔案,并且添加到暫存區:
[email protected] MINGW64 /e/code/GitResp (master)
$ ll
total 1
-rw-r--r-- 1 veeja 197121 0 Jan 28 16:13 Test2.txt
-rw-r--r-- 1 veeja 197121 0 Jan 28 14:12 demo.txt
-rw-r--r-- 1 veeja 197121 0 Jan 28 15:49 demo10.txt
-rw-r--r-- 1 veeja 197121 10 Jan 28 14:36 demo2.txt
-rw-r--r-- 1 veeja 197121 0 Jan 28 15:49 demo3.txt
-rw-r--r-- 1 veeja 197121 0 Jan 28 15:49 demo4.txt
-rw-r--r-- 1 veeja 197121 0 Jan 28 15:49 demo5.txt
-rw-r--r-- 1 veeja 197121 0 Jan 28 15:49 demo6.txt
-rw-r--r-- 1 veeja 197121 0 Jan 28 15:49 demo7.txt
-rw-r--r-- 1 veeja 197121 0 Jan 28 15:49 demo8.txt
-rw-r--r-- 1 veeja 197121 0 Jan 28 15:49 demo9.txt
[email protected] MINGW64 /e/code/GitResp (master)
$ rm Test2.txt
[email protected] MINGW64 /e/code/GitResp (master)
$ git add Test2.txt
[email protected] MINGW64 /e/code/GitResp (master)
$ git status
On branch master
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
deleted: Test2.txt
這個時候我們後悔了,想恢複暫存區的資料,其實跟剛才一樣,使用–hard參數,恢複本地庫版本就行了:
[email protected] MINGW64 /e/code/GitResp (master)
$ git reflog
da8d40b (HEAD -> master) HEAD@{0}: reset: moving to da8d40b
6e9fc2f HEAD@{1}: commit: 删除Test2.txt
da8d40b (HEAD -> master) HEAD@{2}: commit: add Test2.txt
e5eca9f HEAD@{3}: reset: moving to e5eca9f
2bce1d3 HEAD@{4}: commit: 删除了demo3~10.txt檔案
e5eca9f HEAD@{5}: commit: 添加了demo3~10的檔案
26c58cd HEAD@{6}: commit: 第三次送出,修改了demo2.txt
73799af HEAD@{7}: commit: 這是第二次送出,添加了demo2.txt
db44fb0 HEAD@{8}: commit (initial): 這是第一次送出,建立了一個demo.txt
[email protected] MINGW64 /e/code/GitResp (master)
$ git reset --hard da8d40b
HEAD is now at da8d40b add Test2.txt
[email protected] MINGW64 /e/code/GitResp (master)
$ ll
total 1
-rw-r--r-- 1 veeja 197121 0 Jan 28 16:20 Test2.txt
-rw-r--r-- 1 veeja 197121 0 Jan 28 14:12 demo.txt
-rw-r--r-- 1 veeja 197121 0 Jan 28 15:49 demo10.txt
-rw-r--r-- 1 veeja 197121 10 Jan 28 14:36 demo2.txt
-rw-r--r-- 1 veeja 197121 0 Jan 28 15:49 demo3.txt
-rw-r--r-- 1 veeja 197121 0 Jan 28 15:49 demo4.txt
-rw-r--r-- 1 veeja 197121 0 Jan 28 15:49 demo5.txt
-rw-r--r-- 1 veeja 197121 0 Jan 28 15:49 demo6.txt
-rw-r--r-- 1 veeja 197121 0 Jan 28 15:49 demo7.txt
-rw-r--r-- 1 veeja 197121 0 Jan 28 15:49 demo8.txt
-rw-r--r-- 1 veeja 197121 0 Jan 28 15:49 demo9.txt
9. diff
指令
diff
建立一個Test3.txt:
添加并送出:
[email protected] MINGW64 /e/code/GitResp (master)
$ git add Test3.txt Test3.txt
[email protected] MINGW64 /e/code/GitResp (master)
$ git commit -m "add Test3.txt"
[master 063032b] add Test3.txt
1 file changed, 1 insertion(+)
create mode 100644 Test3.txt
在Test3.txt中增加一些内容:
接下來,我們使用diff指令,比對檔案的不同:
[email protected] MINGW64 /e/code/GitResp (master)
$ git diff Test3.txt
diff --git a/Test3.txt b/Test3.txt
index 90929f7..30c52e9 100644
--- a/Test3.txt
+++ b/Test3.txt
@@ -1 +1,2 @@
-aaaaaaaaaaaaa
\ No newline at end of file
+aaaaaaaaaaaaa
+bbbbbbbbbbbbbbbbbbbbbbbb
\ No newline at end of file
也可以使用
git diff [曆史版本] [檔案名]
來比較暫存區和工作區中的内容。