修正簡單錯誤

已完成

有時會發生一些問題。 您可能忘了新增檔案,或者您可能不小心新增檔案。 可能是您在最新的認可中犯了拼寫錯誤,或者您認可了一些您不打算執行的動作。 也許您不小心刪除檔案。

Git 可讓您無所畏懼地進行變更,因為它一律提供回到您先前狀態的方法。 您甚至可以變更 Git 的認可歷程記錄,只要您僅變更尚未共用的認可即可。

修改認可:--amend 旗標

在上一個練習中,您已更新 index.html 檔案以修改樣式表的路徑。 您應該已新增下列陳述式:

<link rel="stylesheet" href="CSS/site.css">

假設您發現在輸入陳述式時發生錯誤。 您不是將資料夾路徑指定為 CSS,而是輸入了 CS

<link rel="stylesheet" href="CS/site.css">

當您在瀏覽器中重新整理頁面時,您會注意到您的 CSS 樣式表未套用。 調查之後,您發現輸入的路徑值錯誤。

因此,您使用樣式表的正確路徑更新 index.html。 此時,您可以直接認可 index.html 的修正版,但相反地,您想要將其放在與原始版本相同的認可中。 git commit--amend 選項可讓您變更歷程記錄 (以及多久獲得一次變更歷程記錄的機會)。

git commit --amend --no-edit

--no-edit 選項會指示 Git 進行變更,而不會變更認可訊息。 您也可以使用 --amend 編輯認可訊息、新增認可中意外遺漏的檔案,或刪除錯誤新增的檔案。

注意

變更歷程記錄的功能是 Git 最強大的功能之一。 如同大部分的強大工具,使用時請務必謹慎。 特別是,變更任何已與其他開發人員共用的認可,或是變更任何已在共用存放庫 (例如 GitHub) 中發佈的認可,都不是個好主意。

復原已刪除的檔案:git checkout

假設您對原始程式碼檔案所做的變更中斷了整個專案,因此想要還原成該檔案的先前版本。 或者,也許您不小心刪除了一個檔案。 即使目前的版本已不存在,Git 仍可讓您輕鬆地擷取較舊的版本。 在此情況下,git checkout 命令會是您的得力助手。

git checkout 有多個用途,但在下一個練習中,我們將使用此命令復原已刪除的檔案。 git checkout 會更新工作樹狀結構中的檔案,以符合索引或指定樹狀結構中的版本。

如果您不小心刪除了某個檔案,則可以使用此命令將索引中的版本復原到工作樹狀結構中,藉此復原該檔案:

git checkout -- <file_name>

您也可以從先前的認可 (通常是另一個分支的前端) 簽出檔案,但預設會從索引取得檔案。 引數清單中的 -- 用於將認可與檔案路徑清單分隔。 在此案例中並不一定要使用它,但是如果您有一個名為 <file_name> 的分支 (也許是因為那是該分支中正在處理的檔案名稱),則 -- 可以防止使用者混淆 Git。

稍後,您將了解您也可以使用 checkout 切換分支。

復原檔案:git reset

您也可以使用 git rm 刪除檔案。 此命令不僅會刪除磁碟上的檔案,還會讓 Git 將檔案刪除記錄在索引中。

因此,如果您執行此命令:

git rm index.html
git checkout -- index.html

Git 不會愉快地還原 index.html! 相反地,您會收到一個錯誤,如下列範例所示:

error: pathspec 'index.html' did not match any file(s) known to git.

若要復原 index.html,我們必須使用不同的技術:git reset。 您可以使用 git reset 取消暫存變更。

您可以使用下列兩個命令復原 index.html

git reset HEAD index.html
git checkout -- index.html

這裡,git reset 會取消暫存 Git 的檔案刪除操作。 此命令會將檔案復原到索引,但仍會刪除磁碟上的檔案。 然後,您可以使用 git checkout,將其從索引還原到磁碟。

以下是為 Git 使用者提供的「新提示」。 許多 VCS 都將檔案設為唯讀,以確保一次只有一個人可以進行變更;使用者會使用無關的 checkout 命令,以取得檔案的可寫入版本。 他們還使用 checkin 進行類似於 Git 對 addcommitpush 組合的操作。 這對剛開始使用 Git 的人偶爾會造成混淆。

還原認可:git revert

使用 Git 修正錯誤時要知道的最後一個重要的命令是 git revertgit checkout 僅適用於復原變更位於索引中的情況。 在您認可變更之後,您必須使用不同的策略加以復原。 在此情況下,我們可以使用 git revert 還原先前的認可。 其運作方式是讓「另一個」認可取消第一個認可。

我們可以使用 git revert HEAD 進行與上一個認可完全「相反」的認可、復原先前的認可,同時保留所有歷程記錄。 命令的 HEAD 部分只會告知 Git,我們只想要「復原」最後一個認可。

除此之外,您也可以使用 git reset 命令移除最近的認可:

git reset --hard HEAD^

Git 提供數種類型的重設。 預設值為 --mixed,這會重設索引,但不會重設工作樹狀結構;如果您指定不同的認可,也會移動 HEAD。 --soft 選項僅會移動 HEAD,而索引與工作樹狀結構則會保持不變。 此選項會將您所有的變更保留為「要認可的變更」,如同 git status 所表示。 --hard 會重設索引和工作樹狀結構的變更,以符合指定的認可;您對追蹤檔案所做的任何變更都將被捨棄。