Bagaimana caranya agar git log menampilkan nama file seperti svn log -v

987

Log SVN memiliki mode "-v" yang menampilkan nama file file yang diubah di setiap komit, seperti:

jes5199 $ svn log -v
-------------------------------------------------- ----------------------
r1 | jes5199 | 2007-01-03 14:39:41 -0800 (Rabu, 03 Jan 2007) | 1 baris
Jalur yang diubah:
   A / PENULIS
   A / SALINAN
   A / ChangeLog
   A / EVOLUSI
   A / INSTALL
   A / MacOSX

Apakah ada cara cepat untuk mendapatkan daftar file yang diubah di setiap commit di git?

jes5199
sumber
15
Bertanya-tanya mengapa git logtidak hanya mendukung -vsakelar seperti yang banyak diharapkan / inginkan? </gripe>
MarkHu

Jawaban:

1528

Untuk nama path lengkap dari file yang diubah:

git log --name-only

Untuk nama path lengkap dan status file yang diubah:

git log --name-status

Untuk nama path yang disingkat dan diffstat dari file yang diubah:

git log --stat

Ada banyak opsi lagi, lihat dokumen .

CB Bailey
sumber
17
Saya menggunakan git log --numstat. Lihat git help logopsi lainnya.
ma11hew28
29
git log --name-only --onelinejuga cukup keren - satu garis berwarna untuk komit, dan satu file per baris. stackoverflow.com/a/14227496/1995714
cp.engr
4
Dengan git 2.7.3, saya harus menggunakannya git log --name-status --find-renamesuntuk menampilkan file berganti nama alih-alih penambahan + penghapusan.
Suzanne Dupéron
1
Perhatikan bahwa --statmenyingkat jalur panjang; Lebar dapat dikonfigurasi tetapi histogram yang dibungkus lebih sulit dibaca. Format lain seperti --numstatselalu mencetak path lengkap.
Beni Cherniavsky-Paskin
@ ma11hew28 Terima kasih. --numstatada pada baris 946 dari halaman manual itu pada git 2.22.00. Itu lebih banyak pilihan daripada yang dibutuhkan kebanyakan orang.
Pasang kembali Monica - M. Schröder
139

CATATAN: sudah usang, gunakan saja git whatchangedgit log

Pengguna baru disarankan untuk menggunakan git-log [1] sebagai gantinya. The whatchangedperintah dasarnya sama dengan git-log [1] tetapi default untuk menampilkan format output diff baku dan untuk melewati gabungan.

Perintah itu disimpan terutama karena alasan historis; jari banyak orang yang mempelajari Git jauh sebelum git logditemukan dengan membaca mailing list kernel Linux dilatih untuk mengetiknya.


Anda dapat menggunakan perintah git whatchanged --statuntuk mendapatkan daftar file yang berubah di setiap komit (bersama dengan pesan komit).

Referensi

mipadi
sumber
50

git show juga merupakan perintah yang hebat.

Ini seperti svn diff, tetapi Anda bisa memberikannya panduan dan melihat perbedaan itu.

ptc
sumber
46

Jika Anda ingin mendapatkan nama file hanya tanpa sisa pesan komit Anda dapat menggunakan:

git log --name-only --pretty=format: <branch name>

Ini kemudian dapat diperluas untuk menggunakan berbagai opsi yang berisi nama file:

git log --name-status --pretty=format: <branch name>

git log --stat --pretty=format: <branch name>

Satu hal yang perlu diperhatikan ketika menggunakan metode ini adalah bahwa ada beberapa baris kosong dalam output yang harus diabaikan. Menggunakan ini dapat berguna jika Anda ingin melihat file yang telah diubah pada cabang lokal, tetapi belum didorong ke cabang jarak jauh dan tidak ada jaminan terbaru dari jarak jauh telah ditarik. Misalnya :

git log --name-only --pretty=format: my_local_branch --not origin/master

Akan menampilkan semua file yang telah diubah di cabang lokal, tetapi belum digabung ke cabang master di remote.

Hazok
sumber
1
Catatan pada spasi putih dalam contoh di atas - itu seperti git log --stat --pretty="format:" $branchName,. Jadi misalnya git log --stat --pretty="format:" $(git rev-parse --abbrev-ref HEAD),. Sementara saya melakukannya, inilah mantra yang akhirnya menjadi relevan dengan tujuan saya:git log --name-only --pretty="format: " master..$(git rev-parse --abbrev-ref HEAD)
driftcatcher
41

Saya menggunakan ini setiap hari untuk menunjukkan riwayat dengan file yang berubah:

git log --stat --pretty=short --graph

Agar singkat, tambahkan alias di Anda .gitconfigdengan melakukan:

git config --global alias.ls 'log --stat --pretty=short --graph'
xsor
sumber
Milik saya sangat dekat dengan itu, git log --pretty = oneline --graph --name-status. Saya merasa lebih ringkas, hanya menampilkan daftar file yang diubah.
Peter Suwara
15

Saya menggunakan ini:

git log --name-status <branch>..<branch> | grep -E '^[A-Z]\b' | sort | uniq

yang menampilkan daftar file saja dan kondisinya (ditambahkan, dimodifikasi, dihapus):

A   sites/api/branding/__init__.py
M   sites/api/branding/wtv/mod.py
...
Sofia
sumber
7

git diff --stat HEAD^!menunjukkan file yang diubah dan jumlah baris ditambahkan / dihapus untuk komit terakhir ( HEAD).

Tampaknya bagi saya bahwa tidak ada perintah tunggal untuk mendapatkan hasil ringkas yang hanya terdiri dari nama file dan jumlah baris ditambahkan dan dihapus untuk beberapa komit sekaligus, jadi saya membuat skrip bash saya sendiri untuk itu:

#!/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

Untuk dipanggil mis. ./changed_files 99untuk mendapatkan perubahan dalam bentuk ringkas dari HEADhingga HEAD~99. Bisa disalurkan misalnya. untuk less.

nrz
sumber
Tidak bisakah Anda lakukan git diff --stat HEAD..masteruntuk menunjukkan perbedaan antara HEAD dan master, atau tidakkah ini ada ketika Anda memposting jawaban Anda pada tahun 2012?
Ferrybig
1
@Ferrybig pertanyaan OP adalah tentang bagaimana "untuk mendapatkan daftar file yang diubah di setiap komit" , bukan tentang perbedaan antara HEADdan master. Itu adalah dua hal yang berbeda.
nrz
4

Saya menemukan berikut ini adalah tampilan yang ideal untuk daftar file apa yang diubah per komit dalam format ringkas:

git log --pretty=oneline --graph --name-status
Peter Suwara
sumber
3

Ringkasan jawaban dengan contoh output

Ini menggunakan repositori lokal dengan lima komit sederhana.

‣ git log --name-only
commit ed080bc88b7bf0c5125e093a26549f3755f7ae74 (HEAD -> master)
Author: My Name <[email protected]>
Date:   Mon Oct 21 15:46:04 2019 -0700

    mv file4 to file5

file5

commit 5c4e8cfbe3554fe3d7d99b5ae4ba381fa1cdb328
Author: My Name <[email protected]>
Date:   Mon Oct 21 15:36:32 2019 -0700

    foo file1

    really important to foo before the bar

file1

commit 1b6413400b5a6a96d062a7c13109e6325e081c85
Author: My Name <[email protected]>
Date:   Mon Oct 21 15:34:37 2019 -0700

    foobar file2, rm file3

file2
file3

commit e0dd02ce23977c782987a206236da5ab784543cc
Author: My Name <[email protected]>
Date:   Mon Oct 21 15:33:05 2019 -0700

    Add file4

file4

commit b58e85692f711d402bae4ca606d3d2262bb76cf1
Author: My Name <[email protected]>
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 <[email protected]>
Date:   Mon Oct 21 15:46:04 2019 -0700

    mv file4 to file5

R100    file4   file5

commit 5c4e8cfbe3554fe3d7d99b5ae4ba381fa1cdb328
Author: My Name <[email protected]>
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 <[email protected]>
Date:   Mon Oct 21 15:34:37 2019 -0700

    foobar file2, rm file3

M       file2
D       file3

commit e0dd02ce23977c782987a206236da5ab784543cc
Author: My Name <[email protected]>
Date:   Mon Oct 21 15:33:05 2019 -0700

    Add file4

A       file4

commit b58e85692f711d402bae4ca606d3d2262bb76cf1
Author: My Name <[email protected]>
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 <[email protected]>
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 <[email protected]>
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 <[email protected]>
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 <[email protected]>
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 <[email protected]>
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 <[email protected]>
| 
|     mv file4 to file5
| 
|  file4 => file5 | 0
|  1 file changed, 0 insertions(+), 0 deletions(-)
| 
* commit 5c4e8cfbe3554fe3d7d99b5ae4ba381fa1cdb328
| Author: My Name <[email protected]>
| 
|     foo file1
| 
|  file1 | 3 +++
|  1 file changed, 3 insertions(+)
| 
* commit 1b6413400b5a6a96d062a7c13109e6325e081c85
| Author: My Name <[email protected]>
| 
|     foobar file2, rm file3
| 
|  file2 | 1 +
|  file3 | 0
|  2 files changed, 1 insertion(+)
| 
* commit e0dd02ce23977c782987a206236da5ab784543cc
| Author: My Name <[email protected]>
| 
|     Add file4
| 
|  file4 | 0
|  1 file changed, 0 insertions(+), 0 deletions(-)
| 
* commit b58e85692f711d402bae4ca606d3d2262bb76cf1
  Author: My Name <[email protected]>

      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 <[email protected]>
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


Kredit ke @ CB-Bailey @ Peter-Suwara @Gaurav @ Omer-Dagan @xsor @Hazok @nrz @ptc

JamesThomasMoon1979
sumber
0

Perintah lain yang bermanfaat adalah di git diff-tree <hash>mana hash juga bisa menjadi rentang hash (dilambangkan dengan <old>..<new>notasi). Contoh keluaran:

$ git diff-tree  HEAD
:040000 040000 8e09a be406 M myfile

Fieldnya adalah:

mode sumber, mode dest, hash sumber, hash dest, status, nama file

Status adalah yang Anda harapkan: D (dihapus), A (ditambahkan), M (dimodifikasi) dll. Lihat halaman manual untuk deskripsi lengkap.

Omer Dagan
sumber
0

Saya biasanya menggunakan ini untuk mendapatkan log:

$ git log --name-status --author='<Name of author>' --grep="<text from Commit message>"

$ git log --name-status --grep="<text from Commit message>"
Gaurav
sumber
1
Saya tidak tahu tentang opsi-opsi ini, tetapi posting ini akan lebih berguna jika menjelaskan bahwa ia memfilter log. Untuk sesaat di sana, saya pikir itu adalah cara untuk mengubah cara penulis tercantum dalam output.
Stein