目錄
git add
git?commit?
git log?
git status
git diff
git 版本回退?
git reset
git add
? ? ? ? git add 指令為添加工作區中的文件到暫存區中。
git add file_name; //將工作區名稱為file_name的文件添加進暫存區
git add .; //將工作區中的所有文件添加進暫存區
git?commit?
? ? ? ? git commit 指令為將暫存區中的文件添加到master分支中。
git commmit -m "這里為對這一次文件提交的描述"
? ? ? ? ?需要注意的是,git commit -m 中的 -m 選項是必須要含有的,表示添加的日志信息是什么。
git log?
? ? ? ? git log 用于查看提交的日志。
git log
? ? ? ? 通過上圖我們不難發現,在 commit 后面有一個很長的 16 進制序列數字,這個數字我們稱之為一個 commit id,它是經過哈希算法獲得的具有唯一性的 id,可以用于定位每一次的文 件提交。
git log --pretty==oneline //將提交日志信息以一行的方式顯示出來
????????git add 以及 git commit 之后,工作區中的文件就已經被添加到了版本庫中的 master 分支中。?
? ? ? ? 1.此時查看版本庫的目錄結構,在目錄中生成了 HEAD 指針。
? ? ? ? HEAD 指針指向了,版本庫目錄中的 master 分支。?
? ? ? ? 2.在目錄中也生成了 index 目錄,里面存放的就是工作區的文件被添加進暫存區之后生成的索引文件。
? ? ? ? 3.在目錄中生成了 objects 目錄,這個目錄里面存儲的是,工作區的文件被每次修改并 git add 以及 git commit 之后,生成的 Git 對象,這個 Git 對象可以用于歷史文件版本的恢復,里面存儲的是每一次 git commit 之后生成的 commit id 哈希值。
? ? ? ? 4.在目錄中生成了 master 目錄,這個目錄里面存放的是,最新一次提交的 commit id。
? ? ? ? 通過這個 commit id 找到了上一次提交的 commit id。
? ? ? ? 根據,上一次提交的 commit id 可以找到對應的 blob 對象,這是在工作區的文件被 git add 之后創建的對象,里面存儲文件內容。?
? ? ? ? 根據 blob 對象的哈希值,可以讀取文件的內容。
git status
????????我們對工作區中的 ReadMe 文件進行修改,此時工作區中的 ReadMe 文件和本地倉庫中的 ReadMe 文件就是不想通的,我們怎樣查看當前的本地倉庫的狀態呢?
? ? ? ? 可以使用 git status 指令,查看本地倉庫的狀態。
? ? ? ? 通過顯示的內容我們可以得知,我們已經對工作區中的 ReadMe 文件進行了修改,但是還沒有 進行 add 和 commit。?
? ? ? ? git add 之后,查看本地倉庫狀態。
? ? ? ? 通過上圖我們發現,git add 之后提示我們還沒有 commit。?
? ? ? ? git commit 之后,查看本地倉庫狀態。
? ? ? ? 通過上圖發現,git commit 之后,我們已經不需要再去提交任何內容。?
git diff
? ? ? ? 還是上述的場景我們對工作區中的?ReadMe 文件進行了修改,那么我們怎么樣得知工作區的 ReadMe 文件和版本庫中的 ReadMe 文件的區別呢?
? ? ? ? 我們可以使用 git diff 指令查看其區別。
? ? ? ? 區別就是我們在工作區中的 ReadMe 文件中添加了 hello yjd!!! 字符串。?
git 版本回退?
? ? ? ? 有些時候我們可能會對同一個文件進行多次更改和提交,但是有時候我們發現最新的版本不符合我們的要求,此時我們就要回退到歷史的版本,此時我們就需要使用 git 版本回退的相關指令。
git reset
? ? ? ? 在 git 版本回退時,我們使用 git reset 指令進行版本的回退。
? ? ? ??還是上述場景,我們對 ReadMe文件進行了修改,修改前我們簡稱為 git ,修改之后我們簡稱為?git/yjd。git 版本的回退有很多的選項,圖示如下。
工作區 | 暫存區 | 版本庫 | 選項 |
git/yjd | git/yjd | git | --soft |
git/yjd | git | git | --mixed(默認選項) |
git | git | git | --hard(慎用) |
? ? ? ? 工作區中存儲的就是文件本身,而暫存區中存儲的是 git add 之后的在 object 目錄下生成的 blob 對象的哈。什么是 blob 對象?
? ? ? ? 我們知道,一旦我們一 git add 文件,就會在 object 目錄下生成一個 git 對象,git 對象用于版本控制,而 blob 對象就是 git 對象中的一個對象,可以理解為這個對象中存放的就是文件中的內容。
? ? ? 每次 git add 都會生成一個 git 對象,但是如果此次的修改沒有修改內容,就不會生成一個新的 blob 對象,而是會復用之前的已經存在的 blob 對象,兩個 git 對象通過同一個 哈希id 找到了同一個 blob 對象。
? ? ? ?暫存區中存儲的就是 blob 對象的 哈希id ,而版本庫中存儲的就是 object 目錄下的 blob 對象。
- --soft 選項:會將 版本庫中的 blob 對象回退,但是不會將暫存區中的 哈希id 和工作區的文件進行回退。
- --mixed 選項:會將 版本庫中的 blob 對象回退,會將暫存區中的 哈希id 回退,不會將工作區中的文件回退。
- --hard 選項:會將 版本庫,暫存區,工作區都回退,但是建議不要使用 --hard 選項,因為有可能有人正在使用這個工作區中的文件,你使用 --hard 選項進行回退,就會導致當前寫入的全部文件刪除,所以慎用。
? ? ? ? 如何去進行回退呢?我們使用 --hard 選項進行演示。
? ? ? ? 1.先通過 git log 查看歷史的提交日志,選取回退的版本。
? ? ? ? 2.使用 git reset --hard 哈希id 的方式進行回退。
? ? ? ? 3.查看是否回退。
?
? ? ? ? 此時確實是已經完成了回退。?
? ? ? ? 如果此次回退我們后悔了,想回退到之前,還可以進行回退嗎?
? ? ? ? 此時查詢 git log 日志查詢出來的 commit id 已經是第一次 commit 的 id 了,所以通過當前的 git log 是不可以進行撤銷此次回退的,我們可以根據之前 git log 查詢結果進行撤銷此次回退。
? ? ? ? 但是,如果我們在打印完了上次的 git log 之后就關閉了終端,此時再次打開終端是就無法查看上一次的 git log 結果了,此時想進行撤銷回退, 可以使用 git reflog 查看歷史指令進行此次回退的撤銷。
? ? ? ? 即使在歷史的日志中,對應的哈希id是部分哈希id也可以進行歷史版本的回退。?
? ? ? ? 說白了,無論是正常的回退還是撤銷回退,其實就是通過 commit 之后的 commit id (哈希id) 將此時的 工作區 暫存區 版本庫 中的相關信息設置為對應的 哈希id 所處的版本。?
? ? ? ? ?所以 git 版本控制,其實就是 commit id(哈希id) 的控制。
? ? ? ? 以上便是本期的所有內容。
? ? ? ? 本期內容到此結束^_^