มักกล่าวกันว่าคุณไม่ควรตั้งฐานใหม่ว่าคุณได้ผลักดันไปแล้ว ความหมายของสิ่งนั้นคืออะไร?
มักกล่าวกันว่าคุณไม่ควรตั้งฐานใหม่ว่าคุณได้ผลักดันไปแล้ว ความหมายของสิ่งนั้นคืออะไร?
คำตอบ:
หนังสือ ProGitมีคำอธิบายที่ดี
คำตอบที่เฉพาะเจาะจงสำหรับคำถามของคุณสามารถพบได้ในหัวข้อ " The Perils of Rebasing " คำพูดจากส่วนนั้น:
เมื่อคุณสร้างฐานข้อมูลใหม่คุณจะละทิ้งความมุ่งมั่นที่มีอยู่และสร้างสิ่งใหม่ที่เหมือนกัน แต่แตกต่างกัน หากคุณผลักดันความมุ่งมั่นไปที่ใดที่หนึ่งและคนอื่น ๆ ดึงพวกเขาลงและทำงานบนพื้นฐานจากนั้นคุณเขียนข้อตกลงเหล่านั้นใหม่ด้วย git rebase และผลักดันอีกครั้งผู้ทำงานร่วมกันของคุณจะต้องรวมงานของพวกเขาใหม่และสิ่งต่างๆจะยุ่งเหยิงเมื่อคุณพยายาม ดึงงานของพวกเขากลับมาเป็นของคุณ
อัปเดต:
จากความคิดเห็นของคุณด้านล่างดูเหมือนว่าคุณกำลังมีปัญหากับเวิร์กโฟลว์ Git นี่คือข้อมูลอ้างอิงบางส่วนที่อาจช่วยได้:
gitworkflows
หน้าคน: โปรดดูที่ "การผสานขึ้นไป" และ "กระทู้สาขา"เพื่อให้เข้าใจสิ่งนี้เราต้องเข้าใจเล็กน้อยเกี่ยวกับการทำงานของคอมไพล์ ที่เก็บ 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 คุณสามารถย้อนกลับไปยังสิ่งที่เคยเป็นได้
เมื่อผู้คนจำนวนมากกำลังทำงานในโปรเจ็กต์แบบจำลองคำขอดึงอาจค้างได้อย่างรวดเร็ว คำขอดึง "เก่า" คือคำขอที่ไม่อัปเดตกับสายการพัฒนาหลักอีกต่อไปและจำเป็นต้องได้รับการอัปเดตก่อนจึงจะรวมเข้ากับโครงการได้ สาเหตุที่พบบ่อยที่สุดที่ทำให้คำขอดึงข้อมูลค้างเกิดจากความขัดแย้ง: หากคำขอดึงสองรายการทั้งสองรายการแก้ไขบรรทัดที่คล้ายกันในไฟล์เดียวกันและคำขอดึงหนึ่งรายการถูกรวมเข้าด้วยกันคำขอดึงที่ไม่ได้ผสานจะมีข้อขัดแย้งในขณะนี้ บางครั้งคำขอดึงอาจไม่มีข้อขัดแย้ง: บางทีการเปลี่ยนแปลงในไฟล์อื่นในโค้ดเบสจำเป็นต้องมีการเปลี่ยนแปลงที่สอดคล้องกันในคำขอดึงของคุณเพื่อให้สอดคล้องกับสถาปัตยกรรมใหม่หรือสาขาอาจถูกสร้างขึ้นเมื่อมีคนรวมการทดสอบหน่วยที่ล้มเหลวโดยไม่ได้ตั้งใจกับ สาขาหลัก. โดยไม่คำนึงถึงเหตุผล
Rebasing เขียนประวัติศาสตร์ซ้ำ หากไม่มีใครรู้เกี่ยวกับประวัติศาสตร์นั้นก็ถือว่าดีอย่างยิ่ง อย่างไรก็ตามหากประวัตินั้นเป็นที่รู้จักต่อสาธารณะการเขียนประวัติใหม่ใน Git จะทำงานได้ในแบบเดียวกับที่ทำในโลกแห่งความเป็นจริงคุณต้องมีการสมรู้ร่วมคิด
การสมคบคิดเป็นเรื่องยากมากที่จะรวมเข้าด้วยกันดังนั้นคุณควรหลีกเลี่ยงการหักล้างสาขาสาธารณะตั้งแต่แรก
ทราบว่ามีเป็นตัวอย่างของแผนการที่ประสบความสำเร็จคือpu
สาขาของเก็บคอมไพล์ Junio ซี Hamano ของ (พื้นที่เก็บข้อมูลอย่างเป็นทางการของ Git SCM) จะ rebased บ่อย วิธีการทำงานนี้ก็คือทุกคนที่ใช้pu
ก็สมัครเป็นสมาชิกรายชื่ออีเมลของนักพัฒนา Git เช่นกันและความจริงที่ว่าpu
สาขานี้ได้รับการปรับใหม่นั้นได้รับการเผยแพร่อย่างกว้างขวางในรายชื่ออีเมลและเว็บไซต์ Git
pu
สาขาของ git.git เป็นตัวอย่างที่มีประโยชน์มากในการใช้ rebase ในเวิร์กโฟลว์ (สาธารณะ) สำหรับผู้ที่ไม่คุ้นเคยกับมันแนวคิดทั่วไปคือการสร้างสาขาหัวข้อใหม่ที่ไม่มีการคอมมิตใด ๆnext
(สาขาที่ไม่เสถียรก่อนที่จะรวมเป็นมาสเตอร์) จากนั้นสร้างpu
สาขาใหม่โดยการรีเซ็ตเป็นnext
และรวมสาขาหัวข้อทั้งหมด (ที่มา: เอกสารประกอบ / howto / maintenance-git.txt git.kernel.org/?p=git/git.git;a=blob;f=Documentation/howto/… )
rebase จะเปลี่ยนประวัติของที่เก็บของคุณ หากคุณผลักไสออกไปสู่สายตาชาวโลกกล่าวคือทำให้คนอื่นรู้แล้วคุณเปลี่ยนมุมมองของประวัติการกระทำมันก็ยากที่จะทำงานร่วมกับใครก็ตามที่มีประวัติเก่าของคุณ
ฉันคิดว่าRebase เป็นอันตรายเป็นภาพรวมที่ดี
git rebase
(--interactive?) เพื่อเขียนประวัติศาสตร์นั้นใหม่นี่เป็นสูตรของความล้มเหลวในทางกลับกันหากฉันได้ปรับเปลี่ยนการเปลี่ยนแปลงบางอย่างในหัวข้อ สาขา (จากสาขา X) และผลักดันมันเป็นเรื่องปกติอย่างสมบูรณ์ที่จะ rebase อีกครั้งหลังจากนักพัฒนารายอื่นเปลี่ยนสาขาหัวข้อ โดยพื้นฐานแล้วฉันใช้merge
มาพอสมควร แต่เราอยู่ในเรือลำเดียวกันกับdarwinweb.net/articles/86และประวัติแทบจะใช้ไม่ได้