วิธีการมีชื่อไฟล์บันทึก git แสดงเช่น svn log -v


987

บันทึกของ SVN มีโหมด "-v" ที่ส่งออกชื่อไฟล์ของไฟล์ที่เปลี่ยนแปลงในแต่ละการกระทำเช่น:

jes5199 $ svn บันทึก -v
-------------------------------------------------- ----------------------
r1 | jes5199 | 2007-01-03 14:39:41 -0800 (พุธ, 3 มกราคม 2550) | 1 บรรทัด
เส้นทางที่เปลี่ยนแปลง:
   A / AUTHORS
   A / การคัดลอก
   A / ChangeLog
   A / วิวัฒนาการ
   A / ติดตั้ง
   A / MacOSX

มีวิธีที่รวดเร็วในการรับรายการไฟล์ที่เปลี่ยนแปลงในแต่ละคอมมิทด้วยคอมไพล์หรือไม่?


15
สงสัยว่าทำไมgit logไม่สนับสนุน-vสวิตช์อย่างที่คาดหวัง / ต้องการมากมาย </
gripe

คำตอบ:


1528

สำหรับชื่อพา ธ เต็มของไฟล์ที่เปลี่ยนแปลง:

git log --name-only

สำหรับชื่อพา ธ เต็มและสถานะของไฟล์ที่เปลี่ยนแปลง:

git log --name-status

สำหรับชื่อพา ธ แบบย่อและไฟล์ที่เปลี่ยนแปลง:

git log --stat

มีตัวเลือกมากขึ้น, ตรวจสอบเอกสาร


17
git log --numstatฉันใช้ ดูgit help logตัวเลือกเพิ่มเติม
ma11hew28

29
git log --name-only --onelineก็สวยเหมือนกัน - หนึ่งบรรทัดสีสำหรับการคอมมิชชันและหนึ่งไฟล์ต่อบรรทัด stackoverflow.com/a/14227496/1995714
cp.engr

4
ด้วย git 2.7.3 ฉันต้องใช้git log --name-status --find-renamesมันเพื่อแสดงไฟล์ที่ถูกเปลี่ยนชื่อแทนการบวก + ลบ
Suzanne Dupéron

1
โปรดทราบว่า--statตัวย่อเส้นทางยาว สามารถกำหนดความกว้างได้ แต่ฮิสโตแกรมที่ห่อหุ้มนั้นอ่านได้ยาก รูปแบบอื่นเช่น--numstatพิมพ์เส้นทางแบบเต็มเสมอ
Beni Cherniavsky-Paskin

@ ma11hew28 ขอบคุณ --numstatอยู่ที่บรรทัด 946 ของหน้าคนนั้นขณะที่คอมไพล์ 2.22.00 นั่นเป็นจำนวนมากตัวเลือกมากขึ้นกว่าคนส่วนใหญ่ต้องการ
Reinstate Monica - M. Schröder

139

หมายเหตุ:เลิกใช้แล้วให้ใช้แทน git whatchangedgit log

ผู้ใช้ใหม่ควรใช้ git-log [1]แทน whatchangedคำสั่งเป็นหลักเช่นเดียวกับ คอมไพล์เข้าสู่ระบบ [1]แต่เริ่มต้นที่แสดงให้เห็นการส่งออกรูปแบบต่างดิบและที่จะข้ามผสาน

คำสั่งถูกเก็บรักษาไว้เป็นหลักด้วยเหตุผลทางประวัติศาสตร์ นิ้วของหลาย ๆ คนที่เรียนรู้ Git มานานgit logถูกคิดค้นโดยการอ่านรายชื่อผู้รับจดหมาย Linux kernel ได้รับการฝึกฝนให้พิมพ์


คุณสามารถใช้คำสั่งgit whatchanged --statเพื่อรับรายการไฟล์ที่เปลี่ยนแปลงในแต่ละการกระทำ (พร้อมกับข้อความการส่ง)

อ้างอิง


50

git show ยังเป็นคำสั่งที่ดี

มันเป็นชนิดที่ชอบsvn diffแต่คุณสามารถผ่านมันกระทำ guid และเห็นความแตกต่าง


46

หากคุณต้องการได้รับชื่อไฟล์โดยไม่มีข้อความยืนยันที่เหลือคุณสามารถใช้:

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

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


1
หมายเหตุเกี่ยวกับช่องว่างในตัวอย่างข้างต้น - git log --stat --pretty="format:" $branchNameมันเหมือน ตัวอย่างเช่น git log --stat --pretty="format:" $(git rev-parse --abbrev-ref HEAD). ในขณะที่ฉันอยู่ที่นี่นี่เป็นคาถาที่ถูกต้องที่เกี่ยวข้องกับจุดประสงค์ของฉัน:git log --name-only --pretty="format: " master..$(git rev-parse --abbrev-ref HEAD)
Driftcatcher

41

ฉันใช้สิ่งนี้ทุกวันเพื่อแสดงประวัติด้วยไฟล์ที่เปลี่ยนแปลง:

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

เพื่อให้สั้นเพิ่มนามแฝงในของคุณ.gitconfigโดยทำ:

git config --global alias.ls 'log --stat --pretty=short --graph'

ของฉันอยู่ใกล้มาก, บันทึกคอมไพล์ --pretty = oneline - กราฟ - ชื่อสถานะ ฉันพบว่ามันกระชับมากขึ้นเพียงแค่แสดงรายการไฟล์ที่เปลี่ยนแปลง
ปีเตอร์ซูวาร่า

15

ฉันใช้สิ่งนี้:

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
...

7

git diff --stat HEAD^!แสดงไฟล์ที่มีการเปลี่ยนแปลงและการเพิ่ม / ลบบรรทัดนับสำหรับการกระทำครั้งสุดท้าย ( HEAD)

สำหรับฉันดูเหมือนว่าไม่มีคำสั่งเดียวที่จะได้รับผลลัพธ์ที่รัดกุมประกอบด้วยเพียงชื่อไฟล์และเพิ่มและลบจำนวนบรรทัดสำหรับหลายคอมมิทในครั้งเดียวดังนั้นฉันจึงสร้างสคริปต์ทุบตีของฉันเองสำหรับสิ่งนั้น:

#!/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 diff --stat HEAD..masterสามารถแสดงความแตกต่างระหว่าง HEAD และมาสเตอร์หรือไม่เกิดขึ้นเมื่อคุณโพสต์คำตอบของคุณในปี 2012
Ferrybig

1
คำถาม @Ferrybig OP เป็นเรื่องเกี่ยวกับวิธีการ"ที่จะได้รับรายชื่อของไฟล์ที่มีการเปลี่ยนแปลงในแต่ละกระทำ"ไม่เกี่ยวกับความแตกต่างระหว่างและHEAD masterนั่นเป็นสองสิ่งที่แตกต่างกัน
nrz

4

ฉันพบว่าต่อไปนี้เป็นหน้าจอที่เหมาะสำหรับการแสดงรายการไฟล์ที่เปลี่ยนแปลงต่อการคอมมิทในรูปแบบรัดกุม:

git log --pretty=oneline --graph --name-status

3

สรุปคำตอบพร้อมเอาต์พุตตัวอย่าง

นี่คือการใช้พื้นที่เก็บข้อมูลในท้องถิ่นที่มีห้ากระทำอย่างง่าย

‣ 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


0

คำสั่งที่มีประโยชน์อื่นจะเป็นgit diff-tree <hash>ที่ที่แฮชสามารถเป็นช่วงแฮชได้ (แสดงโดย<old>..<new>สัญกรณ์) ตัวอย่างผลลัพธ์:

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

สาขาที่:

โหมดต้นทาง, โหมดปลายทาง, แฮชต้นทาง, แฮชปลายทาง, สถานะ, ชื่อไฟล์

สถานะคือสิ่งที่คุณคาดหวัง: D (ถูกลบ), A (เพิ่มเติม), M (แก้ไข) ฯลฯ ดูที่หน้า man สำหรับคำอธิบายแบบเต็ม


0

ฉันมักจะใช้สิ่งเหล่านี้เพื่อรับบันทึก:

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

$ git log --name-status --grep="<text from Commit message>"

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