Git學習筆記——4、未提交前文件的回退操作

本節按使用場景來總結說明,總結文件未提交前的常見回退情形


1. 新建文件暫存後撤銷

在項目目錄下新建version.md文件,將文件暫存,狀態如下:
在這裏插入圖片描述
可以看到version.md是new file的狀態。通過命令行的輸出,我們知道可以使用
git reset HEAD + 文件名來撤銷剛纔的暫存:
在這裏插入圖片描述
OK,這樣回到了我們暫存version.md之前的狀態


2. 已提交過的文件的回退

已提交過的文件是指,該文件已進行過git commit操作,或者說該文件包含在一次commit之中,而不是new file狀態

修改list.md文件,此時不暫存文件,
在這裏插入圖片描述
先使用git status查看狀態如下:
在這裏插入圖片描述
命令行輸出告訴我們,可以使用git checkout -- 文件名 來放棄剛纔的修改,執行命令如下:在這裏插入圖片描述
回到編輯器,可以看到剛纔修改的內容已撤銷了:
在這裏插入圖片描述
接下來,我們繼續修改list.md文件,然後緊接着暫存。此時可使用git reset HEAD + 文件名讓文件回到未暫存時的狀態:
在這裏插入圖片描述
執行git reset HEAD list.md後,可以看到文件狀態從已暫存轉換到了未暫存
(黃色—>紅色):
在這裏插入圖片描述
之後,我們可以繼續修改,或者使用剛剛說過的checkout命令來放棄更改了。

總結:git reset HEAD用來撤銷暫存,git checkout用來撤銷修改,如果文件修改後已暫存,需要先撤銷暫存,再撤銷修改,一步步的來。


3. 未commit過的目錄撤回的小疑問

對於一個尚未進行過任何提交的目錄,已暫存文件的撤回,和1中描述的有所不同

新建一個blank工程,git init初始化完成,在其中新建1.md文件,暫存,查看文件狀態:
在這裏插入圖片描述
這次讓我們使用git rm 命令來取消暫存了
在這裏插入圖片描述
回想到,1小節中提示的命令是git reset HEAD,那如果此時我們仍然使用git reset是否可以呢?
在這裏插入圖片描述
提示我們HEAD是有歧義的,讓我們使用 – 來隔開文件名,執行如下。
在這裏插入圖片描述
原來效果和使用rm命令是一樣的。

但是爲什麼之前reset時直接後跟文件名,不需要使用 – 呢?這裏推測應該是和工作目錄未發生過commit有關,說明commit至少會改變HEAD的狀態,因爲沒有提交,所以HEAD的指向不定?有待研究。。。。


4. 文件的移除

1、直接手動刪除文件並提交

刪除工程目錄下的version.md文件,git status 查看:在這裏插入圖片描述
可以看到,直接刪除文件,相當於對文件做了一次修改,此時通過暫存 + 提交可以生效,通過checkout可以回退。

2、通過git rm 命令刪除

使用git rm 命令,有兩種方式:

  1. 使用 --cached 參數,僅從index移除,保留文件,執行後,文件仍會存在於工作目錄下,commit後,version.md仍會留存在工作目錄(可以叫做軟刪除)
    在這裏插入圖片描述
    此時,提示中的兩種操作,都可以撤回移除動作,將version.md 回到“未修改”狀態。

  2. 使用-f 參數,強制刪除,執行後,文件會從工作目錄移除,相當於手動刪除文件 + 執行git add兩步操作
    在這裏插入圖片描述
    此時,直接commit可以提交生效,通過reset HEAD -> checkeout,則可以撤回。


5、暫存後又添加了內容

如果我們暫存後,又改了文件內容了,此時的回退,文件狀態應該怎麼變動?

我們先修改version.md文件,添加一行內容,並暫存
在這裏插入圖片描述
在這裏插入圖片描述
此時不提交,繼續在version.md添加一行內容:
在這裏插入圖片描述
查看文件狀態,發現此時既是version.md已暫存狀態,又是已修改狀態。
在這裏插入圖片描述
此時回退,有以下兩種情況:

  1. 執行git checkout – version.md,會撤銷最近一次的修改,使文件恢復到最近的暫存狀態,也就是說,version 2 這一行會被撤銷!version 1則會被保留,仍是已暫存狀態。
    在這裏插入圖片描述
  2. 執行git reset HEAD version.md,會撤銷最近的暫存,也就是說,version 1這一行會被撤銷暫存,同時會和version 2 這一行,一起變爲已修改的部分。看圖:
    在這裏插入圖片描述
    在這裏插入圖片描述
    如果已熟悉暫存和修改的,上面說的應該很好理解吧。

總結:在文件提交更改之前,會處於“已修改” 或 “已暫存” 的狀態下,需要準確瞭解當前文件的狀態,方能準確的處理回退的動作。

文件已提交過了,如何回退?甚至我想回退到之前的某一次的狀態,該怎麼辦呢?下篇繼續。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章