章節 16 復原已送交的修改

學習目標

撤銷送交(移除送交)01

有時候您會突然意識到剛剛送交的修改有問題,希望可以移除這次的送交。有好幾種方式可以達到這個需求, 這一章節我們先學習最安全的一種方式。

嚴格來說我們撤銷提交就等於是回到提交前的版本,修改剛剛突然想到的錯誤後在送交。

編輯檔案並送交 02

編輯 hello.rb 檔案如下

檔案: hello.rb

# This is an unwanted but committed change
name = ARGV.first || "World"

puts "Hello, #{name}!"

執行:

git add hello.rb
git commit -m "Oops, we didn't want this commit"

復原已送交的修改03

為了移除已經送交的修改,我們需要在產生一次送交來說明你移除了哪些修改。舉例:您有版本 A -> B -> C -> D ,版本D 是錯誤的版本,你可以使用 revert HEAD 就會回到版本C在產生一次送交在版本D之後。我們先暫稱為版本E 關係會變成 A -> B -> C -> D -> E(C') 但E的內容跟C是相同的,有些書籍會用C'來表示這跟C的內容是一樣的。

執行:

git revert HEAD

到這一步會進入編輯器,您可以編輯預設的 註解 訊息。然後存檔離開。 您將會看到 …

輸出:

$ git revert HEAD --no-edit
[master 9ad227a] Revert "Oops, we didn't want this commit"
 1 files changed, 1 insertions(+), 1 deletions(-)

因為我們要回復的是最後一次的送交,因此我們可以用HEAD來當作版本參數(不使用 hash 編碼)。因此如果您需要回復到歷史記錄上的任何一個版本只需要指定 hash 就可以回復到該版本。

注意: --no-edit 參數如同字面上的意思就是不彈出編輯器。除非您不想編輯註解的訊息直接採用預設值,產生的註解就會像 Revert "回復該版的注解內容"

檢視歷史紀錄 04

檢視記錄會發現您不想提交的內容和修正完的內容都被檔案庫的歷史紀錄記錄起來了。

執行:

git hist

輸出:

$ git hist
* 9ad227a 2012-03-06 | Revert "Oops, we didn't want this commit" (HEAD, master) [Jim Weirich]
* d20d016 2012-03-06 | Oops, we didn't want this commit [Jim Weirich]
* 4054321 2012-03-06 | Added a comment (v1) [Jim Weirich]
* 1b754e9 2012-03-06 | Added a default value (v1-beta) [Jim Weirich]
* 3053491 2012-03-06 | Using ARGV [Jim Weirich]
* 3cbf83b 2012-03-06 | First Commit [Jim Weirich]

這一招可以讓您回復到任何版本(雖然有時候您必須手動解決衝突)。 即使使用任何共用的遠端檔案庫或者分支,這一招都是安全的。

下一步 05

接著,讓我們看看下一招。可以移除送交和歷史紀錄。

目錄