[英]How to have 'git log' show filenames like 'svn log -v'
SVN 的日志有一個“-v”模式,輸出每次提交中更改的文件的文件名,如下所示:
jes5199$ svn log -v ------------------------------------------------------------------------ r1 | jes5199 | 2007-01-03 14:39:41 -0800 (Wed, 03 Jan 2007) | 1 line Changed paths: A /AUTHORS A /COPYING A /ChangeLog A /EVOLUTION A /INSTALL A /MacOSX
Git 中的每次提交中是否有快速獲取更改文件列表的方法?
對於已更改文件的完整路徑名:
git log --name-only
有關已更改文件的完整路徑名和狀態:
git log --name-status
對於縮寫的路徑名和已更改文件的 diffstat:
git log --stat
還有很多選擇。 查看文檔。
注意:不推薦使用git log
git whatchanged
,請改用git log
鼓勵新用戶使用git-log[1]代替。
whatchanged
命令本質上與git-log[1]相同,但默認顯示原始格式差異輸出並跳過合並。保留該命令主要是出於歷史原因; 許多在
git log
發明之前很久就通過閱讀 Linux 內核郵件列表學習 Git 的人的手指都被訓練來鍵入它。
您可以使用命令git whatchanged --stat
獲取在每次提交中更改的文件列表(以及提交消息)。
git show
也是一個很好的命令。
它有點像svn diff
,但你可以傳遞一個 git commit hash 並查看差異。
如果您只想獲取文件名而沒有提交消息的其余部分,您可以使用:
git log --name-only --pretty=format: <branch name>
然后可以擴展它以使用包含文件名的各種選項:
git log --name-status --pretty=format: <branch name>
git log --stat --pretty=format: <branch name>
使用此方法時要注意的一件事是輸出中有一些必須忽略的空行。 如果您想查看本地分支上已更改但尚未推送到遠程分支的文件,並且不能保證遠程分支中的最新文件已被拉入,則使用此功能會很有用。例如:
git log --name-only --pretty=format: my_local_branch --not origin/master
將顯示本地分支上已更改但尚未合並到遠程主分支的所有文件。
我每天都使用它來顯示更改文件的歷史記錄:
git log --stat --pretty=short --graph
為了保持簡短,請通過執行以下操作在.gitconfig
添加別名:
git config --global alias.ls 'log --stat --pretty=short --graph'
我用這個:
git log --name-status <branch>..<branch> | grep -E '^[A-Z]\b' | sort | uniq
它只輸出文件列表及其狀態(添加、修改、刪除):
A sites/api/branding/__init__.py
M sites/api/branding/wtv/mod.py
...
git diff --stat HEAD^!
顯示最后一次提交 ( HEAD
) 更改的文件和添加/刪除的行數。
在我看來,沒有任何單個命令可以同時獲得僅包含文件名和添加和刪除的多個提交的行數的簡明輸出,因此我為此創建了自己的 Bash 腳本:
#!/bin/bash
for ((i=0; i<=$1; i++))
do
sha1=`git log -1 --skip=$i --pretty=format:%H`
echo "HEAD~$i $sha1"
git diff --stat HEAD~$(($i+1)) HEAD~$i
done
例如,將調用./changed_files 99
以獲取從HEAD
到HEAD~99
的簡潔形式的更改。 例如,它可以通過管道傳輸到less
。
這是使用具有五個簡單提交的本地存儲庫。
‣ git log --name-only
commit ed080bc88b7bf0c5125e093a26549f3755f7ae74 (HEAD -> master)
Author: My Name <user@email.com>
Date: Mon Oct 21 15:46:04 2019 -0700
mv file4 to file5
file5
commit 5c4e8cfbe3554fe3d7d99b5ae4ba381fa1cdb328
Author: My Name <user@email.com>
Date: Mon Oct 21 15:36:32 2019 -0700
foo file1
really important to foo before the bar
file1
commit 1b6413400b5a6a96d062a7c13109e6325e081c85
Author: My Name <user@email.com>
Date: Mon Oct 21 15:34:37 2019 -0700
foobar file2, rm file3
file2
file3
commit e0dd02ce23977c782987a206236da5ab784543cc
Author: My Name <user@email.com>
Date: Mon Oct 21 15:33:05 2019 -0700
Add file4
file4
commit b58e85692f711d402bae4ca606d3d2262bb76cf1
Author: My Name <user@email.com>
Date: Mon Oct 21 15:32:41 2019 -0700
Added files
file1
file2
file3
‣ git log --name-status
commit ed080bc88b7bf0c5125e093a26549f3755f7ae74 (HEAD -> master)
Author: My Name <user@email.com>
Date: Mon Oct 21 15:46:04 2019 -0700
mv file4 to file5
R100 file4 file5
commit 5c4e8cfbe3554fe3d7d99b5ae4ba381fa1cdb328
Author: My Name <user@email.com>
Date: Mon Oct 21 15:36:32 2019 -0700
foo file1
really important to foo before the bar
M file1
commit 1b6413400b5a6a96d062a7c13109e6325e081c85
Author: My Name <user@email.com>
Date: Mon Oct 21 15:34:37 2019 -0700
foobar file2, rm file3
M file2
D file3
commit e0dd02ce23977c782987a206236da5ab784543cc
Author: My Name <user@email.com>
Date: Mon Oct 21 15:33:05 2019 -0700
Add file4
A file4
commit b58e85692f711d402bae4ca606d3d2262bb76cf1
Author: My Name <user@email.com>
Date: Mon Oct 21 15:32:41 2019 -0700
Added files
A file1
A file2
A file3
‣ git log --stat
commit ed080bc88b7bf0c5125e093a26549f3755f7ae74 (HEAD -> master)
Author: My Name <user@email.com>
Date: Mon Oct 21 15:46:04 2019 -0700
mv file4 to file5
file4 => file5 | 0
1 file changed, 0 insertions(+), 0 deletions(-)
commit 5c4e8cfbe3554fe3d7d99b5ae4ba381fa1cdb328
Author: My Name <user@email.com>
Date: Mon Oct 21 15:36:32 2019 -0700
foo file1
really important to foo before the bar
file1 | 3 +++
1 file changed, 3 insertions(+)
commit 1b6413400b5a6a96d062a7c13109e6325e081c85
Author: My Name <user@email.com>
Date: Mon Oct 21 15:34:37 2019 -0700
foobar file2, rm file3
file2 | 1 +
file3 | 0
2 files changed, 1 insertion(+)
commit e0dd02ce23977c782987a206236da5ab784543cc
Author: My Name <user@email.com>
Date: Mon Oct 21 15:33:05 2019 -0700
Add file4
file4 | 0
1 file changed, 0 insertions(+), 0 deletions(-)
commit b58e85692f711d402bae4ca606d3d2262bb76cf1
Author: My Name <user@email.com>
Date: Mon Oct 21 15:32:41 2019 -0700
Added files
file1 | 0
file2 | 0
file3 | 0
3 files changed, 0 insertions(+), 0 deletions(-)
‣ git log --name-only --oneline
ed080bc (HEAD -> master) mv file4 to file5
file5
5c4e8cf foo file1
file1
1b64134 foobar file2, rm file3
file2
file3
e0dd02c Add file4
file4
b58e856 Added files
file1
file2
file3
‣ git log --pretty=oneline --graph --name-status
* ed080bc88b7bf0c5125e093a26549f3755f7ae74 (HEAD -> master) mv file4 to file5
| R100 file4 file5
* 5c4e8cfbe3554fe3d7d99b5ae4ba381fa1cdb328 foo file1
| M file1
* 1b6413400b5a6a96d062a7c13109e6325e081c85 foobar file2, rm file3
| M file2
| D file3
* e0dd02ce23977c782987a206236da5ab784543cc Add file4
| A file4
* b58e85692f711d402bae4ca606d3d2262bb76cf1 Added files
A file1
A file2
A file3
‣ git diff-tree HEAD
ed080bc88b7bf0c5125e093a26549f3755f7ae74
:100644 000000 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0000000000000000000000000000000000000000 D file4
:000000 100644 0000000000000000000000000000000000000000 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 A file5
‣ git log --stat --pretty=short --graph
* commit ed080bc88b7bf0c5125e093a26549f3755f7ae74 (HEAD -> master)
| Author: My Name <user@email.com>
|
| mv file4 to file5
|
| file4 => file5 | 0
| 1 file changed, 0 insertions(+), 0 deletions(-)
|
* commit 5c4e8cfbe3554fe3d7d99b5ae4ba381fa1cdb328
| Author: My Name <user@email.com>
|
| foo file1
|
| file1 | 3 +++
| 1 file changed, 3 insertions(+)
|
* commit 1b6413400b5a6a96d062a7c13109e6325e081c85
| Author: My Name <user@email.com>
|
| foobar file2, rm file3
|
| file2 | 1 +
| file3 | 0
| 2 files changed, 1 insertion(+)
|
* commit e0dd02ce23977c782987a206236da5ab784543cc
| Author: My Name <user@email.com>
|
| Add file4
|
| file4 | 0
| 1 file changed, 0 insertions(+), 0 deletions(-)
|
* commit b58e85692f711d402bae4ca606d3d2262bb76cf1
Author: My Name <user@email.com>
Added files
file1 | 0
file2 | 0
file3 | 0
3 files changed, 0 insertions(+), 0 deletions(-)
‣ git log --name-only --pretty=format:
file5
file1
file2
file3
file4
file1
file2
file3
‣ git log --name-status --pretty=format:
R100 file4 file5
M file1
M file2
D file3
A file4
A file1
A file2
A file3
‣ git diff --stat 'HEAD^!'
file4 => file5 | 0
1 file changed, 0 insertions(+), 0 deletions(-)
‣ git show
commit ed080bc88b7bf0c5125e093a26549f3755f7ae74 (HEAD -> master)
Author: My Name <user@email.com>
Date: Mon Oct 21 15:46:04 2019 -0700
mv file4 to file5
diff --git a/file4 b/file5
similarity index 100%
rename from file4
rename to file5
感謝@CB-Bailey @Peter-Suwara @Gaurav @Omer-Dagan @xsor @Hazok @nrz @ptc
我發現以下是以簡潔格式列出每次提交更改的文件的理想顯示:
git log --pretty=oneline --graph --name-status
我在用:
git diff-tree -v --name-status -r <commit-id>
它顯示非常相似的 output 就像 svn log -v
另一個有用的命令是git diff-tree <hash>
,其中hash也可以是一個哈希范圍(用<old>..<new>
符號表示)。 輸出示例:
$ git diff-tree HEAD
:040000 040000 8e09a be406 M myfile
這些字段是:
源模式、目標模式、源哈希、目標哈希、狀態和文件名
狀態是您期望的狀態: D (已刪除)、 A (已添加)、 M (已修改)等。有關完整說明,請參閱手冊頁。
我通常使用這些來獲取日志:
$ git log --name-status --author='<Name of author>' --grep="<text from Commit message>"
$ git log --name-status --grep="<text from Commit message>"
這個簡短的命令非常有助於列出每次提交更改的所有文件。
git log --name-only --oneline
--name-only
僅顯示更改文件的名稱。 文件名通常以 UTF-8 編碼。 有關更多信息,請參閱 git-log 1手冊頁中有關編碼的討論。
- 一條線
This is a shorthand for "--pretty=oneline --abbrev-commit" used together.
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.