2011-01-24 148 views
102

我想查找修改源文件的最近提交。如何找到修改文件的最新git提交?

我可以使用git blame來查看每行提交的所有日期,但很難確切地看到哪個提交是最後一個提交的文件。

如何才能找到最後一次提交,觸及我的git存儲庫中的給定文件?

回答

122

git log支持尋找特定的文件(目錄)的歷史,所以你可以這樣寫:

git log my/file.c 

如果你真的只想列出一個最近承諾,例如使用它在腳本中,你可以使用-n 1

git log -n 1 --pretty=format:%H -- my/file.c 

--pretty=format:%h告訴git log只顯示提交哈希(感謝TheBamf)。 --分隔符使文件名不會被解釋爲提交名稱,以防萬一不明確。

+4

如果你想知道上一次文件被修改了,不管分支是什麼,你可以通過添加`--all`選項來考慮所有分支。 – 2015-08-13 08:00:49

8

我不確定這是否是你想要的,但如果你做了git log <thefile>來獲取改變該文件的提交。你可以選擇最上面的一個。它應該是你正在尋找的那個。

+3

如果你使用`git log -n1 - `(或者如果你想浪費資源的話把管道輸出到`head -1`),你不必手動選擇第一行(參見Jo Liss的[答案]( http://stackoverflow.com/questions/4784575/how-do-i-find-the-most-recent-git-commit-that-modified-a-file/4784629#4784629)) – 2011-04-20 09:37:42

+3

好點。我想你也可以直接跳過`-n`並使用`-1`。 – 2011-04-20 09:42:20

1

一旦你有使用git log FILENAME想要查看的提交的SHA ID,你應該能夠做git show SHA_ID_HERE看看你爲那個特定的提交做了什麼。你甚至不需要輸入整個ID;前6個字符應該足夠了。

+3

這比OP要求的要多一點,但僅供參考,您可以將其組合成一行:`git show $(git log -1 --pretty =「%H」 - FILENAME)` – 2011-04-20 10:52:20

+0

啊,是的,這就是更容易。謝謝你的提示。 – Joe 2011-04-25 15:45:38

0

得到的只是一個線裁判,嘗試:

git log -n1 --oneline <path> | awk '{print $1;}' 
25

如果你想只得到最新的散列承諾修改一組特定的文件(並希望避免awk),你可以使用方法:

git log -n 1 --pretty=format:%h -- <path> 

這可能是爲獲得對隨後git describe使用哈希提交有用。

例如(如果它是有用的人)......

我考慮最新創建當前版本號提交更改任何的源文件(假設你標記的版本與像mycode-1.2.1標籤):

COMMIT=$(git log -n 1 --pretty=format:%h -- *.c *.h) 
if VN=$(git describe --always --abbrev=5 --match "mycode-*" $COMMIT 2>/dev/null) && 
case "$VN" in 
mycode-*) 
    git update-index -q --refresh 
    test -z "$(git diff-index --name-only HEAD *.c *.h)" || 
    VN="$VN-mod" ;; 
*) VN="mycode-unknown-g$VN" ;; 
esac 
then 
    continue 
else 
VN="mycode-unknown" 
fi 

這產生像IDS:

  • mycode-1.2.1 - 當理論值的當前狀態È源文件對應於標記的版本
  • mycode-1.2.1-g3k7s2 - 當所述源文件的當前狀態對應於提交以下一個標記形式
  • mycode-1.2.1-g3k7s2-mod - 當所述源文件的當前狀態已因爲修飾的最後提交以下一個標記的版本
  • mycode-unknown - 不是當有尚未創建
18

一個版本標記如果您只是想找到最近的提交,那麼你不想git-log,你想要git-rev-list,它列出提交對象更改該文件,在該提交路徑,從最新的一個(按時間順序)開始。簡單地說:

git rev-list -1 <commit> <filename>

針對你的情況git-rev-list,您只需提供:

  • 提交的數目包括,或-1只有最近,
  • 的分支(或提交ID)開始回顧,HEAD如果你已經在它上面,或者--all如果你想要所有已知的提交,並且
  • 文件的相對路徑。

這只是返回最近在當前分支提交ID改變該文件,例如:215095e2e338525be0baeeebdf66bfbb304e7270

對於更復雜的例子,你可以使用標籤名稱,甚至是遠程引用,幷包括相對使用通配符路徑名稱,例如:

git rev-list origin/user/bob/testbranch -1 src/bfiles/*.txt

...這將告訴你最近的變化是該分支的歷史的通配符匹配。 rev-list的選項是極端的,它是最重要的管道命令之一,所以你可以通過任何你可以想象的標準來包含或排除。

當然,請參閱git-rev-list(1) Manual Page

相關問題