Bagaimana cara mendapatkan daftar semua file yang berubah di antara dua komitmen Git?

178

Karena birokrasi, saya perlu mendapatkan daftar semua file yang diubah dalam repositori saya untuk laporan (saya mulai dengan kode sumber yang ada).

Apa yang harus saya jalankan untuk mendapatkan daftar ini?

Chen Kinnrot
sumber
34
"karena birokrasi" xD
ptim

Jawaban:

238

Untuk file yang diubah antara SHA yang diberikan dan komit Anda saat ini:

git diff --name-only <starting SHA> HEAD

atau jika Anda ingin menyertakan file yang diubah-tetapi-belum-berkomitmen:

git diff --name-only <starting SHA>

Secara lebih umum, sintaks berikut akan selalu memberi tahu Anda file mana yang diubah antara dua komit (ditentukan oleh SHA atau nama lain):

git diff --name-only <commit1> <commit2>
Amber
sumber
2
dan jika Anda ingin mengetahui file yang dimodifikasi untuk komit tertentu lakukan:git diff --name-only <SHA> <SHA>^
thebugfinder
3
Menggunakan --name-statusflag sebagai ganti --name-onlyberguna untuk mendapatkan daftar file dan melihat status modifikasinya, seperti Ditambahkan atau Dimodifikasi.
Thane Plummer
@Amber harus menyebutkan catatan @Thane Plummer yang --name-statusmenunjukkan apa yang terjadi pada mereka
Zoltán Süle
64

Untuk menemukan nama semua file yang diubah sejak komit terakhir Anda:

git diff --name-only

Atau (untuk informasi lebih lanjut, termasuk file yang tidak dilacak):

git status
Tim Bellis
sumber
48
  • Untuk membuat daftar semua file yang diubah tidak dilacak yang dilacak:

    git diff --name-only
    
  • Untuk daftar semua dipentaskan file berubah dilacak:

    git diff --name-only --staged
    
  • Untuk membuat daftar semua file berubahan yang dipentaskan dan tidak dipentaskan :

    { git diff --name-only ; git diff --name-only --staged ; } | sort | uniq
    
  • Untuk membuat daftar semua file yang tidak dilacak (yang terdaftar oleh git status, jadi tidak termasuk file yang diabaikan):

    git ls-files --other --exclude-standard
    

Jika Anda menggunakan ini dalam shell script, dan Anda ingin pemrograman memeriksa apakah perintah ini kembali apa-apa, Anda akan tertarik git diff's --exit-codepilihan.

Flimm
sumber
16

Ketika saya telah menambahkan / memodifikasi / menghapus banyak file (sejak komit terakhir), saya ingin melihat modifikasi tersebut dalam urutan kronologis.

Untuk itu saya gunakan:

  • Untuk membuat daftar semua file yang tidak dipentaskan:

    git ls-files --other --modified --exclude-standard
    
  • Untuk mendapatkan tanggal modifikasi terakhir untuk setiap file:

    while read filename; do  echo -n "$(stat -c%y -- $filename 2> /dev/null) "; echo $filename;  done
    

Meskipun ruvim menyarankan dalam komentar :

xargs -0 stat -c '%y %n' -- 
  • Untuk mengurutkannya dari yang terlama ke yang terbaru:

    sort
    

Sebuah alias memudahkan penggunaan:

alias gstlast='git ls-files --other --modified --exclude-standard|while read filename; do  echo -n "$(stat -c%y -- $filename 2> /dev/null) "; echo $filename;  done|sort'

Atau (lebih pendek dan lebih efisien, berkat ruvim )

alias gstlast='git ls-files --other --modified --exclude-standard|xargs -0 stat -c '%y %n' --|sort'

Sebagai contoh:

username@hostname:~> gstlast
2015-01-20 11:40:05.000000000 +0000 .cpl/params/libelf
2015-01-21 09:02:58.435823000 +0000 .cpl/params/glib
2015-01-21 09:07:32.744336000 +0000 .cpl/params/libsecret
2015-01-21 09:10:01.294778000 +0000 .cpl/_deps
2015-01-21 09:17:42.846372000 +0000 .cpl/params/npth
2015-01-21 12:12:19.002718000 +0000 sbin/git-rcd

Saya sekarang dapat meninjau modifikasi saya, dari yang terlama hingga yang terbaru.

VONC
sumber
Mengapa tidak menggunakan xargsdan satu panggilan stat? Satu git ls-files -z --other --modified --exclude-standard | xargs -0 stat -c '%y %n' -- | sort
kalimat
@ruvim Terima kasih. Saran yang sangat bagus. Saya telah mengedit jawaban untuk memasukkan komentar Anda, agar lebih terlihat.
VonC
4

Saya perlu daftar file yang telah mengubah konten antara dua komit (hanya ditambahkan atau diubah), jadi saya menggunakan:

git diff --name-only --diff-filter=AM <commit hash #1> <commit hash #2>

Opsi-opsi filter yang berbeda dari dokumentasi git diff :

difilter = [(A | C | D | M | R | T | U | X | B)… [*]]

Pilih hanya file yang ditambahkan (A), Disalin (C), Dihapus (D), Dimodifikasi (M), Diubah nama (R), memiliki jenisnya (yaitu file biasa, symlink, submodule, ...) diubah (T), adalah Unmerged (U), Unknown (X), atau sudah dipasangkan Broken (B). Kombinasi karakter filter apa pun (termasuk tidak ada) dapat digunakan. Ketika * (Semua-atau-tidak ada) ditambahkan ke kombinasi, semua jalur dipilih jika ada file yang cocok dengan kriteria lain dalam perbandingan; jika tidak ada file yang cocok dengan kriteria lain, tidak ada yang dipilih.

Juga, huruf besar ini dapat diturunkan untuk dikecualikan. Misalnya --diff-filter = iklan mengecualikan jalur yang ditambahkan dan dihapus.

Jika Anda ingin membuat daftar status juga (mis. A / M), ubah --name-onlyke --name-status.

Makanan ternak
sumber
3

Daftar unstaged yang dimodifikasi dapat diperoleh dengan menggunakan git statusdan grepperintah seperti di bawah ini. Sesuatu seperti git status -s | grep M:

root@user-ubuntu:~/project-repo-directory# git status -s | grep '^ M'
 M src/.../file1.js
 M src/.../file2.js
 M src/.../file3.js
 ....
SuperNova
sumber
Perhatikan bahwa ini hanya dapat digunakan untuk perubahan yang tidak dipentaskan, jadi ini tidak berguna untuk 'file yang berubah di antara dua komitmen Git'
John Vandenberg
2

Dengan git showAnda bisa mendapatkan hasil yang serupa. Untuk melihat komit (seperti yang terlihat pada git logtampilan) dengan daftar file yang disertakan, gunakan:

git show --name-only [commit-id_A]^..[commit-id_B]

Di mana [commit-id_A]komit awal dan [commit-id_B]komit terakhir dari yang ingin Anda tunjukkan.

Perhatian khusus dengan ^simbol. Jika Anda tidak mengatakannya, informasi commit-id_A tidak akan digunakan.

Kurapika
sumber
1

Jika Anda ingin memeriksa file yang diubah, Anda harus mengurus banyak hal kecil seperti mana yang terbaik untuk digunakan, seperti jika Anda ingin memeriksa file mana yang diubah, ketik saja.

git status - itu akan menampilkan file dengan perubahan

maka jika Anda ingin tahu perubahan apa yang harus dilakukan dapat diperiksa dengan cara,

git diff - akan menampilkan semua perubahan di semua file

itu baik hanya ketika hanya satu file yang dimodifikasi

dan jika Anda ingin memeriksa file tertentu maka gunakan

git diff

Saurabh Pal
sumber