ฉันยังใหม่กับทั้ง git และการควบคุมเวอร์ชันดังนั้นฉันจึงพยายามหาว่าแพทช์คืออะไรและแตกต่างจากกิจกรรมอื่น ๆ ที่ฉันทำในคอมไพล์อย่างไร
ฉันจะใช้แพทช์เมื่อใด เกิดขึ้นทุกครั้งที่กระทำหรือไม่?
ฉันยังใหม่กับทั้ง git และการควบคุมเวอร์ชันดังนั้นฉันจึงพยายามหาว่าแพทช์คืออะไรและแตกต่างจากกิจกรรมอื่น ๆ ที่ฉันทำในคอมไพล์อย่างไร
ฉันจะใช้แพทช์เมื่อใด เกิดขึ้นทุกครั้งที่กระทำหรือไม่?
คำตอบ:
คุณสามารถดูในบล็อกโพสต์นี้ว่าคุณจะสร้างแพตช์ได้อย่างไร (ชุดของการเปลี่ยนแปลงที่คุณต้องการสื่อสารและนำไปใช้กับ repo อื่น)
(ภาพจากบล็อกโพสต์ปี 2008 " Bioruby with git: ทำงานอย่างไร " เผยแพร่โดยJan AERTS )
ดูการมีส่วนร่วมกับ Rails ด้วย Gitเป็นอีกตัวอย่างที่เป็นรูปธรรม
ปัจจุบันคำขอดึง GitHub ทำให้การใช้แพตช์บน GitHub repos เป็นเรื่องง่ายมากซึ่งมีประโยชน์เมื่อคุณไม่ใช่ผู้ให้ข้อมูลโดยตรง (กล่าวคือคุณไม่มีสิทธิ์ส่งไปยัง repo โดยตรง)
อันที่จริง GitHub เพิ่งเปิดตัว " Better Pull Request Email " เพื่อปรับปรุงการแจ้งเตือนของแพตช์ใหม่
Patchเป็นโปรแกรม Unix ที่อัพเดตไฟล์ข้อความตามคำแนะนำที่มีอยู่ในไฟล์แยกต่างหากเรียกว่าไฟล์ patch
ดังนั้นกล่าวอีกนัยหนึ่งอาจหมายถึงไฟล์ที่มีคำสั่งหรือโปรแกรมที่ประมวลผลไฟล์นั้นและนำไปใช้กับบางสิ่ง
ตอนนี้ไฟล์แพทช์คืออะไร? สมมติว่าคุณมีไฟล์ข้อความ 2 บรรทัด:
This is line A.
This is line B, or otherwise #2.
จากนั้นคุณเปลี่ยนบรรทัดแรกและตอนนี้ไฟล์ของคุณมีลักษณะดังนี้:
This is SPARTA.
This is line B, or otherwise #2.
คุณจะอธิบายการเปลี่ยนแปลงเนื้อหาของไฟล์อย่างไร คุณสามารถพูดได้ว่าบรรทัดแรก "นี่คือบรรทัด A" ถูกแทนที่ด้วย "This is SPARTA" หรือแม้แต่คำสุดท้าย "A" ของบรรทัดแรกแทนที่ด้วยคำอื่น "SPARTA" และนั่นคือสิ่งที่แตกต่างบอกเรา สมมติว่าฉันมีไฟล์นี้สองเวอร์ชันหนึ่งชื่อว่า file1.txt และอีกไฟล์หนึ่ง file2.txt จากนั้นฉันจะเรียกใช้ diff และรับสิ่งนี้:
$ diff -u file1.txt file2.txt
--- file1.txt 2011-11-26 11:07:03.131010360 -0500
+++ file2.txt 2011-11-26 11:07:13.171010362 -0500
@@ -1,2 +1,2 @@
-This is line A.
+This is SPARTA.
This is line B, or otherwise #2.
การมีคำอธิบายของการเปลี่ยนแปลงคุณสามารถนำไปใช้กับเนื้อหาเริ่มต้นและรับเนื้อหาที่แก้ไขได้ และการเปลี่ยนแปลงเหล่านั้นใส่ในรูปแบบรวมที่โปรแกรมเหมือน "patch" สามารถเข้าใจได้เรียกว่าไฟล์แพทช์ เหมือนกับแทนที่จะได้ปลาจากคนที่พวกเขาสอนวิธีตกปลาเพื่อที่คุณจะได้ขุดปลานั้นออกมาจากน้ำด้วยตัวเอง ตอนนี้เรามาใช้โปรแกรมแก้ไขของเรากับ file1.txt เพื่อให้ดูเหมือน file2.txt:
$ cat file1.txt
This is line A.
This is line B, or otherwise #2.
$ cat file2.txt
This is SPARTA.
This is line B, or otherwise #2.
$ diff -u file1.txt file2.txt > changes.patch
$ cat changes.patch
--- file1.txt 2011-11-26 11:09:38.651010370 -0500
+++ file2.txt 2011-11-26 11:07:13.171010362 -0500
@@ -1,2 +1,2 @@
-This is line A.
+This is SPARTA.
This is line B, or otherwise #2.
$ patch < changes.patch
patching file file1.txt
$ cat file1.txt
This is SPARTA.
This is line B, or otherwise #2.
$
คุณอาจคิดว่ามันง่ายกว่าที่จะมีไฟล์สองเวอร์ชันนี้ ในกรณีง่ายๆที่เป็นจริงนี้ แต่เมื่อคุณมีไฟล์จำนวนมากและไฟล์เหล่านั้นมีขนาดใหญ่มากการมีการเปลี่ยนแปลงสองสามบรรทัดจะมีประสิทธิภาพมากกว่าการทำสำเนาสองชุด
เมื่อพูดถึง git ไฟล์ patch ยังคงหมายถึงสิ่งเดียวกัน แต่การใช้ diff + patch ตัวเองจะเป็นฝันร้าย ตัวอย่างเช่นคุณจะต้องมีการเช็คเอาต์ไฟล์สองเวอร์ชัน (หรือแม้แต่ที่เก็บทั้งหมด) เพื่อเปรียบเทียบ ฟังดูไม่ดีใช่ไหม ดังนั้น git จะดูแลงานหนักทั้งหมดให้คุณโดยจะเปรียบเทียบไฟล์ในเครื่องของคุณกับสิ่งที่มีอยู่ในที่เก็บที่คุณใช้งานอยู่และสามารถแสดงให้คุณเห็นเป็น "diff" หรือใช้ "diff" นั้นเป็น a patch aka ยอมรับการเปลี่ยนแปลงของคุณหรือแม้กระทั่งให้คุณใช้ไฟล์แก้ไขบางไฟล์ที่คุณมีอยู่แล้ว โดยไม่ต้องลงลึกในรายละเอียดในแง่นี้ git ก็เหมือนกับระบบควบคุมเวอร์ชันอื่น ๆ เช่น SVN หรือแม้แต่ CVS หรือ perforce
หวังว่าจะช่วยได้!
patch
โปรแกรมในตัว ฉันคิดว่าคอมไพล์มีการนำไปใช้งานเอง
โปรแกรมแก้ไขเป็นไฟล์ขนาดเล็กที่ระบุการเปลี่ยนแปลงที่เกิดขึ้นในที่เก็บ โดยทั่วไปจะใช้เมื่อมีคนจากภายนอกทีมของคุณมีสิทธิ์เข้าถึงแบบอ่านอย่างเดียว แต่มีการเปลี่ยนแปลงรหัสที่ดี จากนั้นเขาก็สร้างแพทช์และส่งให้คุณ คุณนำไปใช้และส่งไปยังที่เก็บ git จากนั้นทุกคนจะได้รับประโยชน์จากเวอร์ชันที่อัปเดตและผู้เขียนโปรแกรมแก้ไขไม่จำเป็นต้องเข้าถึงการอ่าน / เขียน
จริงๆแล้วมันเป็นเรื่องความปลอดภัย (อย่างน้อยนั่นคือสิ่งที่ผู้คนใช้เพื่อ)
git diff
แสดงการเปลี่ยนแปลงเป็นแพตช์ตามค่าเริ่มต้นgit apply
ให้คุณใช้โปรแกรมแก้ไข ฯลฯ )
ไฟล์แพทช์แสดงชุดการเปลี่ยนแปลงชุดเดียวที่สามารถนำไปใช้กับสาขาใดก็ได้ในลำดับใดก็ได้ เมื่อใช้โปรแกรมแก้ไขคุณจะได้รับความแตกต่างระหว่างไฟล์ตั้งแต่หนึ่งไฟล์ขึ้นไป และในภายหลังคุณสามารถใช้ความแตกต่าง (แพทช์) เพื่อรับการเปลี่ยนแปลงในไฟล์ใหม่ มีการใช้งานมากมายสำหรับโปรแกรมแก้ไขใน Git หากคุณมีการเปลี่ยนแปลงที่ไม่ได้กำหนดไว้ในไดเร็กทอรีการทำงานของคุณและคุณจำเป็นต้องนำการเปลี่ยนแปลงนั้นไปใช้ที่อื่นเพียงแค่สร้างโปรแกรมแก้ไขและใช้โปรแกรมแก้ไข
git diff > mypatch.patch
หากคุณมีไฟล์ใหม่ในที่เก็บของคุณ (ไม่ได้ติดตาม) คุณควรจัดเวทีไฟล์ก่อนสร้างแพตช์ (อย่าคอมมิต) และใช้คำสั่งต่อไปนี้
git diff --cached > mypatch.patch
คุณสามารถใช้โปรแกรมแก้ไขในภายหลังได้:
git apply mypatch.patch
หากคุณต้องการทำการเปลี่ยนแปลงบางอย่างกับที่เก็บ git โดยที่คุณไม่มีสิทธิ์ในการเขียนเพียงแค่ทำการเปลี่ยนแปลงและสร้างแพตช์ระหว่างทั้งสองจากนั้นส่งแพตช์ไปให้คนที่มีสิทธิ์ในการใช้แพตช์ตามนี้ ควรเพิ่มการเปลี่ยนแปลงของคุณไปยังที่เก็บ git นั้น
git format-patch <base_commit_or_branch_name>
= รวมคอมมิตทั้งหมดจากนี้กลับไปที่ <base_commit_or_branch_name> ลงในไฟล์ที่ดีและเรียบร้อยที่มีความแตกต่างเช่นเดียวกับข้อความคอมมิตเพื่อความสะดวกในการส่ง (เช่นทางอีเมล) ไปยังบุคคลอื่นที่ต้องการแก้ไข ฐานรหัสของพวกเขา จากนั้นผู้รับจะแก้ไขระบบด้วยไฟล์ของคุณ:cat *.patch | git am
แพตช์คือชุดของความแตกต่างระหว่างไฟล์อย่างน้อยหนึ่งไฟล์เพื่อแสดงความแตกต่างระหว่างไฟล์เหล่านี้ โดยทั่วไปคุณจะสร้างโปรแกรมแก้ไขเพื่อแสดงให้คนอื่นเห็นสิ่งที่คุณเปลี่ยนแปลงเท่านั้น ตัวอย่างของเวลาที่คุณอาจทำเช่นนี้คือเมื่อคุณค้นหาและแก้ไขข้อบกพร่องในแอปพลิเคชันโอเพนซอร์สจากนั้นโพสต์การแก้ไขในตัวติดตามข้อบกพร่อง