Bagaimana cara mendaftar hanya nama file yang berubah antara dua komit?

1954

Saya memiliki banyak komitmen dalam repo. Saya ingin melihat daftar file yang diubah antara dua commit - dari SHA1 ke SHA2.

Perintah apa yang harus saya gunakan?

Shawn
sumber
3
Untuk komit dan induknya: stackoverflow.com/questions/424071/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Jawaban:

2666
git diff --name-only SHA1 SHA2

di mana Anda hanya perlu memasukkan cukup SHA untuk mengidentifikasi komitmen. Anda juga bisa melakukannya, misalnya

git diff --name-only HEAD~10 HEAD~5

untuk melihat perbedaan antara komit terbaru kesepuluh dan komit terbaru kelima (atau lebih).

Peter
sumber
152
Ini juga berfungsi untuk git show. git show --name-only SHA1.
Agustus Lilleaas
78
git diff --name-status [TAG|SHA1]menunjukkan operasi apa yang dilakukan pada file juga
recbot
2
Anda juga dapat melakukan: git diff --name-only HEAD @ {3} HEAD @ {0} untuk komit persis yang ingin Anda bandingkan.
B01
7
@AugustLilleaas yang benar-benar menggunakan pertunjukan hanya akan menampilkan 2 komit tertentu, jika Anda memiliki komit di antara 2 itu, mereka akan ditinggalkan
chrisan
4
Seperti disebutkan di bawah, git diff --name-statussepertinya tidak ingin menampilkan file yang ditambahkan. @sschuberth menunjukkan git show, yang tampaknya bekerja dengan baik bagi saya: git show --pretty=format: --name-status. Hanya melakukan git show --name-statusmemberi sedikit lebih banyak info, tapi tetap bagus dan padat ... itu akan menjadi perintah goto baru saya;)
travc
417
git diff --name-status [SHA1 [SHA2]]

seperti --name-only, kecuali Anda mendapatkan awalan sederhana yang memberi tahu Anda apa yang terjadi pada file (dimodifikasi, dihapus, ditambahkan ...)

git log --name-status --oneline [SHA1..SHA2]

serupa, tetapi komit terdaftar setelah pesan komit, sehingga Anda dapat melihat kapan file diubah.

  • jika Anda tertarik dengan apa yang terjadi pada file / folder tertentu, Anda dapat menambahkan -- <filename> [<filename>...]ke git logversi.

  • jika Anda ingin melihat apa yang terjadi untuk satu commit, sebut saja SHA1, lalu lakukan
    git log --name-status --oneline [SHA1^..SHA1]

Tanda status file:
M dimodifikasi - File telah dimodifikasi
C copy-edit - File telah disalin dan dimodifikasi
R ganti nama-edit - File telah diubah namanya dan dimodifikasi
A ditambahkan - File telah ditambahkan
D dihapus - File telah dihapus
U unmerged - File memiliki konflik setelah penggabungan

artfulrobot
sumber
Saya kebetulan mengatakan git diff --name-status dan itu memang memberikan 'file yang ditambahkan'.
aartist
1
Untuk git log, harus memiliki dua titik di antara SHA, seperti SHA1..SHA2, dan SHA kedua bukan opsional, jadi seharusnya terlihat seperti ini: git log --name-status --oneline [SHA1 .. SHA2]
twasbrillig
Apakah ada cara untuk mengecualikan file tertentu / jenis file tertentu?
Agustus
3
The --relative[=<path>]pilihan dapat membantu Anda, saya tidak yakin. Kalau tidak, selalu ada | erep -v '(.tmp|.foo|.dontwant)$'...
artfulrobot
80

Tampaknya tidak ada yang menyebutkan saklar --stat:

$ git diff --stat HEAD~5 HEAD
 .../java/org/apache/calcite/rex/RexSimplify.java   | 50 +++++++++++++++++-----
 .../apache/calcite/sql/fun/SqlTrimFunction.java    |  2 +-
 .../apache/calcite/sql2rel/SqlToRelConverter.java  | 16 +++++++
 .../org/apache/calcite/util/SaffronProperties.java | 19 ++++----
 .../org/apache/calcite/test/RexProgramTest.java    | 24 +++++++++++
 .../apache/calcite/test/SqlToRelConverterTest.java |  8 ++++
 .../apache/calcite/test/SqlToRelConverterTest.xml  | 15 +++++++
 pom.xml                                            |  2 +-
 .../apache/calcite/adapter/spark/SparkRules.java   |  7 +--
 9 files changed, 117 insertions(+), 26 deletions(-)

Ada juga --numstat

$ git diff --numstat HEAD~5 HEAD
40      10      core/src/main/java/org/apache/calcite/rex/RexSimplify.java
1       1       core/src/main/java/org/apache/calcite/sql/fun/SqlTrimFunction.java
16      0       core/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java
8       11      core/src/main/java/org/apache/calcite/util/SaffronProperties.java
24      0       core/src/test/java/org/apache/calcite/test/RexProgramTest.java
8       0       core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java
15      0       core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml
1       1       pom.xml
4       3       spark/src/main/java/org/apache/calcite/adapter/spark/SparkRules.java

dan --shortstat

$ git diff --shortstat HEAD~5 HEAD
9 files changed, 117 insertions(+), 26 deletions(-)
leeyuiwah
sumber
4
Jawaban yang diterima benar, tetapi ini sangat berguna dan memberi Anda sedikit info tambahan. Terima kasih!
kontur
2
Setuju ini adalah jawaban yang lebih berguna karena mengandung statistik diff.
internet di
52

Tetapi untuk melihat file berubah antara cabang Anda dan leluhurnya yang sama dengan cabang lain (katakanlah asal / master):

git diff --name-only `git merge-base origin/master HEAD`
Tim James
sumber
1
Ini sangat berguna! Saya berharap saya bisa mengatakan git diffstatus masteratau serupa, yang memicu hal di atas.
oma
3
Atau git show --pretty=format: --name-only origin/master...
sschuberth
Anda mungkin tidak bisa membuatnya menjadi alias git, tetapi Anda pasti bisa memasukkannya ke dalam .bashrc Anda.
Fred
3
Atau bahkan lebih sederhana: git diff --name-only HEAD...master(perhatikan tiga titik). Untuk penjelasan terperinci, lihat di sini .
ostrokach
1
Sepertinya sebagian besar jawaban yang benar! Sederhana git diff --name-only master..branchtidak sesuai dengan daftar PR github. Cara ini lebih tepat. Tapi bagaimanapun saya memiliki 173 file chaned vs 171 di github PR. (tanpa merge-basesaya punya 228 vs 171)
x'ES
21

Untuk melengkapi jawaban @ artfulrobot, jika Anda ingin menampilkan file yang diubah antara dua cabang:

git diff --name-status mybranch..myotherbranch

Berhati-hatilah pada prioritas. Jika Anda menempatkan cabang yang lebih baru terlebih dahulu maka itu akan menampilkan file sebagai dihapus daripada ditambahkan.

Menambahkan grepkaleng memperbaiki hal-hal lebih lanjut:

git diff --name-status mybranch..myotherbranch | grep "A\t"

Itu kemudian hanya akan menampilkan file yang ditambahkan myotherbranch.

Max MacLeod
sumber
4
Regex itu bagus dan memang bisa melakukan hampir semua hal. Namun, dalam hal ini, ada juga --diff-filteryang memberikan fungsi ini secara asli, yang berarti lebih sedikit peluang hasil yang salah (mis. Positif palsu)
Jasper
8

Tambahkan alias di bawah ini ke Anda ~/.bash_profile, lalu jalankan source ~/.bash_profile,; sekarang kapan saja Anda perlu melihat file yang diperbarui di komit terakhir, jalankan, showfilesdari repositori git Anda.

alias showfiles='git show --pretty="format:" --name-only'
Zorayr
sumber
2
Atau git config --global alias.showfiles 'show --pretty="format:" --name-only'untuk membuat git showfiles.
cgmb
7

Ini akan menunjukkan perubahan pada file:

git diff --word-diff SHA1 SHA2
Julio Marins
sumber
5

Perhatikan juga, jika Anda hanya ingin melihat file yang diubah antara komit terakhir dan komit sebelumnya. Ini berfungsi dengan baik:git show --name-only

Parris
sumber
3

Gunakan git log --pretty = oneline> C: \ filename.log

yang hanya akan mencatat oneline (--pretty = oneline) itulah nama file yang diubah. Juga akan mencatat semua detail ke file output Anda.

Agni
sumber
git log --pretty=onelinememberi saya hanya SHA dan pesan komit menggunakan git 2.10.1
damd
3

Seperti yang dikatakan artfulrobot dalam jawabannya:

git diff --name-status [SHA1 [SHA2]]

Contoh saya:

git diff --name-status 78a09k12067c24d8f117886c4723ccf111af4997 
4b95d595812211553070046bf2ebd807c0862cca
M       views/layouts/default.ctp
M       webroot/css/theme.css
A       webroot/img/theme/logo.png
Jaime Montoya
sumber
3

Hanya untuk seseorang yang perlu fokus hanya pada file Java, ini solusi saya:

 git diff --name-status SHA1 SHA2 | grep '\.java$'
K. Symbol
sumber
1

Berikut ini berfungsi dengan baik untuk saya:

$ git show --name-only --format=tformat: SHA1..SHA2

Itu juga dapat digunakan dengan satu komit:

git show --name-only --format=tformat: SHA1

yang berguna untuk digunakan di Jenkins di mana Anda diberikan Daftar SHS perubahan, dan ingin mengulanginya untuk melihat file mana yang telah diubah.

Ini mirip dengan beberapa jawaban di atas, tetapi menggunakan tformat:alih - alih format:menghilangkan ruang pemisah antara komit.

blindsnowmobile
sumber
0

Berdasarkan pada git diff --name-statussaya menulis ekstensi git-diffview git yang membuat tampilan hierarki pohon tentang apa yang berubah antara dua jalur.

Bernard Opic
sumber