檔案改到一半發現自己失憶,忘記改了哪些東西,只好跟上次 git push 的狀態比較看看了。
正統作法是在 shell 下指令 git diff
,或下 git difftool
用 vimdiff 分割視窗顯示,如下圖,前者在檔案多時容易快速概觀,但單一檔案時還是 vimdiff 方便。
目前看到兩個插件 hypergit、vcscommand 都可以在 Vim 裡直接顯示 diff 結果,前者是 git-diff 型式,後者是 vimdiff 型式(取出舊版內容,再切割視窗作 vimdiff)。我的需求比較接近後者,但又不想裝整支 vcscommand,於是擅自取出原始碼,改寫進 vimrc。
用到的 git 指令
git rev-parse --show-prefix
若指令來自 git 的子目錄,輸出該目錄對 .git 的相對路徑。git log -1 --format=format:%s\ %n%h' -- '%an' -- '%ai\ '('%ar') HEAD
顯示 HEAD 所在的一條 log,輸出格式為 [主題] \n[hash 縮寫] -- [作者] -- [日期] ([相對日期]),
例如 fefe3c8 -- bootleq -- 2010-08-30 18:14:37 +0800 (13 hours ago)git show HEAD:some_path/some_file
顯示 HEAD 中 some_file 的檔案內容。
原始碼
gist: 558647 - [.vimrc] git diff.
功能說明
-
GitDiff 指令
輸入:GitDiff
即可切割視窗顯示目前檔案的 HEAD 版本,可加一個參數指定更早的 HEAD,例如:GitDiff 99
取得 HEAD~99 版本。顯示後會進入 diff 模式。另外可用echo t:git_diff_info
顯示該 commit 的簡易資訊。
註:指令取的 HEAD~ 並無限制「有變更當前檔案」所以可能往前跳好幾個 HEAD 也看不出變化。 -
MyDiffOff 指令
因為預設的:diffoff
指令可能會把本來的 foldmethod 等 diff 相關選項蓋掉,所以改用:MyDiffOff
來關閉 diff。
不過也只是設回我的預設值,沒有真的建立暫存/重設機制。 -
GitDiffOff 指令
進入:GitDiff
後,用:GitDiffOff
快速恢復到原始狀態。(目前只支援從兩視窗的狀態復原)