HOWTO · Git
IntelliJ IDEA 中的 Git Stash 與 Shelve
在本文中,我們將在使用 IntelliJ IDEA 時區分 Git stash 和 Git shelve。
本頁內容
若要將選取的檔案或變更清單存成由 IntelliJ IDEA 管理的變更,適合使用擱置。若希望 Git 將工作目錄中的變更存成 Git 管理的資料,並透過 Git 指令或其他 Git 用戶端存取,則可使用 git stash。兩者都能讓你先切換工作,之後再回來處理;差別在於儲存的變更由不同系統管理。Shelf 是 IntelliJ IDEA 的功能;stash 不會成為專案歷史中的一般提交,而 shelf 也不能取代需要在 Git 層級攜帶或分享變更的方式。
如果只想暫時收起目前工作的其中一部分,擱置會很方便。若希望透過 Git 指令或其他用戶端存取已保存的變更,Git stash 會更合適。兩種方式都不會提交變更。IntelliJ IDEA 的選單名稱和位置可能因版本或介面語言而異,請將下方標籤視為辨識用名稱,不要假設每個版本的版面都完全相同。IntelliJ IDEA 透過 Shelve Changes 動作提供擱置功能;git shelve 並不是 Git 指令。
在 Git 中擱置變更
在 IntelliJ IDEA 中,擱置可以保存選取的變更,留待之後處理,而且不會建立提交。你可以擱置個別檔案或整個變更清單、為 shelf 加上容易辨識的名稱,也可以在需要時重複套用同一個 shelf。這很適合先收起某項工作的變更,同時讓工作目錄中的其他工作保持原樣。
- 開啟 Commit 工具視窗,選取要先收起的檔案或變更清單。
- 開啟快顯選單,選擇
Shelve Changes。 - 確認選取內容,在
Commit Message欄位輸入合適的名稱,再選擇Shelve Changes保存。
Commit 工具中的 Shelve Silently 動作會直接擱置選取的變更,不開啟確認對話框。選取內容已確認無誤時可使用此動作;否則,請先檢查檔案和名稱再保存。
在 Git 中還原擱置的變更
若要還原 shelf,請開啟 Shelf 分頁,選取已擱置的檔案或變更清單,再選擇 Unshelve。在對話框中選擇現有的目標變更清單,或建立新清單,然後確認。若建立新清單,且希望 IntelliJ IDEA 將它設為目前清單,請將其標記為 Active。這個設定會影響之後 IDE 將變更歸入哪個清單;若還原到已經啟用的清單,則不需要再設定一次。
你也可以使用 Unshelve Silently,不開啟對話框,直接將選取的擱置變更移入目前啟用的變更清單。使用前請確認啟用的是預期清單。取消擱置會將保存的變更重新套用到工作目錄;如果這段期間同一檔案已有其他修改,請檢查套用結果。
在 Git 中建立 Stash
Git stash 會記錄相對於 HEAD 的變更。預設情況下,git stash 會保存已追蹤檔案的變更,包括已暫存和未暫存的編輯,並將這些已追蹤檔案還原到已提交的狀態。預設不會包含未追蹤檔案;Git 的 -u 選項會納入未追蹤檔案,-a 則還會納入已忽略的檔案。使用圖形介面對話框時請留意選項,因為可用的控制項和標籤可能不同。
在 IntelliJ IDEA 中,開啟 Git > Uncommitted Changes > Stash Changes。選取操作所顯示的儲存庫目錄和分支,在 Message 欄位輸入簡短說明,再選擇 Create Stash。保存前請確認目標儲存庫和分支;若 IDE 同時開啟多個儲存庫,更要仔細核對。加入清楚的訊息,之後會更容易找到這筆 stash。
擱置和 stash 的選取方式不同:IntelliJ IDEA 的擱置功能可直接選取檔案或變更清單;Git stash 預設處理已追蹤的變更,並提供納入未追蹤或已忽略檔案的選項。兩者都能重新套用,但保存的項目由不同系統管理,應使用對應的流程還原。
在 Git 中套用 Stash
若要在 IntelliJ IDEA 中檢視或還原 stash,請開啟 Git > Uncommitted Changes > Unstash Changes,再選擇儲存庫和分支。選取一筆 stash,然後選擇 View,即可檢查它會套用的檔案和變更。選擇 Apply Stash 會還原變更並保留 stash 項目;選擇 Pop Stash 則會套用變更,並在成功後移除該項目。如果衝突導致 pop 無法完成,請保留 stash,先解決衝突,再移除它。
對話框中的 As new branch 選項會將 stash 套用到新分支,分支名稱取自該欄位。當你想讓保存的工作成為獨立的開發分支時,這個選項會很有用。如果目前檔案與 stash 保存時的基礎狀態不同,套用時可能發生衝突。從乾淨的工作目錄開始最為穩妥,但工作目錄有未提交的變更並不代表一定無法套用;能否套用取決於 Git 是否能合併這些變更而不覆寫本機工作。繼續操作前,請檢查差異並解決任何衝突。