# Outline
一、前言
二、概念
# TL;DR
git-stash
是一個我很常用到的功能,它能很方便的將我手頭上的進度暫存起來。通常會在手頭上的程式開發到一半,還不足以成為一個 commit,卻被夥伴請求其他事情時用到,可能是幫忙夥伴測試、或是找錯等等。每次遇到這類情境,我就會先將當前的變動都給 git stash
起來,等事情告一段落,再將這些暫存給套用回來。事實上,stash
這個詞本上就是貯藏的意思呢!
那究竟這麼好用的貯藏功能在 Git 中是怎麼運作的呢?就讓我們來研究看看吧!
在 Git 中,任何 Stash 的資訊都會被儲存在 .git/logs/refs
這個純文字檔案中,也就是以 reflogs 的形式儲存。另外也會將最近一次 stash 以類似其他 Git Reference 的形式將 SHA-1 值存在 .git/logs/refs
中。
既然有 SHA-1 值,那 Stash 本身其實就是一個 Git Object。若去查找該 Git Object 的內容,就會發現 Git Stash 就是一個 Commit Object。
Stash 不僅是一個單純的 Commit Object,還是像 Merge Commit 一樣擁有多個 Parents Commits!
正常的 Stash 就會有兩個 Parents Commit,分別指向當初執行 git-stash
的 Commit,以及指向另一個紀錄當時 index 的 Commit Object。
若是在 git-stash
時有包含 untracked 或是 ignore 的檔案,那麼就會有另一個 Parents Commit 指向記錄這些檔案的 Commit Object。