ตอนนี้ฉันใช้ Git มาสองสามเดือนกับโปรเจ็กต์กับผู้พัฒนารายอื่น ฉันมีประสบการณ์หลายปีกับSVNดังนั้นฉันเดาว่าฉันจะนำสัมภาระจำนวนมากมาสู่ความสัมพันธ์
ฉันได้ยินมาว่า Git นั้นยอดเยี่ยมสำหรับการแยกและรวมเข้าด้วยกันและจนถึงตอนนี้ฉันไม่เห็นเลย แน่นอนว่าการแตกแขนงนั้นง่ายมาก แต่เมื่อฉันพยายามที่จะรวมทุกอย่างเข้าสู่นรก ตอนนี้ฉันคุ้นเคยกับเรื่องนี้จาก SVN แต่สำหรับฉันแล้วฉันเพิ่งแลกเปลี่ยนระบบเวอร์ชันย่อยแบบหนึ่งสำหรับอีกระบบหนึ่ง
คู่ของฉันบอกฉันว่าปัญหาของฉันเกิดจากความปรารถนาของฉันที่จะผสานความจำเจและฉันควรใช้ rebase แทนการรวมในหลาย ๆ สถานการณ์ ตัวอย่างเช่นนี่คือขั้นตอนการทำงานที่เขาวางลง:
clone the remote repository
git checkout -b my_new_feature
..work and commit some stuff
git rebase master
..work and commit some stuff
git rebase master
..finish the feature
git checkout master
git merge my_new_feature
โดยพื้นฐานแล้วสร้างสาขาฟีเจอร์เสมอ rebase จากต้นแบบไปยังสาขาและผสานจากสาขากลับสู่ต้นแบบ สิ่งสำคัญที่ควรทราบคือสาขาจะยังคงอยู่ในพื้นที่เสมอ
นี่คือขั้นตอนการทำงานที่ฉันเริ่มต้นด้วย
clone remote repository
create my_new_feature branch on remote repository
git checkout -b --track my_new_feature origin/my_new_feature
..work, commit, push to origin/my_new_feature
git merge master (to get some changes that my partner added)
..work, commit, push to origin/my_new_feature
git merge master
..finish my_new_feature, push to origin/my_new_feature
git checkout master
git merge my_new_feature
delete remote branch
delete local branch
มีความแตกต่างที่สำคัญสองประการ (ฉันคิดว่า): ฉันใช้การผสานเสมอแทนที่จะเป็นการรีบูทและฉันดันสาขาคุณลักษณะของฉัน (และสาขาฟีเจอร์ของฉันมุ่งมั่น) ไปยังที่เก็บระยะไกล
เหตุผลของฉันสำหรับสาขาระยะไกลคือฉันต้องการสำรองงานขณะที่ทำงาน ที่เก็บของเราจะสำรองข้อมูลโดยอัตโนมัติและสามารถเรียกคืนได้หากมีสิ่งผิดปกติ แล็ปท็อปของฉันไม่ได้หรือไม่ได้อย่างทั่วถึง ดังนั้นฉันเกลียดที่จะมีรหัสในแล็ปท็อปของฉันที่ไม่ได้สะท้อนที่อื่น
เหตุผลของฉันสำหรับการผสานแทนการ rebase นั้นดูเหมือนว่าการผสานจะเป็นแบบมาตรฐานและการ rebase นั้นดูเหมือนจะเป็นคุณสมบัติขั้นสูง ความรู้สึกของฉันคือสิ่งที่ฉันพยายามทำไม่ใช่การตั้งค่าขั้นสูงดังนั้นการรีบูตจึงไม่จำเป็น ฉันได้อ่านหนังสือ Pragmatic Programming เล่มใหม่บน Git แล้วและมันครอบคลุมการผสานอย่างกว้างขวางและแทบจะพูดถึงการรีบูต
ยังไงก็ตามฉันกำลังติดตามเวิร์กโฟลว์ของฉันที่สาขาเมื่อเร็ว ๆ นี้และเมื่อฉันพยายามที่จะรวมมันกลับไปเป็นหลักทุกอย่างก็ตกนรก มีความขัดแย้งมากมายกับสิ่งต่าง ๆ ที่ไม่ควรสำคัญ ความขัดแย้งนั้นไม่สมเหตุสมผลสำหรับฉัน ฉันใช้เวลาหนึ่งวันในการแยกแยะทุกอย่างและในที่สุดก็ถึงจุดสูงสุดในการผลักดันผู้บังคับการจากระยะไกลเนื่องจากต้นแบบในพื้นที่ของฉันได้แก้ไขข้อขัดแย้งทั้งหมดแล้วแต่ทว่าระยะไกลยังไม่มีความสุข
เวิร์กโฟลว์ "ถูกต้อง" คืออะไรสำหรับสิ่งนี้ Git ควรจะทำการแยกและรวมกันเป็นเรื่องง่ายและฉันแค่ไม่เห็นมัน
อัปเดต 2011-04-15
นี่ดูเหมือนจะเป็นคำถามยอดนิยมดังนั้นฉันคิดว่าฉันจะอัปเดตด้วยประสบการณ์สองปีนับตั้งแต่ที่ฉันถามครั้งแรก
ปรากฎว่าเวิร์กโฟลว์ดั้งเดิมนั้นถูกต้องอย่างน้อยในกรณีของเรา กล่าวอีกนัยหนึ่งนี่คือสิ่งที่เราทำและใช้งานได้:
clone the remote repository
git checkout -b my_new_feature
..work and commit some stuff
git rebase master
..work and commit some stuff
git rebase master
..finish the feature, commit
git rebase master
git checkout master
git merge my_new_feature
ในความเป็นจริงเวิร์กโฟลว์ของเรานั้นแตกต่างกันเล็กน้อยเนื่องจากเรามักจะทำการรวมสควอชแทนการรวมแบบดิบ ( หมายเหตุ: นี่คือการโต้เถียงดูด้านล่าง ) สิ่งนี้ช่วยให้เราเปลี่ยนสาขาคุณลักษณะทั้งหมดของเราให้เป็นความมุ่งมั่นอันเดียว จากนั้นเราลบสาขาฟีเจอร์ของเรา สิ่งนี้ช่วยให้เราสามารถจัดโครงสร้างเชิงตรรกะที่เรามีต่อมาสเตอร์แม้ว่าพวกเขาจะยุ่งเล็กน้อยในสาขาของเราก็ตาม ดังนั้นนี่คือสิ่งที่เราทำ:
clone the remote repository
git checkout -b my_new_feature
..work and commit some stuff
git rebase master
..work and commit some stuff
git rebase master
..finish the feature, commit
git rebase master
git checkout master
git merge --squash my_new_feature
git commit -m "added my_new_feature"
git branch -D my_new_feature
Squash Merge Controversy - เนื่องจากมีผู้วิจารณ์หลายคนชี้ให้เห็นว่าการรวมสควอชจะทำให้ประวัติศาสตร์ทั้งหมดในฟีเจอร์ของคุณหมดไป ตามที่ชื่อบอกถึงมันจะทำการคอมมิตทั้งหมดลงไปในอันเดียว สำหรับคุณสมบัติขนาดเล็กสิ่งนี้เหมาะสมแล้วที่รวมไว้ในแพ็คเกจเดียว สำหรับคุณสมบัติที่มีขนาดใหญ่ขึ้นอาจไม่ใช่ความคิดที่ดีโดยเฉพาะอย่างยิ่งหากการกระทำของแต่ละบุคคลของคุณมีอะตอมอยู่แล้ว มันลงมาตามความชอบส่วนตัว
Github และ Bitbucket (อื่น ๆ ?) คำขอดึง - ในกรณีที่คุณสงสัยว่าการรวม / rebase เกี่ยวข้องกับคำขอดึงข้อมูลฉันขอแนะนำให้ทำตามขั้นตอนทั้งหมดข้างต้นจนคุณพร้อมที่จะผสานกลับไปเป็นหลัก แทนที่จะรวมกับ git ด้วยตนเองคุณเพียงแค่ยอมรับ PR โปรดทราบว่าสิ่งนี้จะไม่ทำการรวมสควอช (อย่างน้อยก็ไม่ใช่สควอช) แต่การสควอชที่ไม่ใช่สควอชไปข้างหน้านั้นเป็นรูปแบบการผสานที่ยอมรับในชุมชนคำขอดึงข้อมูล (เท่าที่ฉันรู้) โดยเฉพาะมันทำงานดังนี้:
clone the remote repository
git checkout -b my_new_feature
..work and commit some stuff
git rebase master
..work and commit some stuff
git rebase master
..finish the feature, commit
git rebase master
git push # May need to force push
...submit PR, wait for a review, make any changes requested for the PR
git rebase master
git push # Will probably need to force push (-f), due to previous rebases from master
...accept the PR, most likely also deleting the feature branch in the process
git checkout master
git branch -d my_new_feature
git remote prune origin
ฉันรัก Git และไม่ต้องการกลับไปที่ SVN หากคุณกำลังดิ้นรนเพียงติดกับมันและในที่สุดคุณจะเห็นแสงที่ปลายอุโมงค์
rebase
ความเข้าใจ