จะแสดงรายการเฉพาะชื่อไฟล์ที่เปลี่ยนระหว่างสองคอมมิทได้อย่างไร?


1952

ฉันมีความมุ่งมั่นใน repo ฉันต้องการดูรายการไฟล์ที่เปลี่ยนระหว่างการคอมมิทสองครั้ง - จาก SHA1 เป็น SHA2

ฉันควรใช้คำสั่งอะไร


3
สำหรับความมุ่งมั่นและผู้ปกครอง: stackoverflow.com/questions/424071/ …
Ciro Santilli 法轮功病毒审查审查六四事件法轮功

คำตอบ:


2662
git diff --name-only SHA1 SHA2

ในกรณีที่คุณจะต้องรวม SHA เพียงพอเพื่อระบุข้อผูกพัน ตัวอย่างเช่นคุณสามารถทำได้

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

เพื่อดูความแตกต่างระหว่างการส่งมอบครั้งที่สิบล่าสุดและครั้งที่ห้าครั้งล่าสุด (หรือมากกว่านั้น)


151
งานนี้ใช้สำหรับการแสดงคอมไพล์เช่นกัน git show --name-only SHA1.
สิงหาคม Lilleaas

78
git diff --name-status [TAG|SHA1]แสดงให้เห็นว่าการดำเนินการใดที่ทำกับไฟล์เช่นกัน
reconbot

2
คุณสามารถทำได้เช่นกัน: git diff - name-only HEAD @ {3} HEAD @ {0} สำหรับการกระทำที่แน่นอนที่คุณต้องการเปรียบเทียบ
b01

7
@AugustLilleaas จริงโดยใช้การแสดงจะแสดงเฉพาะกระทำเฉพาะ 2 ถ้าคุณมีกระทำระหว่างผู้ 2 พวกเขาจะถูกปล่อยออกมา
chrisan

4
ตามที่ระบุไว้ด้านล่างgit diff --name-statusดูเหมือนจะไม่ต้องการแสดงไฟล์ที่เพิ่มเข้ามา @sschuberth ชี้git showซึ่งดูเหมือนจะทำงานได้อย่างถูกต้องสำหรับฉัน: git show --pretty=format: --name-status. เพียงแค่การทำgit show --name-statusจะช่วยให้ข้อมูลอีกเล็กน้อย แต่ยังคงมีความสุขและมีความหนาแน่น ... ที่จะเป็นคำสั่งกลับไปข้างใหม่ของฉัน;)
travc

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

เป็นเหมือน - ชื่อเท่านั้นยกเว้นคุณจะมีคำนำหน้าง่าย ๆ บอกคุณว่าเกิดอะไรขึ้นกับไฟล์ (แก้ไขลบเพิ่ม ... )

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

คล้ายกัน แต่การคอมมิทจะถูกแสดงหลังจากข้อความคอมมิทดังนั้นคุณสามารถเห็นได้ว่าเมื่อใดที่ไฟล์ถูกเปลี่ยน

  • หากคุณสนใจในสิ่งที่เกิดขึ้นกับบางไฟล์ / โฟลเดอร์ที่คุณสามารถผนวก-- <filename> [<filename>...]กับgit logรุ่น

  • หากคุณต้องการที่จะเห็นสิ่งที่เกิดขึ้นสำหรับการกระทำที่เรียกว่า SHA1 แล้วทำ
    git log --name-status --oneline [SHA1^..SHA1]

แฟล็กสถานะไฟล์:
แก้ไข M - แก้ไขไฟล์
C คัดลอกแก้ไข - แก้ไขไฟล์และแก้ไข
R เปลี่ยนชื่อ - แก้ไขไฟล์แล้วเปลี่ยนชื่อและแก้ไข
A เพิ่มเติม - เพิ่มไฟล์เพิ่ม
D ลบ - ลบไฟล์แล้ว
U unmerged - ไฟล์มีข้อขัดแย้งหลังการรวม


ฉันบังเอิญพูด git diff - ชื่อสถานะและมันให้ 'เพิ่มไฟล์'
aartist

1
สำหรับบันทึก git นั้นจะต้องมีจุดสองจุดระหว่าง SHA เช่น SHA1..SHA2 และ SHA ที่สองนั้นไม่ใช่ตัวเลือกดังนั้นจึงควรมีลักษณะดังนี้: บันทึก git - ชื่อ - สถานะ - ออนไลน์ [SHA1 .. SHA2]
twasbrillig

มีวิธีการยกเว้นไฟล์ / ไฟล์บางประเภทหรือไม่?
สิงหาคม

3
--relative[=<path>]ตัวเลือกที่อาจช่วยให้คุณผมไม่แน่ใจว่า มิฉะนั้นจะมีเสมอ| erep -v '(.tmp|.foo|.dontwant)$'...
artfulrobot

80

ดูเหมือนว่าไม่มีใครพูดถึงสวิตช์--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(-)

นอกจากนี้ยังมี --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

และ --shortstat

$ git diff --shortstat HEAD~5 HEAD
9 files changed, 117 insertions(+), 26 deletions(-)

4
คำตอบที่ยอมรับนั้นถูกต้อง แต่มันมีประโยชน์มากและให้ข้อมูลเพิ่มเติมเล็กน้อย ขอบคุณ!
Kontur

2
ตกลงว่านี่เป็นคำตอบที่มีประโยชน์มากขึ้นเพราะมันมีสถิติต่าง
internetross

52

แต่สำหรับการดูไฟล์ที่เปลี่ยนไประหว่างสาขาของคุณและบรรพบุรุษร่วมกับสาขาอื่น (พูดกำเนิด / ต้นแบบ)

git diff --name-only `git merge-base origin/master HEAD`

1
มันมีประโยชน์จริง ๆ ! ฉันหวังว่าฉันจะสามารถพูดgit diffstatus masterหรือคล้ายกันที่ก่อให้เกิดข้างต้น
oma

3
git show --pretty=format: --name-only origin/master..หรือ
sschuberth

คุณอาจไม่สามารถทำให้เป็นชื่อแทนคอมไพล์ได้ แต่คุณสามารถใส่ไว้ใน. bashrc ของคุณได้
Fred

3
หรือง่ายยิ่งขึ้น: git diff --name-only HEAD...master(จดสามจุด) สำหรับคำอธิบายรายละเอียดให้ดูที่นี่
ostrokach

1
ดูเหมือนว่าคำตอบที่ถูกต้องส่วนใหญ่! Simple git diff --name-only master..branchไม่สอดคล้องกับรายการ PR GitHub วิธีนี้แม่นยำยิ่งขึ้น แต่อย่างไรก็ตามฉันมี 173 ไฟล์ chaned เทียบกับ 171 ใน github PR (ไม่มีmerge-baseฉันมี 228 กับ 171)
x'ES

21

เพื่อเสริมคำตอบของ @ artfulrobot หากคุณต้องการแสดงไฟล์ที่ถูกเปลี่ยนระหว่างสองสาขา:

git diff --name-status mybranch..myotherbranch

ระวังให้ดีก่อน หากคุณวางสาขาที่ใหม่กว่าก่อนมันจะแสดงไฟล์ที่ถูกลบมากกว่าที่จะเพิ่ม

การเพิ่มgrepสามารถปรับแต่งสิ่งต่าง ๆ เพิ่มเติม:

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

จากนั้นจะแสดงเฉพาะไฟล์ที่เพิ่มเข้าmyotherbranchมา


4
Regexes เป็นคนดีและสามารถทำอะไรได้เกือบทุกอย่าง ในกรณีนี้แม้ว่าจะมี--diff-filterฟังก์ชั่นนี้ซึ่งช่วยในการทำงานซึ่งหมายความว่ามีโอกาสน้อยกว่าที่จะได้ผลลัพธ์ที่ไม่ถูกต้อง (เช่นผลบวกปลอม)
Jasper

8

เพิ่มชื่อแทนด้านล่างของคุณ~/.bash_profileจากนั้นเรียกใช้source ~/.bash_profile; ตอนนี้ทุกเวลาที่คุณต้องการดูไฟล์ที่อัพเดตในคอมมิทล่าสุด, รัน, showfilesจากที่เก็บ git ของคุณ

alias showfiles='git show --pretty="format:" --name-only'

2
หรือเพื่อให้git config --global alias.showfiles 'show --pretty="format:" --name-only' git showfiles
cgmb


5

และโปรดทราบว่าหากคุณต้องการดูไฟล์ที่เปลี่ยนแปลงระหว่างการคอมมิทล่าสุดและไฟล์ก่อนหน้า ใช้งานได้ดี:git show --name-only


3

ใช้บันทึก git --pretty = oneline> C: \ filename.log

ซึ่งจะเข้าสู่ระบบเฉพาะ oneline (--pretty = oneline) ที่ชื่อของไฟล์ที่เปลี่ยนแปลง จะบันทึกรายละเอียดทั้งหมดไปยังไฟล์เอาต์พุตของคุณ


git log --pretty=onelineให้ฉันเฉพาะ SHA และข้อความคอมมิชชันที่ใช้ git 2.10.1
damd

3

ดังที่ artfulrobot กล่าวไว้ในคำตอบของเขา:

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

ตัวอย่างของฉัน:

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


1

ต่อไปนี้ใช้งานได้ดีสำหรับฉัน:

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

นอกจากนี้ยังสามารถใช้กับการกระทำเดียว:

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

ซึ่งมีประโยชน์สำหรับการใช้งานใน Jenkins ซึ่งคุณได้รับ List of changeSet SHA แล้วและต้องการทำซ้ำเพื่อดูว่าไฟล์ใดมีการเปลี่ยนแปลง

นี่คล้ายกับคำตอบสองสามข้อด้านบน แต่การใช้tformat:แทนที่จะformat:ลบช่องว่างระหว่างการคอมมิท


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.