章節 14 復原本機的修改(在暫存之前)

學習目標

切換回 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")

目錄