จะดูการเปลี่ยนแปลงใน Git ที่คอมมิชชันได้อย่างไร?


1548

เมื่อฉันgit diff COMMITฉันเห็นการเปลี่ยนแปลงระหว่างความมุ่งมั่นนั้นและส่วนหัว (เท่าที่ฉันรู้) แต่ฉันอยากเห็นการเปลี่ยนแปลงที่เกิดขึ้นจากความมุ่งมั่นนั้น

ฉันไม่พบตัวเลือกที่ชัดเจนในdiff/ logที่จะให้ผลลัพธ์นั้นกับฉัน


คำตอบ:


1973

หากต้องการดูความแตกต่างของCOMMITแฮชเฉพาะ :

git diff COMMIT~ COMMITจะแสดงความแตกต่างระหว่างCOMMITบรรพบุรุษของCOMMITคุณกับ ดู man page สำหรับgit diffสำหรับรายละเอียดเกี่ยวกับคำสั่งและgitrevisionsเกี่ยวกับ~สัญกรณ์และเพื่อนของมัน

หรือgit show COMMITจะทำสิ่งที่คล้ายกันมาก (กระทำข้อมูลซึ่งรวมถึงความแตกต่างของ -. แต่ไม่กระทำการผสาน) ดูmanpage คอมไพล์โชว์


17
โปรดทราบว่า^จะต้องมีการเสนอราคาในเชลล์ Thomson และ Bourne (คำพ้องความหมายที่|นั่น) และrcอนุพันธ์ของมัน (ผู้ประกอบการดูแล) และzshด้วยการเปิดใช้งาน Extendedglob ( notโอเปอเรเตอร์
กลม

3
โปรดทราบว่าHEAD^หมายถึงผู้ปกครองคนแรกในกรณีที่กระทำมีหลายผู้ปกครอง (เช่นผสานกระทำ)
Mansour

23
git diff COMMIT~ COMMITใช้งานได้สำหรับฉันสังเกตเครื่องหมายตัวหนอนแทนเครื่องหมายรูปหมวก ฉันใช้ git เวอร์ชัน 2.6.1.windows.1 บน Windows 10
Juuso Ohtonen

14
@tradetree: คำว่า COMMIT ควรจะถูกแทนที่ด้วยชื่อของการกระทำบางอย่างเช่นผลรวม SHA
Nick Matteo

91
ฉันรู้สึกว่าการแสดง Git นั้นเหมาะสมกว่าสำหรับคำถามนี้และควรเป็นคำแนะนำที่กล่าวถึงก่อน
pypmannetjies

496

ดังที่กล่าวไว้ใน " ชวเลขสำหรับความแตกต่างของคอมไพล์กับแม่ของมัน? " คุณยังสามารถใช้git diffกับ:

git diff COMMIT^!

หรือ

git diff-tree -p COMMIT

ด้วยการแสดง git คุณจะต้อง (เพื่อมุ่งเน้น diff คนเดียว) ทำ:

git show --color --pretty=format:%b $COMMIT

COMMITพารามิเตอร์เป็นish กระทำ- :

กระทำวัตถุหรือวัตถุที่สามารถ dereferenced ซ้ำการกระทำวัตถุ ต่อไปนี้คือการกระทำ - ishes ทั้งหมด: วัตถุการกระทำวัตถุแท็กที่ชี้ไปที่วัตถุที่กระทำวัตถุแท็กที่ชี้ไปที่วัตถุแท็กที่ชี้ไปที่วัตถุกระทำ ฯลฯ

ดูgitrevision "การกำหนด REVISIONS"เพื่ออ้างอิงการกระทำ
ดูเพิ่มเติม " tree-ish มีความหมายอย่างไรใน Git "


370

คุณสามารถลองวิธีนี้ได้ง่ายๆ:

git show <COMMIT>

2
ดูเหมือนว่าสิ่งนี้จะทำสิ่งที่แตกต่างกันมาก
Miserable Variable

3
มันจะแสดงข้อความกระทำ ไม่ใช่ความแตกต่างของการเปลี่ยนแปลงรหัสที่ใช้สำหรับการส่งนี้
k0pernikus

1
ใช่? ในที่สุดในรุ่นคอมไพล์ที่ผ่านมา ...
เดฟ

2
นี่ควรเป็นคำตอบที่ถูกต้อง
Scott Skiles

1
นี่ควรเป็นคำตอบ
Roel

77

git show แสดงให้เห็นถึงการเปลี่ยนแปลงที่เกิดขึ้นในการกระทำล่าสุด

git show HEADเทียบเท่า

git show HEAD~1 นำคุณกลับ 1 ข้อ


45

ฉันมักจะทำ:

git diff HEAD~1

เพื่อแสดงการเปลี่ยนแปลงที่เกี่ยวข้องกับการกระทำครั้งสุดท้าย หากคุณมีภาระผูกพันเพิ่มขึ้นเพียงเพิ่มหมายเลข 1 ให้เป็นจำนวนการผูกที่คุณต้องการดู


34

ก่อนอื่นให้รับ ID การยอมรับโดยใช้

git log #to list all

หรือ

git log -p -1 #last one commit id

คัดลอกรหัสกระทำ

ตอนนี้เราใช้สองวิธีเพื่อแสดงรายการการเปลี่ยนแปลงจากการกระทำที่เจาะจง

วิธีที่ 1:

git diff commit_id^! #commit id something like this 1c6a6000asad012

วิธีที่ 2:

git show commit_id
For example: git show 1c6a600a

2
อะไร^!หมายถึง ??
Martín Coll

2
^! เป็นชวเลขสำหรับการกระทำ ^ .. กระทำซึ่งหมายความว่าจะไม่รวมผู้ปกครองทั้งหมดและตรวจสอบความแตกต่างในการกระทำนั้น
Mohideen bin Mohammed

ฉันไม่ใช่ผู้เชี่ยวชาญ แต่ฉันมีกรณี (มีหลายสาขาที่เกี่ยวข้อง) ที่บันทึกคอมไพล์ c ^! ไม่เหมือนกับบันทึก git c ^ .. c ในความเป็นจริงมันดีกว่ามาก: บันทึก git c ^ .. c แสดงรายการมากเกินไปในขณะที่บันทึก git c ^! ทำสิ่งที่ถูกต้องดังนั้นนี่คือสิ่งที่ฉันกำลังมองหาเป็นเวลานาน
user829755

32
git show <commit_sha>

สิ่งนี้จะแสดงให้คุณเห็นว่ามีอะไรเกิดขึ้นบ้าง ฉันคิดว่าคุณสามารถทำช่วงได้โดยเพียงแค่ใส่ช่องว่างระหว่างสองกระทำ shas

git show <beginning_sha> <ending_sha>

ซึ่งค่อนข้างมีประโยชน์หากคุณรีบูตบ่อยๆเพราะบันทึกคุณสมบัติของคุณจะอยู่ในแถว


25

จากหน้าคนสำหรับgit-diff (1) :

git diff [options] [<commit>] [--] [<path>…]
git diff [options] --cached [<commit>] [--] [<path>…]
git diff [options] <commit> <commit> [--] [<path>…]
git diff [options] <blob> <blob>
git diff [options] [--no-index] [--] <path> <path>

ใช้อันที่ 3 ตรงกลาง:

git diff [options] <parent-commit> <commit>

รวมทั้งจากหน้าคนเดียวกันที่ด้านล่างในส่วนตัวอย่าง :

$ git diff HEAD^ HEAD      <3>

เปรียบเทียบเวอร์ชันก่อนคอมมิทล่าสุดและคอมมิทล่าสุด

เป็นที่ทราบกันดีว่ามันเป็นคำที่สับสนเล็กน้อย

เปรียบเทียบการคอมมิชชันล่าสุดกับการคอมมิทก่อนหน้า


3
rewording git diff HEAD HEAD^ของคุณจะนำไปใช้
Richard

git diff HEAD ^ HEAD ไม่แสดงการเปลี่ยนแปลงใด ๆ
3690202

@ user3690202 เพื่อแสดงว่าไม่มีการเปลี่ยนแปลงใด ๆ ในการแสดงผล อันที่จริงเป็นกรณี?

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

@ user3690202 มีความเป็นไปได้ที่จะทำให้ "เปล่าคอมมิต" กับ Git ที่ไม่ได้มีการเปลี่ยนแปลงใด ๆ จากผู้ปกครองแม้ว่าจะมีการป้องกันในตัวที่ตรวจสอบและป้องกันสิ่งนี้แม้ว่ามันจะ overridable กับตัวเลือกบรรทัดคำสั่ง ฉันสงสัยว่าคุณตั้งใจจะสร้างความมุ่งมั่นที่ว่างเปล่าดังนั้นความเป็นไปได้อีกอย่างหนึ่งก็คือคุณมีการแปลงบรรทัดสุดท้ายก่อนหน้า (หรือสิ่งอื่น ๆ ในช่องว่างตลก) ที่หลอก Git ให้คิดว่าไม่มีการเปลี่ยนแปลงใด ๆ คุณใช้แพลตฟอร์มใดใน Git

22

ดูเหมือนว่าต่อไปนี้จะทำงาน; ฉันใช้มันเพื่อแสดงสิ่งที่ถูกผสานเข้าด้วยกัน

git whatchanged -m -n 1 -p <SHA-1 hash of merge commit>

มันจะทำงานด้วยgit logหรือไม่ (เพราะstackoverflow.com/a/18585297/6309 )
VonC

16

ความเป็นไปได้อื่น:

git log -p COMMIT -1

1
@GrantMcLean ใช่และมันมีอยู่แล้วในคำตอบ upvoted สูงสุดดังนั้นฉันจึงไม่พูดถึงมัน
John_West

11

คุณสามารถใช้git diff HEAD HEAD^1เพื่อดูความแตกต่างกับการกระทำหลัก

หากคุณต้องการเห็นรายการไฟล์เท่านั้นให้เพิ่ม--statตัวเลือก


นี่คือสิ่งที่คุณหมายถึง git diff HEAD ^ 1 HEAD
Shibir Basak

โปรดทราบว่านี่จะแสดงสิ่งที่คุณเพิ่มว่าถูกลบออกเนื่องจากจะทำการเปรียบเทียบแบบย้อนกลับ วิธีที่คุณควรอ่านdiffคำสั่งคือสิ่งที่ฉันจะต้องมีการเปลี่ยนแปลงในแฟ้มที่จะได้รับจากการกระทำHEADที่จะกระทำHEAD^1?
ระดมสมอง

9
git difftool COMMIT^ <commit hash>

เป็นไปได้เช่นกันหากคุณกำหนดค่า difftool ของคุณ

ดูที่นี่วิธีกำหนดค่า difftool หรือหน้าคู่มือได้ที่นี่

นอกจากนี้คุณสามารถใช้git diff-tree --no-commit-id --name-only -r <commit hash>เพื่อดูว่าไฟล์ใดที่ถูกเปลี่ยนแปลง / ถูกคอมมิตในแฮชการคอมมิต


9

ฉันชอบคำสั่งด้านล่างเพื่อเปรียบเทียบการกระทำที่เฉพาะเจาะจงและการกระทำที่ผ่านมา:

git diff <commit-hash>^-

ตัวอย่าง:

git diff cd1b3f485^-

6

git show COMMITหากต้องการดูผู้เขียนและเวลาโดยการกระทำการใช้งาน ซึ่งจะส่งผลดังนี้:

commit 13414df70354678b1b9304ebe4b6d204810f867e
Merge: a2a2894 3a1ba8f
Author: You <you@you.com>
Date:   Fri Jul 24 17:46:42 2015 -0700

     Merge remote-tracking branch 'origin/your-feature'

git diff --stat a2a2894 3a1ba8fหากคุณต้องการที่จะเห็นไฟล์ที่ได้รับการเปลี่ยนแปลงให้ดำเนินการดังต่อไปนี้ด้วยค่าจากบรรทัดผสานดังกล่าวข้างต้น

หากคุณต้องการดู diff ที่แท้จริงให้เรียกใช้ git --stat a2a2894 3a1ba8f


"ถ้าคุณต้องการดู diff ที่แท้จริงให้เรียกใช้git --stat a2a2894 3a1ba8f". ฉันคิดว่าคุณหมายถึงหรืออื่น ๆgit diff a2a2894 3a1ba8f unknown option: --stat
ผลไม้

5

สำหรับการตรวจสอบการเปลี่ยนแปลงทั้งหมด:

  git diff <commit_Id_1> <commit_Id_2>

สำหรับการตรวจสอบเฉพาะไฟล์ที่มีการเปลี่ยนแปลง / เพิ่ม / ลบ:

  git diff <commit_Id_1> <commit_Id_2> --name-only

หมายเหตุ : สำหรับการตรวจสอบความแตกต่างโดยไม่ต้องกระทำคุณไม่จำเป็นต้องใส่รหัสยืนยัน


4

ฉันใช้ Git เวอร์ชัน 2.6.1.windows.1 บน Windows 10 ดังนั้นฉันต้องการการแก้ไขเล็กน้อยเพื่อคำตอบของ Nevik (tilde แทนที่จะเป็น caret):

git diff COMMIT~ COMMIT

ตัวเลือกอื่นคือการพูดเครื่องหมายตกหลุม:

git diff "COMMIT^" COMMIT

3

คำสั่งนี้จะทำให้คุณได้รับแฮช parent-hash:

git log -n 2 <commit-hash>

หลังจากนั้น git diff-tool <commit-hash> <parent-commit-hash>

ตัวอย่าง:

bonnie@bonnie ~/ $ git log -n 2 7f65b9a9d3820525766fcba285b3c678e889fe3

commit 7f65b9a9d3820525766fcba285b3c678e889fe3b
Author: souparno <souparno.majumder@gmail.com>
Date:   Mon Jul 25 13:17:07 2016 +0530

CSS changed to maintain the aspect ratio of the channel logos and to fit them properly.

commit c3a61f17e14e2b80cf64b172a45f1b4826ee291f
Author: souparno <souparno.majumder@gmail.com>
Date:   Mon Jul 25 11:28:09 2016 +0530

The ratio of the height to width of the channel images are maintained.

หลังจากนี้

git difftool 7f65b9a9d3820525766fcba285b3c678e889fe3b c3a61f17e14e2b80cf64b172a45f1b4826ee291f

2

หากคุณเพียงแค่ต้องการเห็นการเปลี่ยนแปลงในการกระทำล่าสุดก็git showจะให้คุณ


1

ในกรณีที่ตรวจสอบการเปลี่ยนแปลงของแหล่งที่มาในมุมมองกราฟิก

$gitk (Mention your commit id here)

ตัวอย่างเช่น:

$gitk HEAD~1 

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