git簡明教程7-撤銷修改

??現在是凌晨兩點,你正在趕一份工作報告,你在readme.txt中添加了一行:

$ cat readme.txt
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
Git tracks changes of files.
My stupid boss still prefers SVN.

??在你準備提交前,你猛然發現了“stupid boss”可能會讓你丟掉這個月的獎金!既然錯誤發現得很及時,就可以很容易地糾正它。你可以刪掉最后一行,手動把文件恢復到上一個版本的狀態。如果用git status查看一下:

$ git status
# On branch master
# Changes not staged for commit:
#      (use "git add..." to update what will be committed)
#      (use "git checkout --..." to discard changes in working directory)
#
#               modified:  readme.txt
#
no changes added to commit (use "git add" and/or "git commit -a")

你可以發現,Git會告訴你,git checkout -- file可以丟棄工作區的修改:

$  git checkout --  readme.txt

??命令git checkout -- readme.txt意思就是,把readme.txt文件在工作區的修改全部撤銷,這里有兩種情況:

一種是readme.txt自修改后還沒有被放到暫存區,現在,撤銷修改就回到和版本庫一模一樣的狀態;
一種是readme.txt已經添加到暫存區后,又作了修改,現在,撤銷修改就回到添加到暫存區后的狀態。

??總之,就是讓這個文件回到最近一次git commit或git add時的狀態。現在,看看readme.txt的文件內容:

$ cat readme.txt
Git is a distributed  version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
Git tracks changes.

文件內容果然復原了。
??git checkout -- file命令中的--很重要,沒有--,就變成了“切換到另一個分支”的命令,我們在后面的分支管理中會再次遇到git checkout命令。
??現在假定是凌晨3點,你不但寫了一些胡話,還git add到暫存區了:

$ cat readme.txt
Gitis a distributed version control system.
Gitis free software distributed under theGPL.
Githas a mutable index called stage.
Gittracks changes of files.
Mystupid boss still prefersSVN.
$ git add readme.txt

??慶幸的是,在commit之前,你發現了這個問題。用git status查看一下,修改只是添加到了暫存區,還沒有提交:

$ git status
# On branch master
# Changes to be committed:
#      (use "git reset HEAD..." to unstage)
#
#           modified:  readme.txt
#

??Git同樣告訴我們,用命令git reset HEAD file可以把暫存區的修改撤銷掉(unstage),重新放回工作區:

$ git reset HEAD readme.txt
Unstaged changes after reset:
M   readme.txt

??git reset命令既可以回退版本,也可以把暫存區的修改回退到工作區。當我們用HEAD時,表示最新的版本。
再用git status查看一下,現在暫存區是干凈的,工作區有修改:

$ git status
# On branch master
# Changes not staged for commit:
#      (use "git add..." to update what will be committed)
#     (use "git checkout --..." to discard changes in working directory)
#
#           modified:  readme.txt
#
no changes added to commit (use "git add" and/or "git commit -a")

還記得如何丟棄工作區的修改嗎?

$ git checkout -- readme.txt
$ git status
# On branch master
nothing to commit (working directory clean)

??現在,假設你不但改錯了東西,還從暫存區提交到了版本庫,怎么辦呢?還記得版本回退一節嗎?可以回退到上一個版本。不過,這是有條件的,就是你還沒有把自己的本地版本庫推送到遠程。還記得Git是分布式版本控制系統嗎?我們后面會講到遠程版本庫,一旦你把“stupid boss”提交推送到遠程版本庫,你就真的慘了……

小結
場景1:當你改亂了工作區某個文件的內容,想直接丟棄工作區的修改時,用命令git checkout -- file。
場景2:當你不但改亂了工作區某個文件的內容,還添加到了暫存區時,想丟棄修改,分兩步,第一步用命令git reset HEAD file,就回到了場景1,第二步按場景1操作。
場景3:已經提交了不合適的修改到版本庫時,想要撤銷本次提交,參考版本回退一節,不過前提是沒有推送到遠程庫。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 安裝Git Git的下載地址:Git官網下載地址 Git本地倉庫和命令 配置用戶 下載完Git后,右鍵會有一個Gi...
    TokyoZ閱讀 4,535評論 1 7
  • 1.git的安裝 1.1 在Windows上安裝Git msysgit是Windows版的Git,從https:/...
    落魂灬閱讀 12,716評論 4 54
  • (預警:因為詳細,所以行文有些長,新手邊看邊操作效果出乎你的預料) 一:Git是什么? Git是目前世界上最先進的...
    axiaochao閱讀 1,951評論 1 8
  • 婚后的某一天,酒紅閑著無聊,便去皇家的花園玩耍。穆華儀在管理財政,最親的元覺姐姐在管理作戰事情,歐陽兩姐妹都去了大...
    白發公主閱讀 199評論 0 0
  • 我們一生有很多時刻,只能自己默不作聲地扛過去。 深夜負能量到懷疑人生,白天卻能像個傻子般笑嘻嘻活著,也許,這就是生...
    喬巖憶夢閱讀 188評論 0 0