เมื่อเร็ว ๆ นี้ฉันถูกขอให้cherry-pick
กระทำ
ดังนั้นการเก็บเชอร์รี่ในคอมไพล์หมายความว่าอย่างไร คุณจะทำอย่างไรมันได้หรือไม่?
เมื่อเร็ว ๆ นี้ฉันถูกขอให้cherry-pick
กระทำ
ดังนั้นการเก็บเชอร์รี่ในคอมไพล์หมายความว่าอย่างไร คุณจะทำอย่างไรมันได้หรือไม่?
คำตอบ:
การเลือกเชอร์รี่ใน Git หมายถึงการเลือกคำสั่งจากสาขาหนึ่งและนำไปใช้กับสาขาอื่น
สิ่งนี้ตรงกันข้ามกับวิธีอื่น ๆ เช่นmerge
และrebase
โดยปกติแล้วจะใช้ความมุ่งมั่นมากมายในสาขาอื่น
ตรวจสอบให้แน่ใจว่าคุณอยู่ในสาขาที่คุณต้องการใช้คำสั่ง
git checkout master
ดำเนินการต่อไปนี้:
git cherry-pick <commit-hash>
หมายเหตุ:
ถ้าคุณเลือกเชอร์รี่จากสาขาสาธารณะคุณควรพิจารณาใช้
git cherry-pick -x <commit-hash>
สิ่งนี้จะสร้างข้อความยืนยันมาตรฐาน วิธีนี้คุณ (และเพื่อนร่วมงานของคุณ) ยังสามารถติดตามที่มาของการกระทำและอาจหลีกเลี่ยงการรวมความขัดแย้งในอนาคต
หากคุณมีบันทึกย่อที่แนบมากับความมุ่งมั่นพวกเขาจะไม่ทำตามเชอร์รี่เลือก หากต้องการนำมาไว้ด้วยคุณต้องใช้:
git notes copy <from> <to>
ลิงก์เพิ่มเติม:
git cherry-pick -x <commit-hash>
หากคุณเชอร์รี่เลือกจากสาขาสาธารณะคุณควรพิจารณาการใช้ สิ่งนี้จะสร้างข้อความยืนยันมาตรฐาน วิธีนี้คุณ (และเพื่อนร่วมงานของคุณ) ยังสามารถติดตามที่มาของการกระทำและอาจหลีกเลี่ยงการรวมความขัดแย้งในอนาคต
git notes copy <from> <to>
เพื่อนำพวกเขาไปด้วยเช่นกัน
"cherry-pick commit applies the changes introduced by the named commit on the current branch"
ส่วนใหญ่ ppl มีแนวโน้มที่จะคิดว่าการกระทำเป็นการเปลี่ยนแปลง (เช่น svn คือ iirc) แต่ไม่ใช่การกระทำแต่ละหมายถึงต้นไม้การทำงานที่สมบูรณ์ แม้ว่านี่จะไม่ได้สร้างความแตกต่างในกรณีนี้ แต่ก็สามารถช่วยในการทำความเข้าใจว่าทำไมคอมไพล์ทำงานเหมือน
คำพูดนี้นำมาจาก; การควบคุมเวอร์ชันด้วย Git (หนังสือยอดเยี่ยมจริง ๆ ฉันแนะนำให้คุณซื้อถ้าคุณสนใจ git)
แก้ไข: เนื่องจากคำตอบนี้ยังคงได้รับความประทับใจฉันต้องการเพิ่มดีมากในวิดีโอสอนเกี่ยวกับมัน:
Youtube: รู้เบื้องต้นเกี่ยวกับ Git cherry-pick
การใช้ git cherry-pick คำสั่ง git cherry-pick กระทำการเปลี่ยนแปลงที่แนะนำโดย commit ที่มีชื่อในสาขาปัจจุบัน มันจะแนะนำการกระทำใหม่ที่แตกต่าง การพูดอย่างเคร่งครัดโดยใช้ git cherry-pick จะไม่เปลี่ยนประวัติที่มีอยู่ในที่เก็บ มันจะเพิ่มเข้าไปในประวัติศาสตร์แทน เช่นเดียวกับการดำเนินการอื่น ๆ ของ Git ที่แนะนำการเปลี่ยนแปลงผ่านกระบวนการของการใช้ diff คุณอาจต้องแก้ไขข้อขัดแย้งเพื่อใช้การเปลี่ยนแปลงที่เกิดขึ้นจากการกระทำที่ให้ไว้ คำสั่ง git cherry-pick มักใช้เพื่อแนะนำการคอมมิตเฉพาะจากหนึ่งสาขาภายในที่เก็บไปยังสาขาอื่น การใช้งานทั่วไปคือการส่งต่อหรือพอร์ตย้อนกลับมุ่งหน้าจากสาขาการบำรุงรักษาไปยังสาขาการพัฒนา
$ git checkout rel_2.3
$ git cherry-pick dev~2 # commit F, above
ก่อน:
หลังจาก:
การเก็บเชอร์รี่ใน Git ได้รับการออกแบบมาเพื่อใช้ความมุ่งมั่นจากสาขาหนึ่งไปยังสาขาอื่น สามารถทำได้หากคุณเช่น ทำผิดพลาดและมุ่งมั่นที่จะเปลี่ยนเป็นสาขาที่ไม่ถูกต้อง แต่ไม่ต้องการรวมทั้งสาขา คุณสามารถทำได้เช่น ย้อนกลับการกระทำและเชอร์รี่เลือกในสาขาอื่น
ที่จะใช้มันคุณเพียงแค่ต้องgit cherry-pick hash
ที่hash
จะกระทำกัญชาจากสาขาอื่น ๆ
สำหรับขั้นตอนทั้งหมดโปรดดูที่: http://technosophos.com/2009/12/04/git-cherry-picking-move-small-code-patches-across-branches.html
ตัวอย่างสั้น ๆ ของสถานการณ์เมื่อคุณต้องการรับเชอร์รี่
พิจารณาสถานการณ์สมมติต่อไปนี้ คุณมีสองสาขา
a) release1 - สาขานี้จะให้ลูกค้าของคุณ แต่ยังคงมีข้อบกพร่องบางอย่างที่จะได้รับการแก้ไข
b) master - สาขามาสเตอร์คลาสสิกที่คุณสามารถเพิ่มฟังก์ชันการทำงานสำหรับ release2
ตอนนี้ : คุณแก้ไขปัญหาบางอย่างในrelease1 แน่นอนว่าคุณต้องมีการแก้ไขนี้เป็นหลักเช่นกัน และนั่นเป็นกรณีใช้งานทั่วไปสำหรับเก็บเชอร์รี่ ดังนั้นการเลือกเชอร์รี่ในสถานการณ์นี้หมายความว่าคุณรับการส่งมอบจากสาขาrelease1และรวมเข้าไปในสาขาหลัก
cherry-pick เป็นคุณสมบัติของ Git หากมีคนต้องการที่จะกระทำการกระทำที่เฉพาะเจาะจงในสาขาเดียวไปยังสาขาเป้าหมายจะใช้เชอร์รี่เลือก
คอมไพล์ขั้นตอนเชอร์รี่รับมีดังนี้
git cherry-pick <commit id>
คอมมิทกระทำนี่คือรหัสกิจกรรมของสาขาอื่น.
git cherry-pick 9772dd546a3609b06f84b680340fb84c5463264f
ฉันเตรียมภาพประกอบทีละขั้นตอนที่เชอร์รี่เลือกทำ - และภาพเคลื่อนไหวของภาพประกอบเหล่านี้ (ใกล้ถึงจุดสิ้นสุด)
บันทึก:
กระทำL'
คือจากจุดที่ผู้ใช้ในมุมมองของ (= กระทำ snapshot)L
สำเนาถูกต้องของการกระทำ
ในทางเทคนิค (ภายใน) มันเป็นคอมมิชชันใหม่ที่แตกต่างกัน (เพราะเช่นL
มีตัวชี้ไปที่K
(เป็นพาเรนต์) ในขณะที่L'
มีตัวชี้ไปยังE
)
คุณสามารถคิดว่าถ้าเชอร์รี่เลือกเป็นเหมือนการลดราคาหรือค่อนข้างจะจัดการเช่นการลดราคา โดยสิ่งนี้ฉันหมายความว่ามันใช้ความมุ่งมั่นที่มีอยู่และสร้างมันใหม่รับเป็นจุดเริ่มต้นหัวของสาขาที่คุณกำลัง
A rebase
รับค่าคอมมิชชันที่มีพาเรนต์ X และสร้างการคอมมิทใหม่ราวกับว่ามันมีพาเรนต์ Y และนี่คือสิ่งที่cherry-pick
ทำ
เชอร์รี่เลือกเป็นมากกว่าเกี่ยวกับวิธีที่คุณเลือกกระทำ ด้วยpull
(rebase) คอมไพล์จะสร้างค่าคอมมิชชันท้องถิ่นของคุณขึ้นมาใหม่บนสิ่งที่ถูกดึงไปยังสาขาของคุณ แต่ด้วยการที่cherry-pick
คุณเลือกกระทำอย่างชัดเจนและสร้างมันขึ้นมาใหม่โดยปริยายบนสาขาปัจจุบันของคุณ
ดังนั้นวิธีที่คุณทำแตกต่างกัน แต่ภายใต้ประทุนพวกเขามีการดำเนินงานที่คล้ายกันมาก - การงอกใหม่ของความมุ่งมั่น
cherry-pick
ทำงานอย่างไรเมื่อสาขาเป้าหมายถูกรวมกลับเข้าไปในสาขาต้นทางในภายหลัง ขอบคุณครับ
มันเป็นเหมือน Copy (จากที่อื่น) และ Paste (ไปยังที่อื่น) แต่สำหรับคอมมิทเฉพาะ
หากคุณต้องการแก้ไขcherry-pick
ด่วนเช่นคุณสามารถใช้คุณสมบัติได้
ทำของคุณcherry-pick
ในสาขาการพัฒนาและmerge
ที่มุ่งมั่นที่จะปล่อยสาขา ในทำนองเดียวกันทำcherry-pick
จากสาขาที่วางจำหน่ายถึงต้นแบบ voila
เมื่อคุณทำงานกับทีมนักพัฒนาในโครงการการจัดการการเปลี่ยนแปลงระหว่างสาขา git จำนวนมากอาจกลายเป็นงานที่ซับซ้อน บางครั้งคุณไม่ต้องการรวมสาขาทั้งหมดเข้ากับสาขาอื่นและจำเป็นต้องเลือกการกระทำที่เฉพาะเจาะจงหนึ่งหรือสองครั้ง กระบวนการนี้เรียกว่า 'การเก็บเชอร์รี่'
พบบทความยอดเยี่ยมเกี่ยวกับการเก็บเชอร์รี่ตรวจสอบรายละเอียดเชิงลึกได้ที่: https://www.previousnext.com.au/blog/intro-cherry-picking-git
หากคุณต้องการผสานโดยไม่ต้องผูกรหัสคุณสามารถใช้คำสั่งนี้
git cherry-pick master~2 master~0
คำสั่งดังกล่าวจะรวมการผูกพันหลักสามครั้งสุดท้ายจาก 1 ถึง 3
หากคุณต้องการทำสิ่งนี้เพียงครั้งเดียวให้ลบตัวเลือกสุดท้าย
git cherry-pick master~2
วิธีนี้คุณจะรวมการคอมมิชชันที่ 3 จากจุดสิ้นสุดของมาสเตอร์
มันจะใช้ความมุ่งมั่นเฉพาะกับสาขาปัจจุบันของคุณ
หมายความว่า:
Ex: พิจารณากระทำ
added newFileA
modified main:
+ import './newFileA'
กระทำ B
added newFileB
modified main:
+ import './newFileB'
หากคุณเลือกรับเชอร์รี่ Bในสาขาอื่นคุณจะพบกับ:
/newFileB
/main :
import './newFileA'
import './newFileB'
ตั้งแต่คอมมิทBมีnewFileBและmainแต่ไม่มีnewFileAทำให้เกิดบั๊กดังนั้นควรใช้ด้วยความระมัดระวัง
ตัดตอนมาจากเอกสารอย่างเป็นทางการ:
รับคอมมิชชันที่มีอยู่ตั้งแต่หนึ่งรายการขึ้นไปใช้การเปลี่ยนแปลงที่แนะนำแต่ละรายการบันทึกการกระทำใหม่ สิ่งนี้ต้องการให้ต้นไม้ทำงานของคุณต้องสะอาด (ไม่มีการดัดแปลงจาก HEAD commit)
เมื่อไม่ชัดเจนว่าจะใช้การเปลี่ยนแปลงอย่างไรสิ่งต่อไปนี้จะเกิดขึ้น:
สาขาปัจจุบันและตัวชี้ HEAD ยังคงอยู่ที่การกระทำครั้งสุดท้ายที่ทำสำเร็จ
การอ้างอิง CHERRY_PICK_HEAD ถูกกำหนดให้ชี้ไปที่การคอมมิชชันที่แนะนำการเปลี่ยนแปลงที่ใช้ยาก
พา ธ ที่การเปลี่ยนแปลงที่นำไปใช้อย่างสะอาดถูกอัพเดตทั้งในไฟล์ดัชนีและในแผนผังการทำงานของคุณ
สำหรับเส้นทางที่ขัดแย้งกันไฟล์ดัชนีจะบันทึกได้ถึงสามเวอร์ชันตามที่อธิบายไว้ในส่วน "TRUE MERGE" ของ git-merge ไฟล์แผนผังการทำงานจะมีคำอธิบายของความขัดแย้งที่อยู่ในเครื่องหมายความขัดแย้งตามปกติ <<<<<<< และ >>>>>>>
ไม่มีการแก้ไขอื่น ๆ