撤消操作

2018-07-10 17:00 更新

撤消操作

任何時(shí)候,你都有可能需要撤消剛才所做的某些操作。接下來(lái),我們會(huì)介紹一些基本的撤消操作相關(guān)的命令。請(qǐng)注意,有些撤銷操作是不可逆的,所以請(qǐng)務(wù)必謹(jǐn)慎小心,一旦失誤,就有可能丟失部分工作成果。

修改最后一次提交

有時(shí)候我們提交完了才發(fā)現(xiàn)漏掉了幾個(gè)文件沒(méi)有加,或者提交信息寫錯(cuò)了。想要撤消剛才的提交操作,可以使用 --amend 選項(xiàng)重新提交:

$ git commit --amend

此命令將使用當(dāng)前的暫存區(qū)域快照提交。如果剛才提交完沒(méi)有作任何改動(dòng),直接運(yùn)行此命令的話,相當(dāng)于有機(jī)會(huì)重新編輯提交說(shuō)明,但將要提交的文件快照和之前的一樣。

啟動(dòng)文本編輯器后,會(huì)看到上次提交時(shí)的說(shuō)明,編輯它確認(rèn)沒(méi)問(wèn)題后保存退出,就會(huì)使用新的提交說(shuō)明覆蓋剛才失誤的提交。

如果剛才提交時(shí)忘了暫存某些修改,可以先補(bǔ)上暫存操作,然后再運(yùn)行 --amend 提交:

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

上面的三條命令最終只是產(chǎn)生一個(gè)提交,第二個(gè)提交命令修正了第一個(gè)的提交內(nèi)容。

取消已經(jīng)暫存的文件

接下來(lái)的兩個(gè)小節(jié)將演示如何取消暫存區(qū)域中的文件,以及如何取消工作目錄中已修改的文件。不用擔(dān)心,查看文件狀態(tài)的時(shí)候就提示了該如何撤消,所以不需要死記硬背。來(lái)看下面的例子,有兩個(gè)修改過(guò)的文件,我們想要分開提交,但不小心用 git add . 全加到了暫存區(qū)域。該如何撤消暫存其中的一個(gè)文件呢?其實(shí),git status 的命令輸出已經(jīng)告訴了我們?cè)撛趺醋觯?/p>

$ 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” 下面,括號(hào)中有提示,可以使用 git reset HEAD <file>... 的方式取消暫存。好吧,我們來(lái)試試取消暫存 benchmarks.rb 文件:

$ 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

這條命令看起來(lái)有些古怪,先別管,能用就行?,F(xiàn)在 benchmarks.rb 文件又回到了之前已修改未暫存的狀態(tài)。

取消對(duì)文件的修改

如果覺(jué)得剛才對(duì) benchmarks.rb 的修改完全沒(méi)有必要,該如何取消修改,回到之前的狀態(tài)(也就是修改之前的版本)呢?git status 同樣提示了具體的撤消方法,接著上面的例子,現(xiàn)在未暫存區(qū)域看起來(lái)像這樣:

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

在第二個(gè)括號(hào)中,我們看到了拋棄文件修改的命令(至少在 Git 1.6.1 以及更高版本中會(huì)這樣提示,如果你還在用老版本,我們強(qiáng)烈建議你升級(jí),以獲取最佳的用戶體驗(yàn)),讓我們?cè)囋嚳矗?/p>

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

        modified:   README.txt

可以看到,該文件已經(jīng)恢復(fù)到修改前的版本。你可能已經(jīng)意識(shí)到了,這條命令有些危險(xiǎn),所有對(duì)文件的修改都沒(méi)有了,因?yàn)槲覀儎倓偘阎鞍姹镜奈募?fù)制過(guò)來(lái)重寫了此文件。所以在用這條命令前,請(qǐng)務(wù)必確定真的不再需要保留剛才的修改。如果只是想回退版本,同時(shí)保留剛才的修改以便將來(lái)繼續(xù)工作,可以用下章介紹的 stashing 和分支來(lái)處理,應(yīng)該會(huì)更好些。

記住,任何已經(jīng)提交到 Git 的都可以被恢復(fù)。即便在已經(jīng)刪除的分支中的提交,或者用 --amend 重新改寫的提交,都可以被恢復(fù)(關(guān)于數(shù)據(jù)恢復(fù)的內(nèi)容見(jiàn)第九章)。所以,你可能失去的數(shù)據(jù),僅限于沒(méi)有提交過(guò)的,對(duì) Git 來(lái)說(shuō)它們就像從未存在過(guò)一樣。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)