HOWTO · Git
撤銷 Git 快取
在本文中,我們將瞭解如何對倉庫進行更改和儲存。Git 允許你在本地儲存更改並在需要時將它們推送到伺服器。
本頁內容
Git stash 會儲存尚未提交的變更,讓你能回到乾淨的工作樹。若要還原已儲存的工作,可選擇 git stash pop:它會套用最新的 stash,並在成功套用後移除該項目;也可以選擇 git stash apply,套用變更但保留該項目。若想先檢查還原的檔案再移除 stash,請先套用,確認後再 drop。下方範例會使用 stash@{n} 指定 stash 清單中的特定項目。
選擇符合需求的命令
使用 git stash list 查看已儲存的項目。最新項目通常是 stash@{0},接著是 stash@{1},再往後則是更舊的項目。選擇前請先閱讀項目描述;編號代表它在目前清單中的位置,因此新增或移除項目後,編號可能會改變。
- 還原最新項目,並在成功套用後移除:
git stash pop。 - 還原項目,但保留以供日後使用:
git stash apply。 - 不套用變更,直接移除項目:
git stash drop。
stash 儲存的是工作變更,不是分支上的新提交。預設情況下,套用 stash 會將變更還原到工作樹,但不會還原原本的暫存狀態;使用 git stash apply --index 則可嘗試一併還原索引。之後請查看 git status,確認還原了哪些內容。如果不確定是否還會需要這份已儲存的狀態,請先使用 apply;檢查結果後再決定是否移除。
執行以下範例:
本節中的程式碼以及顯示的標籤或輸出仍為英文。
import subprocess
import tempfile
from pathlib import Path
with tempfile.TemporaryDirectory() as temp_dir:
repo = Path(temp_dir)
def git(*args):
subprocess.run(
["git", *args], cwd=repo, check=True,
stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL,
)
git("init", "-q")
git("config", "user.name", "Example User")
git("config", "user.email", "example@example.com")
note = repo / "note.txt"
note.write_text("original\n", encoding="utf-8")
git("add", "note.txt")
git("commit", "-q", "-m", "Add note")
note.write_text("restored change\n", encoding="utf-8")
git("stash", "push", "-m", "demo", "-q")
git("stash", "pop", "-q")
print(note.read_text(encoding="utf-8").strip())
預期輸出:
restored change
使用 git stash pop 還原並移除最新的 stash
如果你想還原最新儲存的變更,並同時移除 stash 項目,請執行 git stash pop。Git 會套用清單最上方的項目,通常是 stash@{0}。成功套用後,Git 會移除該項目。還原的檔案仍會留在工作樹中;移除 stash 不會丟棄已套用的變更。
使用 pop 前,請確認目前的工作樹適合接收已儲存的變更。之後查看 git status,並檢查受影響的檔案。如果變更未如預期出現,請使用 git stash list 確認該項目是否仍在清單中。若 stash 無法順利套用,通常會保留下來,讓你能解決衝突,並在不失去已儲存副本的情況下再試一次。
使用 git stash apply 還原並保留 stash
如果你想取回變更,同時保留已儲存的項目以供日後使用,請使用 git stash apply。若要套用最新項目,請執行 git stash apply。若要選擇較舊的項目,請加上選取器,例如 git stash apply stash@{2}。當你想比較結果,或可能需要稍後在另一個工作樹中還原同一份已儲存的工作時,這種方式很有用。
套用後,請查看 git status 並檢查檔案,再繼續進行其他變更。無論套用結果是否乾淨,apply 都不會移除 stash。確認工作已完整還原,且不再需要該已儲存項目後,便可依下文說明使用 git stash drop 將它移除。
還原後使用 git stash drop 移除 stash
git stash drop 會從 stash 清單移除項目,但不會套用它。只有在確定要丟棄該已儲存副本時才使用此命令。不指定選取器時,它會移除最新的項目。若要指定項目,請提供選取器,例如 git stash drop stash@{2}。
若要謹慎地先還原再移除,請先使用所需的選取器執行 git stash apply,接著檢查檔案並查看 git status。確認所需變更已還原,而且不再需要 stash 副本後,再使用相同的選取器執行 git stash drop。執行 drop 前,請立即使用 git stash list 檢查清單:移除較早的項目可能會改變其他項目的編號。若改為執行 git stash pop,Git 會在成功套用時一併移除該項目。
選取 stash 並處理衝突
使用 git stash list 列出項目,然後選取預定使用的 stash@{n}。套用前,你可以使用 git stash show -p stash@{2} 檢視已儲存的修補內容,並將 2 替換為清單中顯示的項目編號。項目描述和修補內容有助於區分相似的 stash;執行操作前,仍應對照目前的清單確認選取器。
stash 可能會與目前分支上的變更發生衝突。發生時,Git 會回報受影響的檔案,並留下待你解決的衝突標記。開啟每個回報的檔案,選擇並整合所需變更,移除衝突標記,然後查看 git status 和產生的差異。將還原視為完成前,請依照專案慣例執行檢查。發生衝突後,不要假設 pop 已移除該項目:如果 stash 無法順利套用,Git 會保留它。工作樹中的衝突解決後,請檢查結果並使用 git stash list 查看清單;只有在不再需要該項目時才將它 drop。