patch ใน git version control คืออะไร?


141

ฉันยังใหม่กับทั้ง git และการควบคุมเวอร์ชันดังนั้นฉันจึงพยายามหาว่าแพทช์คืออะไรและแตกต่างจากกิจกรรมอื่น ๆ ที่ฉันทำในคอมไพล์อย่างไร

ฉันจะใช้แพทช์เมื่อใด เกิดขึ้นทุกครั้งที่กระทำหรือไม่?

คำตอบ:


118

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

git patch
(ภาพจากบล็อกโพสต์ปี 2008 " Bioruby with git: ทำงานอย่างไร " เผยแพร่โดยJan AERTS )

ดูการมีส่วนร่วมกับ Rails ด้วย Gitเป็นอีกตัวอย่างที่เป็นรูปธรรม

ปัจจุบันคำขอดึง GitHub ทำให้การใช้แพตช์บน GitHub repos เป็นเรื่องง่ายมากซึ่งมีประโยชน์เมื่อคุณไม่ใช่ผู้ให้ข้อมูลโดยตรง (กล่าวคือคุณไม่มีสิทธิ์ส่งไปยัง repo โดยตรง)
อันที่จริง GitHub เพิ่งเปิดตัว " Better Pull Request Email " เพื่อปรับปรุงการแจ้งเตือนของแพตช์ใหม่


4
คำตอบที่ดีและคำตอบที่บอกฉันว่า GIT 'patch' ไม่ใช่สิ่งที่ฉันกำลังมองหา
RonLugge

94

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

หวังว่าจะช่วยได้!


ไม่เคยรู้ว่า git ใช้patchโปรแกรมในตัว ฉันคิดว่าคอมไพล์มีการนำไปใช้งานเอง
radiantshaw

47

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

จริงๆแล้วมันเป็นเรื่องความปลอดภัย (อย่างน้อยนั่นคือสิ่งที่ผู้คนใช้เพื่อ)


1
ข้อมูลเพิ่มเติม: แม้ว่า git จะไม่ใช้แพตช์ภายใน แต่เป้าหมายการออกแบบอย่างหนึ่งสำหรับ git คือทำให้ง่ายต่อการแลกเปลี่ยนแพทช์ (เนื่องจากหลายโครงการทำงานในลักษณะนั้นเช่น Linux และ git เอง) ดังนั้น git จึงมีคำสั่งพิเศษสำหรับจัดการแพตช์ ( git diffแสดงการเปลี่ยนแปลงเป็นแพตช์ตามค่าเริ่มต้นgit applyให้คุณใช้โปรแกรมแก้ไข ฯลฯ )
sleske

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

10

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

git diff > mypatch.patch

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

git diff --cached > mypatch.patch 

คุณสามารถใช้โปรแกรมแก้ไขในภายหลังได้:

git apply mypatch.patch

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


การสาธิตที่ดีขึ้น: robots.thoughtbot.com/… . สรุปตัวอย่างพื้นฐานของฉัน: git format-patch <base_commit_or_branch_name>= รวมคอมมิตทั้งหมดจากนี้กลับไปที่ <base_commit_or_branch_name> ลงในไฟล์ที่ดีและเรียบร้อยที่มีความแตกต่างเช่นเดียวกับข้อความคอมมิตเพื่อความสะดวกในการส่ง (เช่นทางอีเมล) ไปยังบุคคลอื่นที่ต้องการแก้ไข ฐานรหัสของพวกเขา จากนั้นผู้รับจะแก้ไขระบบด้วยไฟล์ของคุณ:cat *.patch | git am
Gabriel Staples

คำตอบที่มีค่าเนื่องจากข้อมูลเพิ่มเติมเกี่ยวกับการจัดเตรียมไฟล์ที่ไม่มีการติดตามเนื่องจากเป็นเรื่องง่ายที่จะมองข้าม +1
Koenigsberg

7

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

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