Rebasing และความหมายหนึ่งโดย rebasing pushits


109

มักกล่าวกันว่าคุณไม่ควรตั้งฐานใหม่ว่าคุณได้ผลักดันไปแล้ว ความหมายของสิ่งนั้นคืออะไร?

คำตอบ:


80

หนังสือ ProGitมีคำอธิบายที่ดี

คำตอบที่เฉพาะเจาะจงสำหรับคำถามของคุณสามารถพบได้ในหัวข้อ " The Perils of Rebasing " คำพูดจากส่วนนั้น:

เมื่อคุณสร้างฐานข้อมูลใหม่คุณจะละทิ้งความมุ่งมั่นที่มีอยู่และสร้างสิ่งใหม่ที่เหมือนกัน แต่แตกต่างกัน หากคุณผลักดันความมุ่งมั่นไปที่ใดที่หนึ่งและคนอื่น ๆ ดึงพวกเขาลงและทำงานบนพื้นฐานจากนั้นคุณเขียนข้อตกลงเหล่านั้นใหม่ด้วย git rebase และผลักดันอีกครั้งผู้ทำงานร่วมกันของคุณจะต้องรวมงานของพวกเขาใหม่และสิ่งต่างๆจะยุ่งเหยิงเมื่อคุณพยายาม ดึงงานของพวกเขากลับมาเป็นของคุณ

อัปเดต:
จากความคิดเห็นของคุณด้านล่างดูเหมือนว่าคุณกำลังมีปัญหากับเวิร์กโฟลว์ Git นี่คือข้อมูลอ้างอิงบางส่วนที่อาจช่วยได้:


ขอบคุณสำหรับคำอธิบาย ดังนั้นเพื่อให้ความเข้าใจของฉันชัดเจนขึ้นหลังจากที่ฉันผลักดันการเปลี่ยนแปลงบางอย่างฉันไม่ควรใช้git rebase(--interactive?) เพื่อเขียนประวัติศาสตร์นั้นใหม่นี่เป็นสูตรของความล้มเหลวในทางกลับกันหากฉันได้ปรับเปลี่ยนการเปลี่ยนแปลงบางอย่างในหัวข้อ สาขา (จากสาขา X) และผลักดันมันเป็นเรื่องปกติอย่างสมบูรณ์ที่จะ rebase อีกครั้งหลังจากนักพัฒนารายอื่นเปลี่ยนสาขาหัวข้อ โดยพื้นฐานแล้วฉันใช้mergeมาพอสมควร แต่เราอยู่ในเรือลำเดียวกันกับdarwinweb.net/articles/86และประวัติแทบจะใช้ไม่ได้
Hemant Kumar

@Hemant: การชดใช้ความเสียหายหลังจากผลักดันไปยัง repo สาธารณะมักเป็นความคิดที่ไม่ดี ดังที่กล่าวไว้คำแนะนำจากบทความ darwinweb ที่คุณอ้างถึงนั้นฟังดูสมเหตุสมผลหากเวิร์กโฟลว์ของคุณคล้ายกับคำแนะนำของพวกเขา ดูคำตอบที่อัปเดตของฉันสำหรับรายการข้อมูลอ้างอิงอื่น ๆ ที่อาจช่วยได้
Tim Henigan

โปรดอัปเดตลิงก์ไปยังหน้า "ProGit" เกี่ยวกับ "Private Managed Team" ไปที่git-scm.com/book/en/…
Eimantas

ในทางเทคนิคแล้วคอมมิตคอมไพล์ยังคงเหมือนเดิม แต่ "ยกเลิกการคอมมิตที่มีอยู่และสร้างคอมมิตใหม่ที่เหมือนกัน แต่ต่างกัน" เป็นคอมมิตเดียวกันกับ sha1 id ต่างกันหรือเปล่า นั่นคงเป็นวิธีเดียวที่ชัดเจนที่ฉันคิดได้ว่าทำไมผู้ทำงานร่วมกัน woudl ต้องรวมงานของตัวเองใหม่!
Ciasto piekarz

@Ciastopiekarz นี่เป็นเพราะคุณกำลังเขียนประวัติใหม่ใน repo ต้นน้ำและ repos ในพื้นที่ของนักพัฒนาคนอื่น ๆ อาจมีคำแนะนำสำหรับสิ่งนั้น ขณะนี้พอยน์เตอร์ของพวกเขาไม่อัปเดต: ไคลเอนต์คอมไพล์ไม่มีทางเลือกอื่นนอกจากใช้พอยน์เตอร์รุ่นเก่าและพึ่งพามนุษย์เพื่อจัดเรียงส่วนที่เหลือออก นี่เป็นการรวมใหม่และอาจยุ่งมากกับการเปลี่ยนแปลงที่สับสนมากมายที่ต้องแยกออกด้วยตนเอง! ดังนั้นคำแนะนำจะไม่ทำการ rebase สิ่งที่ถูกผลักไปที่ repo ต้นน้ำ นี่เป็นคำแนะนำที่ดีและไม่ควรละเลยเว้นแต่คุณจะเป็นผู้เชี่ยวชาญที่มีความรู้อย่างลึกซึ้ง
Forbin

240

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

มันมีสี่คอมมิตในสาขาหลักและแต่ละคอมมิตมี ID (ในกรณีนี้คือ a, b, c และ d) คุณจะสังเกตเห็นว่า d เป็นคอมมิตล่าสุด (หรือ HEAD) ของสาขาหลัก ใส่คำอธิบายภาพที่นี่

ที่นี่เรามีสองสาขา: master และ my-branch คุณจะเห็นว่า master และ my-branch ทั้งคู่มี commits a และ b แต่จากนั้นก็เริ่มแตกต่างกัน: master มี c และ d ในขณะที่ my-branch มี e และ f b ถูกกล่าวว่าเป็น "ฐานการรวม" ของ my-branch เมื่อเทียบกับ master หรือโดยทั่วไปแล้วก็แค่ "base" มันสมเหตุสมผล: คุณจะเห็นได้ว่า my-branch ใช้มาสเตอร์รุ่นก่อนหน้า

สมมติว่า my-branch หายไปแล้วและคุณต้องการอัปเดตด้วย master เวอร์ชันล่าสุด หากต้องการกล่าวอีกนัยหนึ่งสาขาของฉันต้องมี c และ d คุณสามารถทำการผสานได้ แต่นั่นทำให้สาขามีคอมมิตการผสานแปลก ๆ ที่ทำให้การตรวจสอบคำร้องขอดึงยากขึ้นมาก คุณสามารถทำ rebase แทนได้

ใส่คำอธิบายภาพที่นี่

เมื่อคุณสร้างฐานใหม่ git จะค้นหาฐานของสาขาของคุณ (ในกรณีนี้คือ b) ค้นหาการกระทำทั้งหมดระหว่างฐานนั้นและ HEAD (ในกรณีนี้คือ e และ f) และเล่นการกระทำเหล่านั้นอีกครั้งบน HEAD ของสาขา คุณกำลังเปลี่ยนไปใช้ (ในกรณีนี้คือหลัก) Git สร้างคอมมิตใหม่ที่แสดงให้เห็นว่าการเปลี่ยนแปลงของคุณมีลักษณะอย่างไรบนต้นแบบ: ในแผนภาพการคอมมิตเหล่านี้เรียกว่า e ′และ f′ Git ไม่ได้ลบการกระทำก่อนหน้านี้ของคุณ: e และ f จะไม่ถูกแตะต้องและหากมีสิ่งผิดปกติเกิดขึ้นกับ rebase คุณสามารถย้อนกลับไปยังสิ่งที่เคยเป็นได้

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


68

Rebasing เขียนประวัติศาสตร์ซ้ำ หากไม่มีใครรู้เกี่ยวกับประวัติศาสตร์นั้นก็ถือว่าดีอย่างยิ่ง อย่างไรก็ตามหากประวัตินั้นเป็นที่รู้จักต่อสาธารณะการเขียนประวัติใหม่ใน Git จะทำงานได้ในแบบเดียวกับที่ทำในโลกแห่งความเป็นจริงคุณต้องมีการสมรู้ร่วมคิด

การสมคบคิดเป็นเรื่องยากมากที่จะรวมเข้าด้วยกันดังนั้นคุณควรหลีกเลี่ยงการหักล้างสาขาสาธารณะตั้งแต่แรก

ทราบว่ามีเป็นตัวอย่างของแผนการที่ประสบความสำเร็จคือpuสาขาของเก็บคอมไพล์ Junio ซี Hamano ของ (พื้นที่เก็บข้อมูลอย่างเป็นทางการของ Git SCM) จะ rebased บ่อย วิธีการทำงานนี้ก็คือทุกคนที่ใช้puก็สมัครเป็นสมาชิกรายชื่ออีเมลของนักพัฒนา Git เช่นกันและความจริงที่ว่าpuสาขานี้ได้รับการปรับใหม่นั้นได้รับการเผยแพร่อย่างกว้างขวางในรายชื่ออีเมลและเว็บไซต์ Git


4
+1. ฉันคิดว่าpuสาขาของ git.git เป็นตัวอย่างที่มีประโยชน์มากในการใช้ rebase ในเวิร์กโฟลว์ (สาธารณะ) สำหรับผู้ที่ไม่คุ้นเคยกับมันแนวคิดทั่วไปคือการสร้างสาขาหัวข้อใหม่ที่ไม่มีการคอมมิตใด ๆnext(สาขาที่ไม่เสถียรก่อนที่จะรวมเป็นมาสเตอร์) จากนั้นสร้างpuสาขาใหม่โดยการรีเซ็ตเป็นnextและรวมสาขาหัวข้อทั้งหมด (ที่มา: เอกสารประกอบ / howto / maintenance-git.txt git.kernel.org/?p=git/git.git;a=blob;f=Documentation/howto/… )
Cascabel

25
+1 สำหรับ "การเขียนประวัติใหม่ใน Git จะทำงานในแบบเดียวกับที่ทำในโลกแห่งความจริง: คุณต้องมีการสมรู้ร่วมคิด"
Sleeper Smith

"ไม่จำเป็นต้องมีการประกาศต่อสาธารณะเนื่องจาก pu เป็นสาขาที่ทิ้งไปแล้วตามที่อธิบายไว้ข้างต้น" git-scm.com/docs/gitworkflows เราทำบางสิ่งที่คล้ายกันในที่ทำงาน "TEMP-something-latest" เป็นสาขาที่ถูกทิ้งซึ่งเป็นการรวมกันของการเปลี่ยนแปลงล่าสุดซึ่งอาจเป็นการรวมกันของสาขาคุณลักษณะหลายอย่างอาจถูกลบ และสร้างขึ้นใหม่เมื่อใดก็ได้และไม่ควรพัฒนาบน
pilkch

6

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

ฉันคิดว่าRebase เป็นอันตรายเป็นภาพรวมที่ดี

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