3括授、撤銷暫存區(qū)中文件的修改
如果已經把修改的個文件添加到暫存區(qū),可以用下面的命令撤銷。
還是以上面test.txt
文件為例荚虚。
1)修改test.txt
文件并存儲到暫存區(qū)
# 1.修改文件
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ git status
On branch master
nothing to commit, working tree clean
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ echo "hello git v4" >> test.txt
# 2.添加文件到暫存區(qū)
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ git add test.txt
warning: LF will be replaced by CRLF in test.txt.
The file will have its original line endings in your working directory
# 3.查看工作目錄中文件狀態(tài)
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ git status
On branch master
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
modified: test.txt
說明:
-
Changes to be committed:
:表示暫存區(qū)中所做的更改如下薛夜,可以提交。 -
git restore --staged <file>...
:該命令表示取消暫存版述,把暫存區(qū)中的文件撤回到工作區(qū)梯澜。
Tips:
老版本Git會提示:(use "git reset HEAD <file>..." to unstage)
新版本Git會提示:(use "git restore --staged <file>..." to unstage)
和上面同理:
- 早期的Git中
git checkout
命令承載了分支操作和文件恢復的部分功能,有點復雜渴析,并且難以使用和學習晚伙,所以社區(qū)解決將這兩部分功能拆分開,Git 2.23.0版本中中引入了兩個新的命令git switch
和git restore
俭茧。 - 早期的Git中咆疗,文件恢復涉及到兩個命令,一個是
git checkout
命令母债,一個是git reset
命令午磁。git reset
命令除了重置分支之外,還提供了恢復文件的能力毡们。 - 而新的
git restore
命令迅皇,代替了checkout
命令和reset
命令(但是這兩個命令還可以進行文件恢復),專門用來恢復暫存區(qū)和工作區(qū)的文件漏隐。
2)撤銷暫存區(qū)中test.txt
文件的修改
[1]使用git restore --staged
命令撤銷暫存區(qū)中文件的修改喧半。
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ git restore --staged test.txt
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (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: test.txt
no changes added to commit (use "git add" and/or "git commit -a")
(重點)我們可以看到,test.txt
文件從暫存區(qū)中撤銷到工作區(qū)中青责,但是不會撤銷工作區(qū)中文件的更改挺据。
[2]使用git restore
命令,不帶--staged
參數脖隶,撤銷暫存區(qū)中文件的修改扁耐。
# 1.文件添加到暫存區(qū)中
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ git add test.txt
warning: LF will be replaced by CRLF in test.txt.
The file will have its original line endings in your working directory
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ git status
On branch master
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
modified: test.txt
# 2.使用`git restore`命令,撤銷暫存區(qū)中文件的修改
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ git restore test.txt
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ git status
On branch master
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
modified: test.txt
我們可以看到产阱,工作目錄中test.txt
文件狀態(tài)沒有改變婉称,所以要撤銷暫存區(qū)中文件的修改,必須加上--staged
參數构蹬。
這是為什么呢王暗?(個人理解)
因為git restore
命令,不帶--staged
參數庄敛,背后的執(zhí)行邏輯是俗壹,把暫存中的test.txt
文件復制一份,覆蓋掉工作區(qū)的test.txt
文件藻烤,但是這樣就形成了test.txt
文件在工作區(qū)和暫存區(qū)一樣的狀態(tài)绷雏,所以工作區(qū)和暫存區(qū)的狀態(tài)也一樣头滔。這也就是上面執(zhí)行完git restore test.txt
命令,在工作目錄test.txt
文件的狀態(tài)涎显,沒有變化的原因坤检。
[3]使用git reset HEAD <file>...
命令撤銷暫存區(qū)中文件的修改。
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ git reset HEAD test.txt
Unstaged changes after reset: # 表示重置后文件未被跟蹤
M test.txt # M:應該是modified的意思吧
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (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: test.txt
no changes added to commit (use "git add" and/or "git commit -a")
我們看到git reset HEAD <file>...
命令的執(zhí)行效果和git restore --staged
命令執(zhí)行的效果是一樣的期吓,這里就不多解釋了早歇。
之后要在進行撤銷工作區(qū)中文件的修改,就和上一步一樣了膘婶。
4缺前、總結
前面通過詳細的步驟蛀醉,分別演示了從工作區(qū)和暫存區(qū)做撤銷修改的操作悬襟。
下面我們總結一下,方便我們對前面知識的理解拯刁。
-
git checkout
命令脊岳,既可以用來切換分支,又可以用來恢復工作區(qū)文件垛玻。恢復文件命令:
git checkout -- 文件
-
git reset
命令割捅,除了能夠重置分支之外,還提供了恢復文件的能力帚桩。恢復文件命令:
git reset HEAD 文件
-
Git 2.23.0版本中亿驾,提供了
git restore
命令,代替了git checkout
命令和git reset
命令的恢復文件功能账嚎。(但上面兩個命令也能恢復文件)修改的文件只在工作區(qū)莫瞬,沒有添加到暫存區(qū)中,使用
git restore 文件
命令郭蕉。修改的文件已經添加到暫存區(qū)疼邀,但還沒有提交,使用
git restore --staged 文件
命令召锈。
在來詳細說明一下git restore
命令:
這里有兩種情況:
一種是test.txt
自修改后還沒有被放到暫存區(qū)旁振,現(xiàn)在的撤銷修改就回到和版本庫一模一樣的狀態(tài);
一種是test.txt
已經添加到暫存區(qū)后涨岁,又作了修改拐袜,現(xiàn)在的撤銷修改就回到添加到暫存區(qū)后的狀態(tài)。
而git restore --staged
命令:
用于已經把修改的文件添加到暫存區(qū)梢薪,沒有被修改蹬铺,但還未提交。這時執(zhí)行該命令沮尿,直接撤銷暫存區(qū)總存儲的修改丛塌,將文件恢復到工作區(qū)去较解。