ไฟล์ git diff กับการเปลี่ยนแปลงครั้งสุดท้าย


236

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

นั่นคือถ้าเรารู้ว่า:

$ git log --oneline myfile
123abc Fix some stuff
456def Frobble the foos
789dba Initial commit

จากนั้นgit diff 456def myfileแสดงการเปลี่ยนแปลงล่าสุดเป็น myfile เป็นไปได้ที่จะทำเช่นเดียวกันโดยปราศจากความรู้ที่ผลิตโดยgit log; สิ่งที่เปลี่ยนแปลงไปใน 123abc?


8
ฉันชอบใช้git diff HEAD^ <file_path>
asgs

4
@asgs - ไม่ได้ทำสิ่งที่ฉันขอ (ด้วยเหตุผลสองประการ - HEAD^ถูก123abc, HEAD^^เป็น456defและถ้ามีการกระทำอื่น ๆที่ไม่ได้ส่งผลกระทบต่อไฟล์นี้แล้วHEAD^หมายถึงพวกเขา)
Chowlett

คุณถูกต้องพลาดส่วน "การกระทำครั้งสุดท้ายที่เปลี่ยนแปลง"
asgs

คำตอบ:


215

สิ่งนี้มีอยู่จริง แต่เป็นคุณลักษณะของgit log:

git log -p [--follow] [-1] <path>

โปรดทราบว่า-pสามารถใช้เพื่อแสดงอินไลน์ต่างจากการคอมมิทเดียว:

git log -p -1 <commit>

ตัวเลือกที่ใช้:

  • -p(ยัง-uหรือ--patch) ถูกซ่อน deeeeeeeep ในหน้าคนและเป็นจริงสำหรับตัวเลือกการแสดงgit-log git-diffเมื่อใช้กับlogมันแสดงให้เห็นแพทช์ที่จะถูกสร้างขึ้นสำหรับแต่ละกระทำพร้อมกับกระทำข้อมูลและหนัง<path>กระทำที่ไม่ได้สัมผัสที่ระบุไว้ (พฤติกรรมนี้ได้อธิบายไว้ในย่อหน้า--full-diffที่ทำให้เกิดความแตกต่างของการกระทำแต่ละรายการที่จะแสดง)
  • -1แสดงให้เห็นว่าเป็นเพียงการเปลี่ยนแปลงล่าสุดไปยังแฟ้มที่ระบุ ( -n 1สามารถนำมาใช้แทน-1); มิฉะนั้นส่วนต่างที่ไม่ใช่ศูนย์ของไฟล์นั้นจะถูกแสดง
  • --follow จำเป็นเพื่อดูการเปลี่ยนแปลงที่เกิดขึ้นก่อนการเปลี่ยนชื่อ

เท่าที่ฉันสามารถบอกได้นี่เป็นวิธีเดียวที่จะเห็นชุดการเปลี่ยนแปลงล่าสุดที่เกิดขึ้นกับไฟล์ทันทีโดยไม่ต้องใช้git log(หรือคล้ายกัน) เพื่อนับจำนวนการแก้ไขที่เข้าแทรกแซงหรือกำหนดแฮชของการกระทำ

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

เครดิตที่เครดิตครบกำหนด:

  • ฉันค้นพบว่าlog -pต้องขอบคุณคำตอบนี้
  • ให้เครดิตกับ FranciscoPuga และคำตอบนี้เพื่อแสดง--followตัวเลือกให้ฉัน
  • ให้เครดิตกับ ChrisBetti สำหรับการกล่าวถึง-n 1ตัวเลือกและ atatko สำหรับการกล่าวถึง-1ตัวแปร
  • ขอขอบคุณเครดิต sweaver2112 ที่ทำให้ฉันอ่านเอกสารและเข้าใจ-pว่า "ความหมาย" หมายถึงอะไร

6
นี่เป็นทางออกที่ดีสำหรับฉัน แสดงความมุ่งมั่นและความแตกต่างของไฟล์ปัจจุบันเมื่อฉันวิ่งgit log -p filename
Ian Jamieson

4
สมบูรณ์ หากต้องการดูการเปลี่ยนแปลงล่าสุดเพียงแค่เพิ่ม-n 1พารามิเตอร์ git log -p -n 1 filename
Chris Betti

@ChrisBetti ขอบคุณ; ฉันรวมที่เป็นคำตอบของฉัน!
Kyle Strand

1
-n 1สามารถถูกแทนที่ด้วย-1มันไม่เปลี่ยนผลลัพธ์ฉันชอบไวยากรณ์:git log -p -1 filename
atatko

1
มีตัวเลือกที่มีประโยชน์ "--skip = [n]" คุณสามารถพิมพ์git log -p -1 --skip=1 <path>เพื่อแสดงการส่งที่สอง
Maciek Łoziński

220

วิธีหนึ่งในการใช้ diff git คือ:

git diff <commit> <path>

และวิธีทั่วไปในการอ้างถึงการคอมมิชชันของการคอมมิชชันล่าสุดคือเส้นทางที่สัมพันธ์กับ HEAD จริง คุณสามารถอ้างอิงการคอมมิชชันก่อนหน้าในฐานะ HEAD ^ (ในตัวอย่างของคุณนี่คือ 123abc) หรือ HEAD ^^ (456def ในตัวอย่างของคุณ) ฯลฯ ...

ดังนั้นคำตอบสำหรับคำถามของคุณคือ:

git diff HEAD^^ myfile

6
โอ้แน่นอน ฉันพยายามHEAD^แต่แน่นอนว่าไม่ได้ทำอะไรเลย HEAD^^ไม่ได้คิดที่จะลอง
Chowlett

17
อาจจะง่ายขึ้นสำหรับไวยากรณ์ที่ใช้มานาน:HEAD~2
ibizaman

19
มันไม่เป็นความจริง (อย่างน้อยสำหรับ Git 1.9.0) ที่HEAD^^ myfileจริงจะดูที่สองที่ผ่านมากระทำการที่มีการเปลี่ยนแปลงmyfile; มันจะอ้างถึงการกระทำครั้งที่สองถึงครั้งสุดท้ายโดยรวม มีวิธีใดที่จะระบุ "ฉันต้องการดูการเปลี่ยนแปลงล่าสุดที่เกิดขึ้นกับไฟล์นี้" โดยไม่ต้องระบุแฮชการคอมมิต (บางส่วน) หรือนับจำนวนการคอมมิทระหว่างการเปลี่ยนแปลงล่าสุดที่ทำกับไฟล์นั้นและการแก้ไขปัจจุบัน
Kyle Strand

3
อืมดูเหมือนว่าgit log -pใกล้กันแล้ว
Kyle Strand

30
เหตุผล downvote: คำถามถามว่า "ระหว่างไฟล์เฉพาะที่มีอยู่ในขณะนี้และตามที่มีอยู่ก่อนการคอมมิทครั้งล่าสุดที่เปลี่ยนมัน " แต่ถ้าไฟล์นั้นไม่ถูกเปลี่ยนในการคอมมิทล่าสุดโดยรวมคำตอบนี้จะไม่ทำงาน
Chris Betti

8

หากคุณใช้เครื่องมือกราฟิกได้ผลดี:

gitk <file>

ตอนนี้ gitk จะแสดงข้อผูกพันทั้งหมดที่ไฟล์ได้รับการปรับปรุง การทำเครื่องหมายการกระทำจะแสดงให้คุณเห็นถึงความแตกต่างกับการกระทำก่อนหน้าในรายการ ยังใช้งานได้กับไดเรกทอรี แต่จากนั้นคุณจะได้รับเลือกไฟล์ที่จะแตกต่างกันสำหรับการกระทำที่เลือก สุดยอดประโยชน์!


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