ความแตกต่างระหว่างgit merge
และgit rebase
คืออะไร
ความแตกต่างระหว่างgit merge
และgit rebase
คืออะไร
คำตอบ:
สมมติว่าเดิมมี 3 กระทำ, A
, B
, C
:
จากนั้นนักพัฒนาสร้างแดนกระทำD
และนักพัฒนาสร้างเอ็ดกระทำE
:
เห็นได้ชัดว่าความขัดแย้งนี้ควรได้รับการแก้ไขอย่างใด สำหรับสิ่งนี้มี 2 วิธี:
รวม :
ทั้งสองกระทำD
และE
ยังคงอยู่ที่นี่ แต่เราจะสร้างการผสานกระทำM
ที่สืบทอดการเปลี่ยนแปลงทั้งจากและD
E
อย่างไรก็ตามสิ่งนี้สร้างรูปร่างของเพชรซึ่งหลายคนพบว่าสับสนมาก
การอ้างอิง :
เราสร้างคอมR
มิชชันซึ่งเนื้อหาไฟล์จริงนั้นเหมือนกับคอมมิชชันคอมมิชชันM
ด้านบน แต่เรากำจัดการกระทำE
เหมือนที่มันไม่เคยมีอยู่ (แสดงโดยจุด - เส้นที่หายไป) เนื่องจากข้อ จำกัด นี้E
ควรอยู่ในพื้นที่ของนักพัฒนา Ed และไม่เคยถูกผลักไปยังที่เก็บอื่น ข้อได้เปรียบของการรีบูตคือการหลีกเลี่ยงรูปทรงเพชรและประวัติศาสตร์ยังคงเป็นเส้นตรงที่ดีนักพัฒนาส่วนใหญ่ชอบที่!
git merge
ไม่แทรกสอด (แต่มันอาจปรากฏขึ้นโดยดูที่git log
) แต่git merge
ให้รักษาทั้งประวัติศาสตร์การพัฒนาโดยแดนและเอ็ดไว้เหมือนเดิมตามที่เห็นจากแต่ละมุมมองในแต่ละครั้ง git rebase
ทำให้ดูเหมือนว่า Dan ทำงานกับมันก่อนและเอ็ดก็ติดตามเขา ในทั้งสองกรณี (ผสานและรีบูต) ทรีไฟล์ผลลัพธ์ที่แท้จริงนั้นเหมือนกันทุกประการ
ฉันรักข้อความที่ตัดตอนมานี้จาก10 สิ่งที่ฉันเกลียดเกี่ยวกับคอมไพล์ (มันให้คำอธิบายสั้น ๆ สำหรับการรีบูตในตัวอย่างที่สอง):
3. เอกสารเส็งเคร็ง
หน้า man เป็นหนึ่งยิ่ง“ f *** you” 1 . พวกเขาอธิบายคำสั่งจากมุมมองของนักวิทยาศาสตร์คอมพิวเตอร์ไม่ใช่ผู้ใช้ กรณีในจุด:
git-push – Update remote refs along with associated objects
นี่คือคำอธิบายสำหรับมนุษย์:
git-push – Upload changes from your local repository into a remote repository
อัปเดตอีกตัวอย่าง: (ขอบคุณ cgd)
git-rebase – Forward-port local commits to the updated upstream head
แปล:
git-rebase – Sequentially regenerate a series of commits so they can be applied directly to the head node
แล้วเราก็มี
git-merge - Join two or more development histories together
ซึ่งเป็นคำอธิบายที่ดี
1. ไม่แน่ใจในต้นฉบับ
โดยส่วนตัวแล้วฉันไม่พบว่าเทคนิคการสร้างแผนภาพมาตรฐานมีประโยชน์มากนัก - ลูกศรดูเหมือนจะชี้ไปในทางที่ผิดสำหรับฉัน (โดยทั่วไปแล้วพวกเขาชี้ไปที่ "ผู้ปกครอง" ของแต่ละการกระทำซึ่งจบลงด้วยการย้อนหลังในเวลาซึ่งเป็นเรื่องแปลก)
หากต้องการอธิบายด้วยคำพูด:
ด้วยเหตุผลที่ฉันไม่เข้าใจเครื่องมือ GUI สำหรับ Git ไม่เคยใช้ความพยายามอย่างมากในการนำเสนอประวัติการผสานอย่างชัดเจนยิ่งขึ้น ดังนั้นหากคุณต้องการ "ประวัติการทำความสะอาด" คุณต้องใช้การลดระดับ
ฉันดูเหมือนจะจำได้ว่าได้อ่านโพสต์บล็อกจากโปรแกรมเมอร์ที่ใช้ rebase เท่านั้นและอื่น ๆ ที่ไม่เคยใช้ rebase
ฉันจะพยายามอธิบายสิ่งนี้ด้วยตัวอย่างเพียงแค่คำพูด สมมติว่าคนอื่น ๆ ในโครงการของคุณกำลังทำงานบนส่วนติดต่อผู้ใช้และคุณกำลังเขียนเอกสาร ประวัติของคุณอาจดูเหมือน:
Write tutorial
Merge remote-tracking branch 'origin/master' into fixdocs
Bigger buttons
Drop down list
Extend README
Merge remote-tracking branch 'origin/master' into fixdocs
Make window larger
Fix a mistake in howto.md
กล่าวคือการรวมและ UI กระทำระหว่างการทำเอกสารของคุณ
หากคุณรีบูตโค้ดของคุณไปที่มาสเตอร์แทนที่จะผสานมันจะมีลักษณะเช่นนี้:
Write tutorial
Extend README
Fix a mistake in howto.md
Bigger buttons
Drop down list
Make window larger
ความมุ่งมั่นทั้งหมดของคุณอยู่ที่ด้านบน (ใหม่ที่สุด) ตามด้วยส่วนที่เหลือของmaster
สาขา
( ข้อจำกัดความรับผิดชอบ: ฉันเป็นผู้เขียนโพสต์ "10 สิ่งที่ฉันเกลียดเกี่ยวกับ Git" ที่อ้างถึงในคำตอบอื่น )
แม้ว่าคำตอบที่ได้รับการยอมรับและได้รับการโหวตมากที่สุดนั้นยอดเยี่ยม แต่ฉันก็พบว่ามันมีประโยชน์ในการอธิบายความแตกต่างด้วยคำพูดเท่านั้น:
ผสาน
rebase
สรุป:เมื่อเป็นไปได้การลดระดับจะดีกว่าเสมอ ทำให้การรวมเข้ากับสาขาหลักง่ายขึ้น
เพราะ? ➝ทำงานคุณลักษณะของคุณสามารถนำเสนอเป็นหนึ่งใหญ่ 'แพทช์ไฟล์' (aka diff) ในส่วนที่เกี่ยวกับสาขาหลักไม่ต้อง 'อธิบาย' พ่อแม่หลายอย่างน้อยสองมาจากการผสาน แต่มีแนวโน้มมากถ้ามี มีหลายอย่างรวมกัน ต่างจากการผสานการรีบาวด์หลายครั้งจะไม่เพิ่มขึ้น (อีกหนึ่งบวกใหญ่)
Git rebase นั้นใกล้กับการรวม ความแตกต่างในการ rebase คือ:
นั่นหมายความว่าการกระทำในพื้นที่ของคุณทั้งหมดจะถูกย้ายไปยังจุดสิ้นสุดหลังจากการส่งข้อมูลระยะไกลทั้งหมด หากคุณมีข้อขัดแย้งผสานคุณต้องแก้ไขด้วย
เพื่อให้เข้าใจง่ายสามารถดูรูปของฉันได้
Rebase จะเปลี่ยนการแฮชเพื่อที่ว่าหากคุณต้องการหลีกเลี่ยงความขัดแย้งมาก ๆ ให้ใช้ rebase เมื่อสาขานั้นเสร็จสมบูรณ์ / เสถียร
ฉันพบบทความหนึ่งที่น่าสนใจจริงๆเกี่ยวกับ git rebase vs mergeคิดถึงการแบ่งปันที่นี่