git commit 以後,撤銷操做

搬運自:  git撤銷操做 更多操做參見原地址。

修改最後一次提交

有時候咱們提交完了才發現漏掉了幾個文件沒有加,或者提交信息寫錯了。想要撤消剛纔的提交操做,可使用 --amend 選項從新提交:git

git commit --amend

此命令將使用當前的暫存區域快照提交。若是剛纔提交完沒有做任何改動,直接運行此命令的話,至關於有機會從新編輯提交說明,但將要提交的文件快照和以前的同樣。編輯器

啓動文本編輯器後,會看到上次提交時的說明,編輯它確認沒問題後保存退出,就會使用新的提交說明覆蓋剛纔失誤的提交。spa

若是剛纔提交時忘了暫存某些修改,能夠先補上暫存操做,而後再運行 --amend 提交:code

$ git commit -m 'initial commit'
$ git add forgotten_file
$ git commit --amend

上面的三條命令最終只是產生一個提交,第二個提交命令修正了第一個的提交內容。blog

取消已經暫存的文件

接下來的兩個小節將演示如何取消暫存區域中的文件,以及如何取消工做目錄中已修改的文件。不用擔憂,查看文件狀態的時候就提示了該如何撤消,因此不須要死記硬背。來看下面的例子,有兩個修改過的文件,咱們想要分開提交,但不當心用 git add . 全加到了暫存區域。該如何撤消暫存其中的一個文件呢?其實,git status 的命令輸出已經告訴了咱們該怎麼作:get

$ git add .
$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        modified:   README.txt
        modified:   benchmarks.rb

就在 「Changes to be committed」 下面,括號中有提示,可使用 git reset HEAD <file>... 的方式取消暫存。好吧,咱們來試試取消暫存 benchmarks.rb 文件:it

$ git reset HEAD benchmarks.rb
Unstaged changes after reset:
M       benchmarks.rb
$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        modified:   README.txt

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:   benchmarks.rb

這條命令看起來有些古怪,先別管,能用就行。如今 benchmarks.rb 文件又回到了以前已修改未暫存的狀態。ast

取消對文件的修改

若是以爲剛纔對 benchmarks.rb 的修改徹底沒有必要,該如何取消修改,回到以前的狀態(也就是修改以前的版本)呢?git status 一樣提示了具體的撤消方法,接着上面的例子,如今未暫存區域看起來像這樣:class

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:   benchmarks.rb

在第二個括號中,咱們看到了拋棄文件修改的命令(至少在 Git 1.6.1 以及更高版本中會這樣提示,若是你還在用老版本,咱們強烈建議你升級,以獲取最佳的用戶體驗),讓咱們試試看:用戶體驗

$ git checkout -- benchmarks.rb
$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        modified:   README.txt

能夠看到,該文件已經恢復到修改前的版本。你可能已經意識到了,這條命令有些危險,全部對文件的修改都沒有了,由於咱們剛剛把以前版本的文件複製過來重寫了此文件。因此在用這條命令前,請務必肯定真的再也不須要保留剛纔的修改。若是隻是想回退版本,同時保留剛纔的修改以便未來繼續工做,能夠用下章介紹的 stashing 和分支來處理,應該會更好些。

記住,任何已經提交到 Git 的均可以被恢復。即使在已經刪除的分支中的提交,或者用 --amend 從新改寫的提交,均可以被恢復(關於數據恢復的內容見第九章)。因此,你可能失去的數據,僅限於沒有提交過的,對 Git 來講它們就像從未存在過同樣。

相關文章
相關標籤/搜索