修改版本與回退
Git修改
我們修改一下readme.txt
文件:
然後我們使用git status
查看一下倉庫的狀態。
因爲這個readme.txt受Git所管理,所以一旦修改之後,查看git倉庫的狀態就能顯示出來修改記錄(上圖標紅處),然後通過
git diff
來查看修改前後的差異:
從上面可以看到修改是多加了個"distributed"。
接着,我們再add
一下修改後的readme.txt
,然後在commit
之前查看一下倉庫的狀態
然後commit,並查看status,發現當前沒有需要提交的修改,且工作目錄是clean的
Git版本回退
我們可以通過git log
來查看git 日誌,加上--pretty=oneline
可以更加簡潔看到git歷史日誌。
從上圖可以看到,每一條記錄前都有一串數字+字母的號,這個就是commit id
。
然後我們通過git reset -- hard Head^
回退到前一個版本,Head^
表示回退一個版本,那麼Head^^
表示回退兩個版本,若想回退多個版本(舉例10),就用Head~10
。
如果我們還想回到最新的版本,因爲 append GPL的commit id爲如下:
所以可指定回到未來的某個版本,版本號沒必要寫全,前幾位(4位)就可以了,Git會自動去找。
當用 git reset --hard HEAD^
回退到add distributed版本時,再想恢復到append GPL,就必須找到append GPL的commit id。Git提供了一個命令git reflog
用來記錄你的每一次命令:
工作區和暫存區
之前我們已經提到了這兩個概念,接下來具體來了解一下這些概念。
這個就是我們的工作區:
而這個文件夾裏有一個.git
就是Git的版本庫。
Git的版本庫裏存了很多東西,其中最重要的就是稱爲stage(或者叫index)的暫存區,還有Git爲我們自動創建的第一個分支master
,以及指向master
的一個指針叫HEAD
。
我們試圖去.git裏找一下HEAD文件。
打開可以看到:
然後我們打開refs/heads/master
:
可以發現HEAD就是指向當前的Commit id。
而我們之前的兩個操作add
和commit
的指示圖如下:
add
:將文件修改添加到暫存區stage中。commit
:把暫存區的所有內容提交到當前分支。
當我們創建Git版本庫時,Git會自動創建了唯一的一個master分支,所以,現在,git commit就是往master分支上提交更改。而需要提交的文件修改都放到暫存區中,再一次性commit這些修改。
我們修改一下readme.txt
,並增加一個LICENSE
文件,然後查看一下status。
可以發現LICENSE沒有被添加,所以狀態是Untracked
。然後我們add一下這兩個文件,再查看一下status。
這樣暫存區的狀態變成了這樣:
所以,git add
實際上是把要提交的所有修改放到暫存區(Stage),然後,執行git commit
就可以一次性把暫存區的所有修改提交到分支。
這樣整個狀態如下:
管理修改
Git管理的不是文件,而是修改。
修改readme.txt
爲如下:
然後git add readme.txt
,並git status
:
再修改 readme.txt
如下:
然後 git commit
一下並查看狀態:
從紅色提示的字可以發現第二次的修改並沒有提交,那麼操作過程其實是這樣的:
第一次修改 --> git add
–> 第二次修改 --> git commit
,所以只add了一次,所以第二次修改並沒有放到暫存區,那麼commit自然也不會把第二次的修改提交上去。
我們用 git diff HEAD --readme.txt
命令來查看工作區和版本庫裏面最新版本的區別。
若我們 add
一下,並再一次 commit
,便可以發現 diff
沒有結果顯示了:
撤銷修改
當我們不注意修改成一個錯誤的內容,當在提交這個修改之前,我們可以很容易地糾正它。你可以刪掉最後一行,手動把文件恢復到上一個版本的狀態。如果用 git status
查看一下:
即我們可以用 git restore file
來丟棄工作區中的修改,但有兩種情況:
readme.txt
從修改之後就沒有被放到暫存區中,撤銷修改就回到和版本庫一模一樣的狀態。readme.txt
已經add
到暫存區中,又作了修改,撤銷修改就回到添加到暫存區後的狀態。
我們先修改一下 readme.txt
:
然後我們不 add
其到暫存區,嘗試一下 restore
一下
然後就發現已經回到修改前的狀態了。
但如果我們 add
這個修改,但慶幸沒有commit,所以我們再 commit
之前查看一下狀態:
可以發現使用 git restore --staged file
可以把暫存區的修改撤銷掉(unstage),重新放回工作區。
然後再使用 git restore file
來撤銷到修改前的工作區狀態
可以發現修改已經沒了。
總結一下:
- 沒有add修改時,使用
git restore file
撤銷修改; - 已經add修改,還未commit修改,使用
git restore --staged file
撤銷修改到原來暫存區狀態,然後再git restore file
撤銷修改到原來工作區的狀態。
刪除文件
我們新建一個 test.txt
文件,然後 add, commit
,接着我們使用 rm test.txt
刪除這個文件(即相當於直接在文件),再來查看一下狀態:
可以發現,工作區和版本庫不一致:因爲已經add並commit了,所以版本庫中有test.txt,而工作區沒有了。
接下來有兩種選擇:
- 確認要刪除,則把版本庫中的也刪除,使用
git rm
刪除並git commit
:
- 刪錯了,因爲版本庫裏還有呢,所以可以使用
git restore file
把誤刪的文件恢復到最新版本(即撤銷刪除這個修改)。