การค้นหาความแตกต่างระหว่างเวอร์ชันปัจจุบันและเวอร์ชันล่าสุด


670

เมื่อใช้ Git คุณจะพบความแตกต่างระหว่างรุ่นปัจจุบันและรุ่นล่าสุดได้อย่างไร

git diff last version:HEAD

1
หากคุณใช้ GitHub สำหรับตำแหน่งคลาวด์ของ repo ของคุณมันง่ายมาก: นำทางไปยังโครงการของคุณและคลิกที่หัวข้อ "กระทำ" ในตารางที่แสดงโครงการของคุณ
David Lundquist

1
ความหมายของ "ปัจจุบันและรุ่นสุดท้าย" ควรจะอธิบายให้ชัดเจนในคำถาม
faintsignal

คำตอบ:


1170

ฉันไม่เข้าใจความหมายของ "เวอร์ชันล่าสุด" จริงๆ

เนื่องจากความมุ่งมั่นก่อนหน้านี้สามารถเข้าถึงได้ด้วย HEAD ^ ฉันคิดว่าคุณกำลังมองหาบางสิ่งเช่น:

git diff HEAD^ HEAD

ในฐานะของ Git 1.8.5 @เป็นชื่อแทนHEADดังนั้นคุณสามารถใช้:

git diff @~..@

ต่อไปนี้จะใช้งานได้:

git show

หากคุณต้องการทราบความแตกต่างระหว่างหัวกับข้อผูกพันใด ๆ ที่คุณสามารถใช้ได้:

git diff commit_id HEAD

และสิ่งนี้จะเรียกใช้เครื่องมือแสดงภาพของคุณ (หากกำหนดค่า)

git difftool HEAD^ HEAD

เนื่องจากการเปรียบเทียบกับ HEAD เป็นค่าเริ่มต้นคุณสามารถละเว้นได้ (ดังที่อธิบายไว้โดยOrient ):

git diff @^
git diff HEAD^
git diff commit_id

คำเตือน

  • @ScottF และ @Panzercrisis อธิบายในความคิดเห็นที่หน้าต่างตัวละครที่จะต้องนำมาใช้แทน~^

ฉันต้องการบางอย่างเช่นเวอร์ชันที่ตั้งใจและเวอร์ชันก่อนหน้า ... git diff head head-1
Rajeev

7
ในฐานะของ Git 1.8.5, เป็นนามแฝงสำหรับ@ HEADและเนื่องจาก~และ^จะเหมือนกันเมื่อมีเพียงแค่การยอมรับกลับฉันพบว่าgit diff @~..@พิมพ์ได้ง่ายกว่ามาก
แอนดรู

80
@ แอนดรูว์git showยังคงง่ายกว่าเนื่องจาก@~..@เป็นสิ่งเริ่มต้นที่จะแสดง
amalloy

3
git showเพียงพิมพ์ข้อความคอมมิชชันมันจะไม่ส่งออกส่วนต่างของการเปลี่ยนแปลงเฉพาะอย่างน้อยใน Git 2.5.4 (Apple Git-61) ดังนั้นจริง ๆ แล้วมันจะไม่ใช่คำตอบสำหรับคำถามของ OP
user1944491

1
ปัญหาที่เกิดขึ้นgit showคือถ้าHEADการรวมการคอมมิชชันคุณจะไม่ได้รับสิ่งที่คุณคาดหวังเนื่องจากการรวมการคอมมิชชันเองอาจไม่มีการเปลี่ยนแปลงใด ๆ git diff HEAD^ HEADจะแสดงการเปลี่ยนแปลงที่แท้จริงระหว่างเวอร์ชัน
RubenLaguna

158

สมมติว่า "รุ่นปัจจุบัน" เป็นไดเรกทอรีที่ใช้งานได้ (การดัดแปลงแบบไม่มีข้อผูกมัด) และ "รุ่นสุดท้าย" คือHEAD(การแก้ไขที่กระทำครั้งสุดท้ายสำหรับสาขาปัจจุบัน) เพียงแค่ทำ

git diff HEAD

Cerranสินเชื่อเพื่อการดังต่อไปนี้ไปให้กับผู้ใช้

และถ้าคุณมักจะข้ามพื้นที่การแสดงละครด้วยเมื่อคุณกระทำแล้วคุณสามารถเพียงแค่ใช้-agit diff

สรุป

  1. git diff แสดงการเปลี่ยนแปลงแบบไม่มีการกำหนด
  2. git diff --cached แสดงการเปลี่ยนแปลงตามฉาก
  3. git diff HEAD แสดงการเปลี่ยนแปลงทั้งหมด (ทั้งฉากและไม่มีฉาก)

ที่มา: git-diff (1) หน้าคู่มือ - Cerran


16
และถ้าคุณมักจะข้ามพื้นที่การแสดงละครด้วยเมื่อคุณกระทำแล้วคุณสามารถเพียงแค่ใช้-a git diff<1> git diffแสดงunstagedเปลี่ยนแปลง <2> git diff --cachedแสดงการเปลี่ยนแปลงแบบฉาก <3> git diff HEADแสดงการเปลี่ยนแปลงทั้งหมด (ทั้งฉากและไม่จัดฉาก) ที่มา: git-diff (1) หน้าคู่มือ
Cerran

1
นี่ควรเป็นคำตอบที่ได้รับการยอมรับเพราะมันตอบสนองเจตนาของคำถาม
tgoneil

ชื่อ "เวอร์ชันที่ไม่มีการปรับใช้ในปัจจุบัน" ใน git คืออะไร? มีชื่อจริงเหรอ?
Mathieu CAROFF

118

ตามที่ระบุไว้ในความคิดเห็นโดยamalloyหากโดย "รุ่นปัจจุบันและรุ่นสุดท้าย" คุณหมายถึงการกระทำครั้งสุดท้ายและการกระทำก่อนหน้านั้นคุณสามารถใช้

git show

5
นี่คือสิ่งที่ฉันกำลังมองหา คำตอบที่ดี
CodeManiak

12
ใช้git show HEAD~1เพื่อแสดงการกระทำสุดท้าย แต่อย่างใดอย่างหนึ่งและgit show HEAD~2อื่น ๆ สำหรับการกระทำที่เก่ากว่า git show HEAD~2 my_fileแสดงเพียงไฟล์เดียวผ่าน
Florian Brucker

60

ความแตกต่างระหว่างการมอบหมายสุดท้าย แต่อย่างใดอย่างหนึ่งกับการกระทำครั้งสุดท้าย (รวมถึงสถานะปัจจุบันหากมี):

git diff HEAD~

หรือแม้กระทั่ง (พิมพ์ง่ายกว่า)

git diff @~

ที่@เป็น synonim สำหรับHEADสาขาในปัจจุบันและ~หมายถึง "ให้ฉันแม่ของการแก้ไขดังกล่าว"


ฉันค่อนข้างชอบgit diff HEAD^(มากกว่าHEAD~รูปแบบที่เทียบเท่า) มันง่ายกว่าที่จะจำสำหรับ "git เก่า" อย่างตัวเอง ;-)
sxc731

3
แครอทมีปัญหาในบางขั้ว ยินดีที่ได้มีตัวเลือก
light24bulbs

1
คำตอบสามารถปรับปรุงได้โดยการอธิบายความหมาย~และความ@หมาย
Bob Stein

1
หากเราเพียงต้องการตรวจสอบสิ่งที่กระทำในการส่งครั้งล่าสุดอย่าใช้สิ่งนี้ (เนื่องจากการเปลี่ยนแปลงที่สกปรกส่งผลต่อความแตกต่าง) diff HEAD^ HEADควรใช้ไวยากรณ์ที่สั้นกว่าgit diff @^!นี้ ดูgit-scm.com/docs/gitrevisionsสำหรับr1^!
Johnny Wong

@JohnnyWong ขอบคุณสำหรับการชี้แจง ฉันพูดถึง "สถานะปัจจุบัน" เพื่อไม่ให้ผู้อ่านเกิดความสับสน
Tomilov Anatoliy

53

คุณสามารถทำได้ด้วยวิธีนี้เช่นกัน:

เปรียบเทียบกับการกระทำก่อนหน้า

git diff --name-status HEAD~1..HEAD

เปรียบเทียบกับการกระทำทั้งสองปัจจุบันและก่อนหน้า

git diff --name-status HEAD~2..HEAD

16

ใช้cachedแฟล็กหากคุณเพิ่ม แต่ยังไม่ได้ทำ:

git diff --cached --color

1
นี่คือสิ่งที่ฉันกำลังมองหาเมื่อฉันพบคำถามนี้ ขอบคุณ!
William Rogers

7

เร็วและง่ายโดยสมมติว่าคุณอยู่ในตำแหน่งหลัก:

    git diff (checkout_id):file.txt file.txt

ตัวอย่าง:

    git diff asdfioei91819280din198:file.txt file.txt

4

ประการแรกใช้ " git log" เพื่อแสดงรายการบันทึกสำหรับที่เก็บ

ตอนนี้เลือกสองกระทำ ID ที่เกี่ยวข้องกับทั้งสองกระทำ คุณต้องการเห็นความแตกต่าง ( ตัวอย่าง - การกระทำที่ได้รับความนิยมสูงสุดและการกระทำที่เก่ากว่า (ตามที่คุณคาดหวังของรุ่นปัจจุบันและรุ่นเก่า) )

ถัดไปใช้:

git diff <commit_id1> <commit_id2>

หรือ

git difftool <commit_id1> <commit_id2>

3

หาก HEAD ระดับสูงชี้ไปที่ HEAD คุณสามารถทำสิ่งนี้ได้:

commit1 -> HEAD
commit2 -> HEAD~1
commit3 -> HEAD~2

ความแตกต่างระหว่างการคอมมิตครั้งแรกและครั้งที่สอง:

git diff HEAD~1 HEAD

ความแตกต่างระหว่างการคอมมิตครั้งแรกและการคอมมิชชันที่สาม:

git diff HEAD~2 HEAD

ความแตกต่างระหว่างการส่งมอบครั้งที่สองและครั้งที่สาม:

git diff HEAD~2 HEAD~1

และอื่น ๆ ...


2

ฉันใช้BitbucketกับEclipse IDE ที่ติดตั้งปลั๊กอินEclipse EGit

ฉันเปรียบเทียบไฟล์จากประวัติรุ่นใด ๆ (เช่นSVN )

เมนู Explorer โครงการ→ ไฟล์ →คลิกขวา→ ทีม → แสดงในประวัติศาสตร์

สิ่งนี้จะนำประวัติของการเปลี่ยนแปลงทั้งหมดในไฟล์นั้น ตอนนี้Ctrlคลิกขวาและเลือกสองรุ่น→ "เปรียบเทียบกับคนอื่น ๆ"


2

สิ่งนี้จะทำงานกับแท็ก (ลบ 'uniq' ด้านล่างและส่วนอื่น ๆ หากคุณต้องการดูการเปลี่ยนแปลงทั้งหมด):

 git diff v1.58 HEAD 

ด้านล่างเหมือนกันและอาจเป็นประโยชน์สำหรับการรวมอย่างต่อเนื่อง (CI) สำหรับไมโครไซต์ในที่เก็บเสาหิน:

git diff v1.58 HEAD  --name-only | sort -u | awk 'BEGIN {FS="/"} {print $1}' | uniq
<Folder Name> 

(เครดิต - https://dzone.com/articles/build-test-and-deploy-apps-independently-from-a-mo )

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