檔案暫存

有時候我們開發到一半的時候,突然有同事跟你說他剛剛上一個 patch,想請你幫忙驗看看

或是你開發新功能到一半的時候,老闆突然跟你說,有發現一個 bug 要立即解決

或是你突然有一個 idea,想要做一個簡單的測試

這時候我們可以將開發到一半的檔案,全部備份到另外一個分支

$ git checkout -b backup            # 新增 backup 分支,並且切換過去
$ git add -A
$ git commit -m "this is backup"    # 提交所有檔案進來
$ git checkout master               # 回到 master 分支做其他事情

這時候在 master 做其他工作,完成後用再把 backup 分支挑回來 master 繼續開發

$ git cherry-pick backup            # 把 backup 的 patch 挑回 master
$ git reset HEAD^                   # 讓 backup 的所儲存的內容,全部回到檔案提交前的狀態
$ git branch -D backup              # 刪除 backup 分支

不過如果檔案改動沒有很大,但是還是要這樣開新 branch 感覺有點麻煩

Git 有提供一個方法可以快速暫存檔案,然後再叫回來


使用 git stash 暫存被修改的檔案

num.txt

11
33
55
77
99

這是原本 num.txt 的檔案內容,接下來我們新增 22, 44, 66

然後我們用 git stash 把他暫存起來

$ git stash             # 暫存目前被修改的檔案
$ git stash list        # 列出所有 stash 紀錄

git_stash.png

Saved working directory and index state WIP on master: 7a165e7 Add 99
HEAD is now at 7a165e7 Add 99

他表示這些是在 7a165e7 開發到一半,被 stash 起來的

這裡的 WIP 的意思是 Working In Progress

而 HEAD 也被移到 patch 7a165e7,也就是 master 的最後一個 patch


使用 git stash list 來查看所有被我們 stash 的內容

$ git stash list
Short Name Description
stash@{0} WIP on master: 7a165e7 Add 99


我們也可以用 git show <short name> 來查看他的改動內容

$ git show stash@{0}

git_show_stash.png


使用 git stash pop 把暫存的檔案叫回來

使用 git stash pop 把檔案叫回來的同時,也被從 stash list 被移除

可以在後面加上 short name,來指定要 pop 出來的 stash 編號

$ git stash pop                 # pop 第一個 stash(stash@{0})
$ git stash pop stash@{n}       # 指定要 pop 出來的 stash 編號

git_stash_pop.png

使用 git stash pop 之前,要先把 git status 清空

stash_pop_failed.png

注意,如果後來又提交了新的 patch,再做 stash pop 有可能會發生 conflict

stash_pop_conflict.png

發生 conflict 的時候,stash 不會被清掉

所以可以 git reset --hard HEAD 還原之後,再重做一次 git stash pop


Update Stream 是你後來提交的部分,Stashed changes 就是 stash 所修改的部分

可以先用 git reset HEAD 取消檔案 both modified 的狀態再來解

cancel_both_modified.png

使用 git stash drop 丟棄暫存的檔案

git stash drop 會丟棄 stash list 裡面的第一個 stash,也就是 stash@{0}

可以在後面加上 short name,指定要丟地的 stash 編號

$ git stash drop                # 丟棄第一個 stash(stash@{0})
$ git stash drop stash@{n}      # 丟棄編號 n 的 stash

git_stash_drop.png

使用 git stash clear 清空 stash list

$ git stash clear


注意事項

git stash 雖然很方便,但是千萬不要過度使用

因為如果到時候 stash list 檔案太多的話,會整個亂掉,很難找出哪一個才是我們要的 stash

如果是重要的功能的話,建議還是另外開一個分支會比較安全

stash 比較適合輕量、檔案改動不大、暫時的狀況

平時盡量保持 stash list 為清空的狀態


本章回顧

  • 使用 git stash 暫存被修改的檔案

  • 使用 git stash list 來查看所有被我們 stash 的內容

  • 使用 git stash pop 把暫存的檔案叫回來

  • 使用 git stash drop 丟棄暫存的檔案

  • 使用 git stash clear 一次清空 stash list 裡面所有的 stash




results matching ""

    No results matching ""