【學了就忘】Git操作 — 25.撤銷操作(一)

1、撤銷操作說明

我們在使用Git版本管理時,往往需要撤銷某些操作。比如說我們想將某個修改後的文件撤銷到上一個版本,或者是想撤銷某次多餘的提交,都要用到Git的撤銷操作,因此撤銷操作在平時使用中還是比較多的。

本文介紹幾種,對於已修改過的文件,需要進行撤銷操作,根據修改文件出現的位置,可以分爲三種情況:

  1. 僅僅是工作區中內容進行了修改,還未添加到暫存區。
  2. 文件已經添加到暫存區,但是還未提交到本地版本庫。
  3. 文件已經提交到本地版本庫。

前兩種可以叫撤銷操作,後面一種叫回退版本,不同的情況具有不同的撤銷方式。

下面就撤銷操作給出詳細的解釋。

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 switchgit 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)總結

  1. git restore <file>...git checkout -- <file>...命令原理:

    這裏有兩種情況:

    一種是test.txt自修改後還沒有被放到暫存區,現在的撤銷修改就回到和版本庫一模一樣的狀態;

    一種是test.txt已經添加到暫存區後,又作了修改,現在的撤銷修改就回到添加到暫存區後的狀態。

  2. 撤銷命令是一個危險的命令,這個很重要,你對該文件做的任何修改都會消失。原理是你拷貝了該文件在暫存區或者本地版本庫中的副本,來覆蓋工作區的該文件。

    即:工作區的文件變化一旦被撤銷,就無法找回了,除非你確實不想要這個文件了。

所以我的理解:撤銷命令實際的操作是重置(原文件覆蓋),而實際的效果上是撤回。

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