ทำไมหลาย ๆ โครงการจึงชอบที่จะ“ git rebase” มากกว่า“ git merge”?


68

ข้อดีอย่างหนึ่งของการใช้ DVCS คือเวิร์กโฟลว์edit-commit-merge (การแก้ไขมากกว่าการผสานผสานกระทำบ่อยครั้งบังคับใช้โดย CVCS) การอนุญาตให้บันทึกการเปลี่ยนแปลงที่ไม่ซ้ำกันแต่ละครั้งในที่เก็บซึ่งเป็นอิสระจากการรวมกันทำให้มั่นใจได้ว่าDAGสะท้อนถึงสายเลือดที่แท้จริงของโครงการอย่างถูกต้อง

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

จุดชี้แจง:พฤติกรรมเริ่มต้นสำหรับ DVCS คือการสร้างการรวมการกระทำ ทำไมหลายสถานที่พูดถึงความปรารถนาที่จะเห็นประวัติศาสตร์การพัฒนาเชิงเส้นที่ซ่อนการกระทำเหล่านี้ไว้?


18
เครื่องมือไม่ถูกต้องเสมอไป และเมื่อพวกเขาเข้าใจผิดเด็กน้อยพวกเขาเข้าใจผิดหรือเปล่า
Oded

2
@Oded คุณหมายถึงการรวมอัตโนมัติ (เช่นที่สร้างโดยgit pull)? ฉันสามารถดูสาเหตุที่อาจเป็นปัญหาได้ แต่คำถามของฉันเกี่ยวกับการรวมทั้งหมด
Jace Browning

ที่เป็นไปได้ที่ซ้ำกันของการผสานที่มีความซับซ้อนบ่อยครั้งเป็นความขัดแย้งสัญญาณของปัญหา "การรวมและการรีบูตควรทำให้เกิดความขัดแย้งแบบเดียวกันแน่นอนสำหรับความขัดแย้งโดยธรรมชาติที่มนุษย์ต้องแก้ไข (เช่นนักพัฒนาสองคนเปลี่ยนรหัสบรรทัดเดียวกัน) ... "
gnat

คิดที่ฉันได้หลังจากโพสต์คำตอบของฉันที่ IMO ไม่ตรงพอดีเป็นคำตอบ: git pull --rebase == svn up(หลวมเท่ากับไม่เข้มงวดเท่ากับ)
Izkata

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

คำตอบ:


64

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


5
คุณเป็นคนเดียวที่เข้าใจคำถามของฉันถูกต้อง ฉันจะทำให้ชัดเจนขึ้นได้อย่างไร
Jace Browning

12
อาจใช้ถ้อยคำใหม่เพื่อ "สิ่งที่เป็นประโยชน์ของประวัติศาสตร์การพัฒนาเชิงเส้น?"
Karl Bielefeldt

11
"บ่อยครั้งที่คุณทำเช่นนี้เพื่อให้แน่ใจว่าการกระทำของคุณจะใช้กับสาขาระยะไกลได้อย่างสมบูรณ์ - บางทีในโครงการที่คุณพยายามมีส่วนร่วม แต่คุณไม่ได้ดูแลในกรณีนี้คุณจะทำงานของคุณ ในสาขาและจากนั้นรีบูตงานของคุณไปยังจุดเริ่มต้น / หลักเมื่อคุณพร้อมที่จะส่งแพตช์ของคุณไปยังโครงการหลักด้วยวิธีนี้ผู้ดูแลไม่ต้องทำงานใด ๆ ในการผสาน - เพียงแค่กรอไปข้างหน้าหรือแบบสะอาด " git-scm.com/book/en/Git-Branching-Rebasing
Andyz Smith

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

20
"ไม่มีประโยชน์อะไรนอกจากความสวยงาม" - ฉันไม่รู้เกี่ยวกับสิ่งนั้น เป็นการยากที่จะเข้าใจว่าเกิดอะไรขึ้นในประวัติศาสตร์ของคุณเมื่อประวัติของคุณดูเหมือนแผงวงจร (สมมติว่าสมาชิกในทีมหลายคนแต่ละคนมีสาขาและเวิร์กโฟลว์ของตัวเอง)
Archagon

46

คำสองคำ: git bisect

ประวัติเชิงเส้นช่วยให้คุณสามารถระบุแหล่งที่มาที่แท้จริงของข้อบกพร่อง


ตัวอย่าง. นี่คือรหัสเริ่มต้นของเรา:

def bar(arg=None):
    pass

def foo():
    bar()

สาขา 1 ทำการปรับโครงสร้างบางอย่างซึ่งargไม่สามารถใช้ได้อีกต่อไป

def bar():
    pass

def foo():
    bar()

สาขา 2 มีคุณสมบัติใหม่ที่จำเป็นต้องใช้arg:

def bar(arg=None):
    pass

def foo():
    bar(arg=1)

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

โอ้อึ นี่คือสิ่งที่เห็น:

(master: green)
|             \_________________________
|                \                      \
(master: green)  (branch 1: green)     (branch 2: green)
|                 |                     |
|                 |                     |
(master/merge commit: green)            |
|                         ______________/
|                        /
(master/merge commit: red)
|
...days pass...
|
(master: red)

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

(master: green)
|
(master: green)
|
(all branch 1 commits: green)
|
(some branch 2 commits: green)
|
(branch 2 commit: red)
|
(remaining branch 2 commits: red)
|
...days pass...
|
(master: still red)

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

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


ที่กล่าวว่าฉัน (ปัจจุบัน) ยังคงชอบการรวม การรีบูตสาขาการปล่อยจะให้ประวัติเชิงเส้นของคุณสำหรับใช้กับgit bisectในขณะที่รักษาประวัติที่แท้จริงสำหรับการทำงานแบบวันต่อวัน


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

@ ฟิลิปฉันลังเลเล็กน้อยที่จะทำเช่นนั้นเพราะฉันใช้ git เพียงไม่กี่เดือนในโครงการส่วนบุคคลขนาดเล็กไม่เคยอยู่ในทีม แต่เมื่อติดตามสิ่งที่ฉันทำเมื่อเร็ว ๆ นี้ความสามารถในการมองเห็นการไหลของความมุ่งมั่นข้ามสาขาในgitk --allนั้นมีประโยชน์อย่างมาก (โดยเฉพาะอย่างยิ่งเนื่องจากฉันมักจะมีกิ่ง 3-ish ตามเวลาที่กำหนดและสลับระหว่างพวกเขาในแต่ละวัน เวลา).
Izkata

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

1
ไม่เห็นด้วยกับคำตอบนี้จริงๆ การรีบูตทำลายยูทิลิตี้ของ bisect ในบางครั้ง ยกเว้นหัวหน้าที่กระทำการ rebase การกระทำจากการ rebase อาจไม่สามารถรันได้ ตัวอย่าง: คุณแยกที่ A และทำให้ B, C, D, มีคนผลัก E. คุณ B และ C และทำงาน แต่ rebased บน E คุณ B และ C จะไม่สามารถเรียกใช้หรือทำงานได้และไม่ทำงาน กรณีที่ดีที่สุดคือคุณยอมแพ้กรณีที่เลวร้ายที่สุดที่คุณคิดว่า B หรือ C มีปัญหาเมื่อในความเป็นจริงมันคือ D
ลาน

4
@Izkata เหตุใดคุณจึงใช้ bisect เพราะข้อบกพร่อง / ข้อผิดพลาดเกิดขึ้น มันเป็นความจริงที่ต่ำต้อย บางที "การลากเมาส์ไปทางซ้าย" อาจไม่ใช่ส่วนหนึ่งของรายการทดสอบอัตโนมัติ / ด้วยตนเองมาก่อนและตอนนี้เราสังเกตเห็นว่าคุณลักษณะนั้นใช้งานไม่ได้ แต่เรารู้ว่ามันใช้งานได้
ลาน

17

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

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

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

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

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

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

และเพื่อที่จะหนีจากฝันร้ายนี้บางคนกลัวที่จะทำตามคำสัญญา (มีอะไรใหม่และน่าสนใจ?) เรามีความเสี่ยงที่จะเกิดความเกลียดชังในสถานการณ์เช่นนี้ - ถ้าเราไม่คิดว่าเราดูดและจะทำให้เขิน ถอนหายใจ

ดังนั้นคุณไป ใช่ระบบที่ทันสมัยได้รับการออกแบบมาเพื่อบรรเทาความเจ็บปวดนี้และมันควรจะสามารถถอยออกมาได้อย่างง่ายดายและลดและลดฐานและ freebase และ hanglide และทั้งหมดที่

แต่มันทำงานได้มากขึ้นและเราแค่ต้องการกดปุ่มบนไมโครเวฟและทำอาหาร 4 คอร์สก่อนที่เราจะมีเวลาหาส้อมและทุกอย่างก็รู้สึกไม่ดีมาก ๆ - รหัสทำงานได้มันมีประสิทธิผลมัน มีความหมาย แต่การจัดการผสานอย่างสง่างามไม่นับรวม

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


5
คำพูดที่น่าประหลาดใจครับ!
Southpaw Hare

10
นี่เป็นคำตอบว่าทำไมผู้คนถึงกลัวการรวมกันไม่ใช่ว่าทำไมหลาย ๆ คนที่ทำคอมมิทรวมกันถือว่าไม่ดี
Jay

23
ปัญหากับคำตอบนี้ก็คือว่านี้ยังคงเป็นจริงสำหรับ rebase ท้ายที่สุดการรีบูตยังคงดำเนินการผสานซึ่งคุณได้เปลี่ยนบรรทัดของรหัสที่เปลี่ยนไปแล้ว ฉันคิดว่านี่เป็นปัญหาเกี่ยวกับวิธีการตอบคำถาม
deworde

1
ฉันลงคะแนนคำตอบนี้เพราะมันยังมีคารมคมคายอยู่
ยูจีน

5
สิ่งนี้ดูเหมือนจะไม่กระทบกับ rebase กับการรวมผสานเลย
Andyz Smith

5

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

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

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


1
ดังนั้นสิ่งที่มันไม่สามารถลดระดับการเปลี่ยนแปลงใหม่ให้อยู่ในระดับที่พวกเขาได้รับการพิจารณา 'สิ่งที่ผิดเพราะพวกเขาเป็นเพียงการเปลี่ยนแปลง หากการเปลี่ยนแปลงเก่าทั้งหมดรวมอยู่ในการผสานการเปลี่ยนแปลงทั้งหมดจะอยู่ในระดับที่เหมาะสมโดยพิจารณาว่าเป็น 'สิ่งที่ถูกต้อง' ในวันนี้หรือไม่
Andyz Smith

@AndyzSmith ฉันจะไม่พิจารณาการเปลี่ยนแปลงใหม่สิ่งที่ผิด เมื่อพยายามที่จะกำหนดสิ่งที่จะถูกเปลี่ยนแปลงและควรได้รับการผลักดันให้พวกเขาเป็นสิ่งที่ถูกต้อง เมื่อคุณรีบาวด์แล้วคุณสามารถเพิกเฉยต่อการเปลี่ยนแปลงเดิมได้
BillThor

ถูกต้องดังนั้นหากคุณไม่แน่ใจว่าพื้นฐานของคุณคืออะไรไม่ว่าสิ่งที่คุณเปลี่ยนแปลงแล้วพร้อมที่จะรวมเข้าด้วยกันคือ 'สิ่งที่ถูกต้อง' แล้วอย่ารีบูตเลย
Andyz Smith

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

4

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

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

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


4
นี่เป็นคำตอบว่าทำไมผู้คนถึงกลัวการรวมกันไม่ใช่ว่าทำไมหลาย ๆ คนที่ทำคอมมิทรวมกันถือว่าไม่ดี
Jay

งั้นลำต้นที่คุณอ้างถึงเกี่ยวข้องกับการรีบูตหรือไม่? กรุณาอธิบาย
Andyz Smith

@AndyzSmith "trunk" เป็นคำที่ svn เทียบเท่ากับสาขา "master" ของ git
Izkata

@Izkata ดังนั้นคำตอบนี้ไม่แนะนำให้ใช้การผสานหรือการรีบูตเลย?
Andyz Smith

@AndyzSmith ใช่นั่นเป็นวิธีที่ฉันอ่านด้วย และฉันไม่เห็นด้วยกับมัน; หลังจากทำงานกับทีมกับนักพัฒนาอื่น ๆ อีก 7 คนในแบบที่แนะนำฉันไม่แนะนำ เราควรใช้สาขาคุณลักษณะมากกว่าที่เราทำ แต่ส่วนใหญ่กลัวที่จะรวม (เช่น BrianDHall ได้รับคำตอบของเขา)
Izkata

0

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


1
ซับซ้อนนี้หรือไม่
Akavall

แน่นอน :-) ในขั้นตอนการคอมไพล์เราได้ทำการสร้างสาขาใหม่ หากหลังจากการสร้างข้อผิดพลาดได้รับการแก้ไขในสาขาการพัฒนาเราใช้git cherry-pick -x <commit>เพื่อนำไปใช้กับสาขาที่วางจำหน่าย git revert <commit>หรือเราอาจต้องการที่จะเลิกทำบางสิ่งบางอย่างสำหรับการเปิดตัวด้วย ถ้า<commit>เป็นการผสานจะทำให้ขนดก มันเป็นไปได้เท่าที่ผมรู้ แต่ไม่ง่ายที่จะทำ เมื่อใช้ rebase 'การรวมกัน' ทุกตัวเป็นยักษ์ตัวหนึ่ง แต่มีการกระทำปกติสามารถเลือกได้และกลับคืนมาได้ง่าย
Bruno Schäpper

0

ยังไม่ได้พูดถึงสามสิ่งในคำตอบใด ๆ :

  • กระจายอยู่ภายในสาขา:

    • ความแตกต่างระหว่างคู่ของการกระทำโดยพลการในสาขากลายเป็นเรื่องยากมากเมื่อมีการรวมการกระทำ
  • การรวมครั้งละหนึ่งรายการ:

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

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