git-wip 是一個能夠不斷幫你進行備份檔案的 shell script 程式,會將你正在進行編輯的檔案, 放置到 wip branch (Work in Process),這樣假如你不小心滅掉了你的 commit, 或是某天想找尋 某次被遺忘的修改,你都可以透過 git-wip 很簡單的完成他。
使用過 git-wip 後,你可以在你的 git 紀錄看到像下圖這樣的資訊
git-wip 需要配合文字編輯器才能擁有他最強大的 備份 功能,我們將在本 篇文章說明 git-wip 的設計以及 vim、emacs 使用 git-wip 的方式。
安裝 git-wip
Gentoo Linux
Gentoo Linux 的使用者可以在 coldnew-overlay 看到我寫的 git-wip ebuild,將他下載到你本地的 overlay 後,用 emerge 安裝即可。
emerge dev-vcs/git-wip
其他 Linux
根據 git-wip 的作者所述,安裝 git-wip 只需要以下兩步就足夠了
git clone git://github.com/bartman/git-wip.git cp git-wip ~/bin
在 vim 下使用 git-wip
想要在 vim 下使用 git-wip,你需要將以下幾行加入到你的 vim 設定檔
augroup git-wip autocmd! autocmd BufWritePost * :silent !git wip save "WIP from vim" --editor -- "%" augroup END
當然,你也可以複製 git-wip 裏面的 vim plugin 到你的 vim plugin 資料夾
cp vim/plugin/git-wip ~/.vim/plugin/git-wip
在 emacs 下使用 git-wip
在 emacs 下我推荐使用 magit 提供的 magit-wip 功能,當你安裝完 magit 後,在你的 .emacs 添加
(require 'magit) (require 'magit-wip) (magit-wip-mode 1) (global-magit-wip-save-mode)
接著還再使用以下方式將 git-wip 加到 git 設定中。
git config --add magit.extension wip-save # or git config --global --add magit.extension wip-save
每次你進行存檔時,git-wip 會自動將你的檔案 commit 到 wip branch 下,若你 有想要回去搜尋的備份,你可以使用後面談到的 git-wip 命令。
git-wip 分支
git-wip 的分支會有 wip/ 作為前綴, 舉例來說,如果你是在 feature branch 進行修改, 則 git-wip 會幫你維護 wip/feature 分支。
當你第一次執行 git-wip 的時候,你會自動幫你擷取所有已經被追蹤或是忽略的檔案,並建立 新的分支。
--- * --- * --- * <-- topic \ * <-- wip/topic
當你使用 git wip save 後 (或是用有提供 git wip 功能的文字編輯器儲存後), 你會注意到 wip/topic 指向了下一次的 commit。
--- * --- * --- * <-- topic \ * \ * <-- wip/topic
當你真正遞交了新的 commit,git wip 會指向你新遞交的 commit, 並且新增加 wip branch。
--- * --- * --- * --- * <-- topic \ \ * * <-- wip/topic \ *
git-wip 命令
若你沒有將 git-wip 綁到你的文字編輯器,你可以使用 git-wip 提供的命令
git wip
建立一個新的 wip/topic 分支
git wip save "description"
用途和 git wip 相同,但是會使用你自訂的 commit message
git wip log
顯示 wip 的紀錄,這個命令相當於
git log --stat wip/$branch $(git merge-base wip/$branch $branch)
使用 git-wip 回復檔案
若要進行回復,首先我們要先找尋我們感興趣的 commit。假設你最近修改的 branch 是 master, 那你應該可以找到 wip/master 的參考(reference), 你也可以用以下命令列出 wip/master 上面有哪些 wip branch。
git reflog show wip/master
git-wip 作者推荐使用以下命令來直接看到每次的修改
git log -g -p wip/master
一旦你選定好了某次的 commit, 你必須要取得這些檔案。注意到我們不是直接切換到 這個分支,我們只是要取得檔案。
git checkout <commit sha1> .
如果你只是要該分支的某個檔案,你只要修正 . 為檔案名稱就好。
都完成後,你可以使用以下命令來察看你取回來的檔案和目前的有什麼差別
git diff --cached