2013-01-22 37 views
16

我可以很容易地找出自從上次提交git diff HEAD^ -- <filename>以來,文件發生了什麼變化,但是有一個相同的速記查看特定文件的差異,因爲它是上次提交的,不管從那以後發生了多少次提交?或者返回N個特定文件的提交?快速查看文件以前版本的差異

語境:我發現在一個文件中的錯誤,我想追查,當它在悄悄這是很容易得到一個日誌報告與git log -<n> <filename>一個特定的文件,只顯示包括改變了提交文件。很顯然,我可以從log報告中複製和粘貼SHA,但我真正想要的是能夠執行諸如git diff^-- <filename>git diff ~2 -- <filename>之類的操作。

+2

你確定你不只是想'git blame'? –

回答

34
$ git log -p <filename> 

會向您顯示日誌消息以及每個觸及指定文件的提交的差異。

展現給以前的版本唯一的不同,要求在記錄歷史只有一步:

$ git log -1 -p <filename> 
+1

我覺得奇怪的是,這似乎是OP最接近的東西,但它非常有用。謝謝。 –

+0

@MattMcHenry真的很好。我編輯了你的答案,並添加了在最後一次提交時只顯示更改的語法,如OP中所述。 –

1

git blame應該讓你到你的目的地非常快。

3

您可以使用git log格式來獲取之前提交文件的哈希值。例如,

git log --pretty=format:'%h' -1 --skip=1 <filename> 

會讓你第二次到最後一次提交觸摸特定文件。事實上,如果你沒有指定文件名,這會讓你在整個存儲庫中第二次到最後一次提交。變老的哈希值,你可以設置一個git的別名調用一個shell功能,如:

[alias] 
    prior-hash = "!ph() { git log --pretty=format:'%h' -1 --skip=$1 $2; }; ph" 

要使用它,你會鍵入類似git prior-hash n <filename>,其中n爲(N + 1)個該文件的最新版本。所以1將是第二次到最後一次提交文件,2將是第三次到最後一次,等等,0將是最近觸摸該文件的提交。再次,如果您想要檢查整個回購,則文件名是可選的。

我相信你能弄清楚如何從那裏建立一個diff命令:

[alias] 
    prior-hash = "!ph() { git log --pretty=format:'%h' -1 --skip=$1 $2; }; ph" 
    diff-prev-easy = "!dp() { git diff $(git prior-hash $1 $2).. $2; }; dp" 

這將採用類似於現有哈希別名,git diff-prev-easy n <filename>。這將比較第(n + 1)個最後一個修訂版和該文件的最新修訂版。如果你想,而不是第一次修訂比較(N + 1)至第n個最後的修改,這是一個簡單的變化:

[alias] 
    prior-hash = "!ph() { git log --pretty=format:'%h' -1 --skip=$1 $2; }; ph" 
    diff-prev = "!dp() { git diff $(git prior-hash $1 $2)..$(git prior-hash $(($1 - 1)) $2) $2; }; dp" 

其中,再次使用相同的方法:git diff-prev n <filename>

一個潛在的但要注意的問題是,git log按時間順序列出提交,這可能不是您想要的。考慮這段歷史:

1 - 2 - - - 4 - 5 master 
     \  /
     3 - -  develop 

我們git diff-prev 1命令會產生差異提交4和5之間,符合市場預期。但git diff-prev 2會顯示提交3和4之間的差異,這可能是不可取的。

+0

我不知道OP,但這正是我所需要的。謝謝。 –