1、撤銷操作說明
我們在使用Git版本管理時,往往需要撤銷某些操作。比如說我們想將某個修改後的文件撤銷到上一個版本,或者是想撤銷某次多餘的提交,都要用到Git的撤銷操作,因此撤銷操作在平時使用中還是比較多的。
本文介紹幾種,對於已修改過的文件,需要進行撤銷操作,根據修改文件出現的位置,可以分爲三種情況:
- 僅僅是工作區中內容進行了修改,還未添加到暫存區。
- 文件已經添加到暫存區,但是還未提交到本地版本庫。
- 文件已經提交到本地版本庫。
前兩種可以叫撤銷操作,後面一種叫回退版本,不同的情況具有不同的撤銷方式。
下面就撤銷操作給出詳細的解釋。
2、撤銷工作區中文件的修改
如果工作區的某個文件被改亂了,但還沒有提交,可以用git restore
或者git checkout
命令找回本次修改之前的文件。
前提:test.txt
文件已在本地版本庫中。
1)修改test.txt
文件中的內容
# 1.查看test.txt文件內容
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ cat test.txt
hello git
# 2.進行修改內容
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ echo "hello git v2" >> test.txt
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ cat test.txt
hello git
hello git v2
2)查看工作目錄中文件的狀態
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")
好好的說明一下這些提示信息
-
On branch master
:當前工作在主分支上。 -
Changes not staged for commit:
:暫存區中沒有可提交的變化。 -
git add <file>...
:可使用該命令把更新添加到暫存區。 -
git restore <file>...
:丟棄工作區的修改。同git checkout -- <file>...
命令一樣。 -
no changes added to commit (use "git add" and/or "git commit -a")
:可以使用git add
命令添加到暫存區,也可以使用git commit -a
命令直接提交到本地版本庫。
Git的命令提示是非常詳細的,我們按照提示信息操作就可以。
說明:
老版本Git會提示:(use "git checkout -- <file>..." to discard changes in working directory)
新版本Git會提示:(use "git restore <file>..." to discard changes in working directory)
git restore <file>...
和git checkout -- <file>...
命令:
git checkout
這個命令承擔了太多職責,既被用來切換分支,又被用來恢復工作區文件,對用戶造成了很大的認知負擔。-
Git社區發佈了Git的2.23版本中,有一個特性非常引人矚目,就是引入了兩個新命令
git switch
和git restore
,用以替代現在的git checkout
。即:Git2.23版本開始,
git restore <file>...
命令可代替git checkout -- <file>...
命令文件恢復的工作。
3)撤銷工作區中test.txt
文件的修改
# 1.使用git restore 命令撤銷工作區中的操作
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
nothing to commit, working tree clean
# 2.再次修改test.txt文件
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ echo "hello git v3" >> 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")
# 使用git checkout命令撤銷工作區中的操作
# 撤銷操作固定寫法“git checkout -- 文件”
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ git checkout -- test.txt
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ git status
On branch master
nothing to commit, working tree clean
說明:
git checkout -- file
命令中的--
很重要,沒有--
,就變成了“切換到另一個分支”的命令,我們在後面的分支管理中會再次遇到git checkout
命令。
4)總結
-
git restore <file>...
和git checkout -- <file>...
命令原理:這裏有兩種情況:
一種是
test.txt
自修改後還沒有被放到暫存區,現在的撤銷修改就回到和版本庫一模一樣的狀態;一種是
test.txt
已經添加到暫存區後,又作了修改,現在的撤銷修改就回到添加到暫存區後的狀態。 -
撤銷命令是一個危險的命令,這個很重要,你對該文件做的任何修改都會消失。原理是你拷貝了該文件在暫存區或者本地版本庫中的副本,來覆蓋工作區的該文件。
即:工作區的文件變化一旦被撤銷,就無法找回了,除非你確實不想要這個文件了。
所以我的理解:撤銷命令實際的操作是重置(原文件覆蓋),而實際的效果上是撤回。