ความแตกต่างระหว่าง 'git format-patch และ' git diff 'คืออะไร?


92

ฉันไม่เห็นความแตกต่างระหว่างผลลัพธ์ของ 'git format-patch' และ 'git diff' เลยมีไหม และฉันจะไม่สามารถใช้ 'git diff' เพื่อสร้างโปรแกรมแก้ไขแล้วใช้โดยใช้ git ได้หรือไม่?

ปัญหาของฉันคือฉันได้เพิ่มการเปลี่ยนแปลงลงในดัชนี แต่ดูเหมือนว่า git format-patch จะยอมรับเฉพาะ commits ดังนั้นหากฉันสามารถใช้เอาต์พุตของ diff ได้ฉันก็สามารถใช้คำสั่งนี้เพื่อสร้างแพตช์สำหรับการเปลี่ยนแปลงในดัชนี:

git diff --cached > index.patch

คำตอบ:


130

แพตช์ที่สร้างด้วยgit format-patchจะรวมข้อมูลเมตาบางอย่างเกี่ยวกับคอมมิต (คอมมิทเตอร์วันที่ข้อความคอมมิต ... ) และจะมีข้อมูลไบนารีที่แตกต่างกัน ทุกอย่างจะถูกจัดรูปแบบเป็นจดหมายเพื่อให้สามารถส่งได้อย่างง่ายดาย จากนั้นบุคคลที่ได้รับจะสามารถสร้างการกระทำที่เกี่ยวข้องขึ้นมาใหม่ได้git amและข้อมูลเมตาทั้งหมดจะไม่เสียหาย นอกจากนี้ยังสามารถใช้งานได้git applyเนื่องจากเป็นชุดค่าความแตกต่างที่เรียบง่าย

แพทช์ที่บรรจุด้วยgit diffจะเป็นความแตกต่างอย่างง่ายกับบริบท (คิดว่าdiff -u) นอกจากนี้ยังสามารถนำไปใช้กับgit applyแต่ข้อมูลเมตาจะไม่ถูกสร้างขึ้นใหม่ (เนื่องจากไม่มีอยู่)

โดยสรุปgit format-patchมีประโยชน์ในการส่งคอมมิตในขณะที่git diffมีประโยชน์ในการรับความแตกต่างระหว่างต้นไม้สองต้น


13

จากคู่มือgit-format-patch จะเตรียมแพตช์ที่เหมาะสมสำหรับการส่งอีเมลในขณะที่git-diffจะแสดงการเปลี่ยนแปลง

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

ยังgit-format-patchสร้างไฟล์แพตช์สำหรับแต่ละคอมมิตในช่วงที่คุณระบุ git-amการเปลี่ยนแปลงเหล่านี้จะถูกเพิ่มเป็นมุ่งมั่นที่จะเก็บข้อมูลของคุณด้วย

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

และใช่คุณสามารถสร้างแพตช์สำหรับดัชนีของคุณด้วยวิธีนั้น


ขอบคุณ. มีอะไรพิเศษเกี่ยวกับ UNIX mail เพื่อให้พวกเขาออกแบบแพตช์ตามมัน?
Rafid

7
ไม่มีอะไรพิเศษจริงๆ นี่เป็นเพียงคอมไพล์ที่ออกแบบโดย Linus Torvalds ซึ่งเวิร์กโฟลว์เกี่ยวข้องกับการส่งและรับแพตช์ทางอีเมลเพื่อการตรวจสอบความถูกต้องก่อนที่จะรวมเข้ากับเคอร์เนล Linux
Sylvain Defresne

Git ได้รับการออกแบบโดย Linus Torvaldsเพื่อเก็บเคอร์เนลของ Linux ไว้ Unix mail เป็นรูปแบบทั่วไป
Abizern

1

ไฟล์แพตช์สามารถสร้างได้ด้วยgit diffคำสั่ง แต่เมื่อเปรียบเทียบกับโปรแกรมแก้ไขที่สร้างโดยgit format-patchคำสั่งความแตกต่างที่สำคัญคือ:

  1. ไม่มีข้อมูลเมตาเกี่ยวกับการคอมมิต (เช่นวันที่ผู้เขียนข้อความคอมมิต ฯลฯ );
  2. ไม่มีสถิติเกี่ยวกับความแตกต่าง (diffstat เช่นไฟล์ x เปลี่ยนแปลงการแทรก y (+) การลบ z (-));
  3. ไม่มีไบนารีแตกต่างมีเพียงข้อความที่แตกต่างเท่านั้น

ป้อนคำอธิบายภาพที่นี่

ในการสร้างไฟล์แพตช์สำหรับไฟล์ที่เปลี่ยนแปลงทั้งหมด (ในดัชนีหรือไดเร็กทอรีการทำงาน):

git diff HEAD --binary > my.patch
# git diff + git diff --cached/staged == git diff HEAD

ในการใช้ไฟล์แพตช์ที่สร้างขึ้น:

# restore the changed files firstly
git restore --staged .
git restore .

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