撤銷修改


天然,你是不會犯錯的。不過如今是凌晨兩點,你正在趕一份工做報告,你在readme.txt中添加了一行:git

$ 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查看一下:spa

$ git status# On branch master# Changes not staged for commit:#   (use "git add <file>..." to update what will be committed)#   (use "git checkout -- <file>..." 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文件在工做區的修改所有撤銷,這裏有兩種狀況:code

一種是readme.txt自修改後尚未被放到暫存區,如今,撤銷修改就回到和版本庫如出一轍的狀態;get

一種是readme.txt已經添加到暫存區後,又做了修改,如今,撤銷修改就回到添加到暫存區後的狀態。it

總之,就是讓這個文件回到最近一次git commitgit add時的狀態。io

如今,看看readme.txt的文件內容:table

$ 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.

文件內容果真復原了。ast

git checkout -- file命令中的--很重要,沒有--,就變成了「切換到另外一個分支」的命令,咱們在後面的分支管理中會再次遇到git checkout命令。

如今假定是凌晨3點,你不但寫了一些胡話,還git add到暫存區了:

$ cat readme.txtGit 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.$ git add readme.txt

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

$ git status# On branch master# Changes to be committed:#   (use "git reset HEAD <file>..." 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 <file>..." to update what will be committed)#   (use "git checkout -- <file>..." 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 masternothing to commit (working directory clean)

整個世界終於清靜了!

如今,假設你不但改錯了東西,還從暫存區提交到了版本庫,怎麼辦呢?還記得版本回退一節嗎?能夠回退到上一個版本。不過,這是有條件的,就是你尚未把本身的本地版本庫推送到遠程。還記得Git是分佈式版本控制系統嗎?咱們後面會講到遠程版本庫,一旦你把「stupid boss」提交推送到遠程版本庫,你就真的慘了……

小結

又到了小結時間。

場景1:當你改亂了工做區某個文件的內容,想直接丟棄工做區的修改時,用命令git checkout -- file

場景2:當你不但改亂了工做區某個文件的內容,還添加到了暫存區時,想丟棄修改,分兩步,第一步用命令git reset HEAD file,就回到了場景1,第二步按場景1操做。

場景3:已經提交了不合適的修改到版本庫時,想要撤銷本次提交,參考版本回退一節,不過前提是沒有推送到遠程庫。

相關文章
相關標籤/搜索