章節 14 復原本機的修改(在暫存之前)
學習目標
- 了解如何回復工作目錄的修改。 git 提供您可以放棄還未追蹤前的所有變動。
切換回 master 分支 01
在繼續之前,請先確認您正簽出 master 最新的版本。
執行:
git checkout master
編輯 hello.rb 02
有些時候,您在本機的工作目錄編輯了一些檔案,這些變更造成了一些錯誤,您想回到剛剛編輯前的狀態(就是上一次或剛剛送交到檔案庫的內容,或者剛複製下來的內容)這個時候您可以使用 git checkout 來放棄您剛剛的編輯。
編輯 hello.rb 在裡面加入一些不好的註解
檔案: hello.rb
# This is a bad comment. We want to revert it. name = ARGV.first || "World" puts "Hello, #{name}!"
檢視檔案庫的狀態 03
首先,觀察工作目錄的狀態。
執行:
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: hello.rb # no changes added to commit (use "git add" and/or "git commit -a")
接著我們會看到hello.rb
檔案已經有了一些變動,但我們還沒把它加入暫存(Staging Area)回應的提示顯示 Changes not staged for commit 意思就是有異動但還沒加到 Staging。
把工作目錄內的檔案回復到修改之前 04
使用 git checkout
指令其實就等同於簽出檔案庫版本的hello.rb
內容。
執行:
git checkout hello.rb git status cat hello.rb
輸出:
$ git checkout hello.rb $ git status # On branch master nothing to commit (working directory clean) $ cat hello.rb # Default is "World" name = ARGV.first || "World" puts "Hello, #{name}!"
現在 git status 指令回應工作目錄中沒有任何變更可以提交,而且剛剛加入的 bad comment 這行註解也不見了。
其他:
上面這個步驟說明了,您可以利用 git checkout 這個指令放棄掉目前的變動讓版本回到跟“目前檔案庫分支”的狀態一樣,所以延伸的一個疑問是:那如果我在這個時候(編輯之後不 Staged)切換分支在 checkout 會發生什麼事情。 答案是: git 不允許您這樣做。當您工作目錄有變更時且沒有 commit 和 add 是不准切換分支。
$ git co greet error: Your local changes to the following files would be overwritten by checkout: README Please, commit your changes or stash them before you can switch branches. Aborting $ git st # 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 # no changes added to commit (use "git add" and/or "git commit -a")