Git教程2

窦梓峻發表於2024-08-19

六、Git的工作區域和檔案狀態

1、工作區域:

(1) 工作區(Working Directory):電腦上可以看到的目錄,即實際操作的目錄。車間
(2) 暫存區(Staging Area/Index):儲存即將提交到Git倉庫的修改內容。運輸工具 Cache
(3) 本地倉庫(Local Repository):儲存程式碼和版本資訊的主要位置。倉庫
(4) 工作區 git add -> 暫存區 git commit -> 本地倉庫。

2、檔案狀態:

(1) 未跟蹤:untrack,新建立但是未被git管理的檔案。
(2) 未修改:unmodified,被git管理但是內容未發生變化的檔案。
(3) 已修改:modified,已經修改但是未新增到暫存區的檔案。
(4) 已暫存:staged,已修改並已經新增到暫存區的檔案。


七、新增和提交檔案

1、命令:

(1) echo "xxx" > file1.txt 將內容新增到file1.txt檔案中。
(2) cat file1.txt 檢視檔案內容。
(3) git status 檢視倉庫中的檔案狀態。
(4) git add file1.txt 將檔案新增到暫存區。
(5) git commit -m "內容" 將暫存區的檔案提交到倉庫中。
(6) git commit只會提交暫存區中的檔案,不會提交到工作區中的檔案。且要使用 -m 引數,指定提交的資訊。
(7) git add *.txt 將以txt結尾的檔案全部加入到暫存區。
(8) git add . 將全部檔案新增到暫存區,. 表示當前目錄。
(9) vim編輯:
① i鍵進入編輯模式。
② esc 回到命令模式,輸入:wq儲存退出,提交完成。
(10) git log 檢視提交記錄;git log --oneline 檢視簡潔的提交記錄。


八、Git reset回退版本

1、git reset:

(1) 可以回退到之前的某一個提交的狀態。
(2) git reset的三種模式:對應於三種引數
git reset --soft 回退到某一個版本,並且保留工作區和暫存區的所有修改內容。
git reset --hard 回退到某一個版本,並且丟棄工作區和暫存區的所有修改內容。
git reset --mixed 介於soft和hard之間,回退到某一個版本,並且保留工作區的修改內容而丟棄暫存區中的修改內容。mixed是reset命令的預設引數。

2、演示:

(1) cp -rf repo repo-soft
① cp:copy,用於複製檔案或目錄。
② -r:recursive,遞迴地複製指定目錄及其子目錄下的所有檔案和目錄。
③ -f:force,如果目標位置有同名檔案或目錄存在,cp命令無條件覆蓋它們,而不會提示使用者確認。
④ repo:原目錄。
⑤ repo-soft:目標目錄。
(2) repo-soft、repo-hard、repo-mixed三個目錄用於測試三種不同的模式。
(3) git reset --soft
① 由於file3是第三次提交,而使用soft引數回退到了第二次提交,所以file3是new file。
(4) git reset --hard
① HEAD^:表示回退到上一個版本。
② ls:工作區不存在file3;ls-files:暫存區也不存在file3。
③ 使用--hard引數時,工作區和暫存區內容都會被清空。
(5) git reset --mixed mixed可以省略。
git reset HEAD^ 預設是mixed引數。
cat file3.txt 檢視檔案內容。
③ 工作區有file3,但是暫存區沒有file3。

3、謹慎使用hard引數,會清楚工作區和暫存區的全部內容。如果誤操作,使用`git reflog` 命令檢視過去一段時間的HEAD的移動。

4、git refloggit log 的對比:

(1) git log 顯示的是提交歷史,git reflog 顯示的是所有引用(包括HEAD和分支)的移動歷史。
(2) 當要檢視所有分支的提交歷史,使用git log ;當由於回退等操作導致暫存區內容丟失時,使用git reflog 查詢過去一段時間的HEAD移動。


九、Git diff檢視差異

1、git diff:

(1) 檢視工作區、暫存區、本地倉庫之間的差異。
(2) 檢視檔案在不同版本之間的差異。
(3) 檢視檔案在不同分支之間的差異。
(4) git diff無引數時,預設比較工作區(Working Directory)和暫存區(Staging Area)之間的差異。(很奇怪,做實驗時這裡明明是比較的是已經提交(倉庫)和在工作區的檔案。)
① 每次add和commit一個檔案,最後修改file3檔案:333 -> 3333。
git diff 之後的結果:
第一行:變化的檔案。
第二行:Git將檔案內容使用Hash生成一個40位的雜湊值,這裡只顯示前7位。100644為檔案的許可權。
第三行:紅色為刪除內容,綠色為新增的內容。
③ 透過 git add . 將工作區中的內容新增到暫存區後,使用 git diff 發現沒有變化。說明此時工作區和暫存區之間沒有差異。
(5) git diff HEAD 比較工作區和版本庫之間的差異。
① 此時工作區和暫存區內容一致(執行了git add .),但是由於還沒有執行提交操作,所以工作區和版本庫之間仍有差異。
(6) git diff --cached 比較暫存區和版本庫之間的差異。
① 由於沒有commit,暫存區和版本庫之間有差異。
② 當commit後,暫存區和版本庫、工作區和版本庫之間都沒有差異。

2、git diff比較不同提交ID的資訊:

(1) git diff ID1 ID2
(2) 可以用HEAD指向分支的最新的提交節點。
(3) 比較HEAD和HEAD上一次的提交的資訊:git diff HEAD~ HEADgit diff HEAD^ HEAD
(4) 比較HEAD和HEAD之前第三個版本的資訊:git diff HEAD~3 HEAD
(5) 只比較file3的內容:git diff HEAD~3 HEAD file3.txt