กล่าวว่าฉันมีการเปลี่ยนแปลงที่ไม่มีข้อผูกมัดในไดเรกทอรีทำงานของฉัน ฉันจะสร้างโปรแกรมปะแก้จากผู้ที่ไม่ต้องสร้างการผูกมัดได้อย่างไร?
กล่าวว่าฉันมีการเปลี่ยนแปลงที่ไม่มีข้อผูกมัดในไดเรกทอรีทำงานของฉัน ฉันจะสร้างโปรแกรมปะแก้จากผู้ที่ไม่ต้องสร้างการผูกมัดได้อย่างไร?
คำตอบ:
git diff
สำหรับการเปลี่ยนแปลงที่ไม่จัดเตรียม git diff --cached
สำหรับการเปลี่ยนแปลงฉาก
git format-patch
ยังรวมถึง diffs แบบไบนารีและข้อมูลเมตาบางส่วน ที่จริงแล้วจะเป็นทางออกที่ดีที่สุดสำหรับการสร้างแพทช์ แต่ afaik ใช้งานได้กับการตรวจสอบในแหล่งที่มา / การเปลี่ยนแปลงเท่านั้นใช่มั้ย
git diff --relative
หากคุณยังไม่ได้ทำการเปลี่ยนแปลงใด ๆ :
git diff > mypatch.patch
แต่บางครั้งมันก็เกิดขึ้นส่วนหนึ่งของสิ่งที่คุณทำคือไฟล์ใหม่ที่ไม่ได้ติดตามและจะไม่อยู่ในgit diff
ผลลัพธ์ของคุณ ดังนั้นวิธีหนึ่งในการทำแพทช์คือการทำทุกอย่างเพื่อคอมมิชชันใหม่ ( git add
แต่ละไฟล์หรือเพียงแค่git add .
) แต่อย่าทำการคอมมิทแล้ว:
git diff --cached > mypatch.patch
เพิ่มตัวเลือก 'binary' หากคุณต้องการเพิ่มไฟล์ไบนารีลงในแพทช์ (เช่นไฟล์ mp3):
git diff --cached --binary > mypatch.patch
คุณสามารถใช้โปรแกรมแก้ไขในภายหลัง:
git apply mypatch.patch
หมายเหตุ: คุณยังสามารถใช้เป็นไวพจน์ของ--staged
--cached
git diff --no-color
ล้มเหลวในการที่กรณีลอง มิฉะนั้นดูเหมือนว่าปัญหาการเข้ารหัส
git diff
และgit apply
จะใช้งานได้กับไฟล์ข้อความ แต่จะไม่ทำงานสำหรับไฟล์ไบนารี
คุณสามารถสร้างแพทช์ไบนารีแบบเต็มได้อย่างง่ายดาย แต่คุณจะต้องสร้างการคอมมิตชั่วคราว เมื่อคุณดำเนินการชั่วคราวแล้วคุณสามารถสร้างแพตช์ด้วย:
git format-patch <options...>
หลังจากที่คุณได้ทำการแก้ไขเรียกใช้คำสั่งนี้:
git reset --mixed <SHA of commit *before* your working-changes commit(s)>
สิ่งนี้จะย้อนกลับการกระทำชั่วคราวของคุณ ผลลัพธ์สุดท้ายทำให้สำเนาทำงานของคุณ (โดยเจตนา) สกปรกด้วยการเปลี่ยนแปลงแบบเดิมที่คุณมี
ในด้านการรับคุณสามารถใช้กลอุบายเดียวกันเพื่อใช้การเปลี่ยนแปลงกับสำเนาการทำงานโดยไม่ต้องมีประวัติการส่งมอบ เพียงแค่ใช้แพทช์ (e) git reset --mixed <SHA of commit *before* the patches>
และ
โปรดทราบว่าคุณอาจต้องซิงค์ให้ตัวเลือกทั้งหมดใช้งานได้ ฉันเห็นข้อผิดพลาดบางอย่างเมื่อนำแพตช์มาใช้เมื่อบุคคลทำให้พวกเขาไม่ได้ทำการเปลี่ยนแปลงมากเท่าที่ฉันเคยมี อาจมีวิธีที่จะทำให้มันใช้งานได้ แต่ฉันไม่ได้มองไปไกล
ต่อไปนี้เป็นวิธีสร้างแพตช์เดียวกันใน Tortoise Git (ไม่ใช่ที่ฉันแนะนำให้ใช้เครื่องมือนั้น):
Tortoise Git
->Create Patch Serial
Since
: ใช้FETCH_HEAD
งานได้หากคุณได้รับข้อมูลให้ตรงกัน)Tortise Git
->Show Log
reset "<branch>" to this...
Mixed
ตัวเลือกและวิธีการใช้งาน:
Tortoise Git
->Apply Patch Serial
Tortise Git
->Show Log
reset "<branch>" to this...
Mixed
ตัวเลือกในการสร้างแพทช์ที่มีทั้งไฟล์ที่ถูกแก้ไขและใหม่ (ฉาก) คุณสามารถเรียกใช้:
git diff HEAD > file_name.patch
git diff --cached > mypatch.patch
ใช้งานไม่ได้
file_name.patch
ใช้งานได้patch
หรือไม่ พวกเขาเข้ากันได้หรือไม่
ฉันชอบ:
git format-patch HEAD~<N>
โดยที่<N>
จำนวนครั้งล่าสุดที่ยอมรับเพื่อบันทึกเป็นแพตช์
รายละเอียดวิธีการใช้คำสั่งอยู่ในDOC
UPD ที่
นี่คุณสามารถค้นหาวิธีการใช้งานได้
UPDสำหรับผู้ที่ไม่ได้รับแนวคิดในการformat-patch
เพิ่มนามแฝง:
git config --global alias.make-patch '!bash -c "cd ${GIT_PREFIX};git add .;git commit -m ''uncommited''; git format-patch HEAD~1; git reset HEAD~1"'
จากนั้นที่ไดเรกทอรีใด ๆ ของที่เก็บโครงการของคุณทำงาน:
git make-patch
คำสั่งนี้จะสร้าง0001-uncommited.patch
ที่ไดเรกทอรีปัจจุบันของคุณ Patch จะมีการเปลี่ยนแปลงทั้งหมดและไฟล์ที่ไม่ได้ติดตามซึ่งสามารถมองเห็นได้ในคำสั่งถัดไป:
git status .
หากคุณต้องการที่จะทำไบนารีให้ตัวเลือกเมื่อคุณเรียกใช้--binary
git diff
นอกจากนี้เรายังสามารถระบุไฟล์เพื่อรวมเฉพาะไฟล์ที่มีการเปลี่ยนแปลงสัมพัทธ์โดยเฉพาะเมื่อมันครอบคลุมหลายไดเรกทอรีเช่น
git diff ~/path1/file1.ext ~/path2/file2.ext...fileN.ext > ~/whatever_path/whatever_name.patch
ฉันพบว่าสิ่งนี้ไม่ได้ระบุไว้ในคำตอบหรือความคิดเห็นซึ่งเกี่ยวข้องและถูกต้องทั้งหมดดังนั้นเลือกที่จะเพิ่ม ชัดเจนดีกว่านัย!