วิธีหลีกเลี่ยงการผสานรวมนรกบน GitHub / BitBucket


101

เราจบลงด้วยการกระทำเช่นนี้ใน repo ของเรา:

Merge branch 'master' of bitbucket.org:user/repo

สิ่งนี้เกิดขึ้นทุกครั้งที่นักพัฒนาซิงค์ Fork ในพื้นที่กับ repo ระดับบนสุด

มีอยู่แล้วหรือไม่ที่จะหลีกเลี่ยงนรกที่รวมเข้าด้วยกันนี้จากการถ่วงบันทึก repo ทั้งหมด เราสามารถหลีกเลี่ยงได้หรือไม่เมื่อเริ่มต้นคำขอดึงข้อมูลด้วยวิธีใดวิธีหนึ่ง

ฉันรู้ว่าฉันสามารถทำ git rebase ได้หากทำใน VM ในเครื่องของฉันเท่านั้นมีความเท่าเทียมกันใน GitHub / BitBucket UI หรือไม่

พวกคุณทำได้อย่างไร?

คำตอบ:


137

Rebase Feature Branches ก่อนการผสาน

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

git checkout master
git checkout -b feature/foo

# make some commits

git rebase master
git checkout master
git merge --ff-only feature/foo

Rebase ยังมีแฟล็กจำนวนมากรวมถึงการ rebasing แบบโต้ตอบด้วยแฟล็ก-iแต่คุณอาจไม่จำเป็นต้องทำเช่นนั้นหากคุณทำให้สิ่งต่างๆเรียบง่ายที่สุดเท่าที่จะเป็นไปได้และต้องการรักษาประวัติสาขาทั้งหมดของคุณในการรวม

ใช้ค่า--ff-onlyสถานะ

นอกเหนือจากการรีเบตการใช้--ff-onlyแฟล็กจะช่วยให้มั่นใจได้ว่าอนุญาตเฉพาะการกรอไปข้างหน้าเท่านั้น จะไม่มีการคอมมิตหากเป็นการรวมคอมมิตแทน หน้าคู่มือ git-merge (1) ระบุว่า:

--ff เท่านั้น

ปฏิเสธที่จะรวมและออกด้วยสถานะที่ไม่ใช่ศูนย์เว้นแต่ว่า HEAD ปัจจุบันจะเป็นปัจจุบันอยู่แล้วหรือการผสานสามารถแก้ไขได้เป็นการกรอไปข้างหน้า


1
นี่คือคำตอบที่ยอดเยี่ยม ฉันใช้ rebase บ่อยที่สุด ฉันไม่ทราบเกี่ยวกับแฟล็ก --ff-only สวยเด็ด!
Leo Correa

3
ขอขอบคุณสำหรับคำแนะนำ rebase และ --ff เท่านั้น อย่างไรก็ตามตามที่กล่าวไว้ในคำถามของฉันฉันจะทำสิ่งนี้ภายใน UI ของ GitHub / BitBucket ได้อย่างไร
Niklas9

3
@Niklas ฉันค่อนข้างแน่ใจว่าคุณจะต้องหันไปหา CLI เพื่อทำในสิ่งที่คุณต้องการ GitHub ไม่เปิดเผยพลังทั้งหมดของ Git เป็นเพียงส่วนย่อยของคุณสมบัติรวมถึงการเพิ่มมูลค่าทางกราฟิกและเครือข่ายทางสังคม โชคดี!
Todd A.Jacobs

3
สิ่งหนึ่งที่ควรทราบในกระบวนการนี้คือก่อนที่จะรวมสาขาของหัวข้อ (คุณลักษณะ / foo) กลับเข้ามาในต้นแบบคุณควรใช้ git ดึงต้นแบบต้นแบบ (หากใช้รีโมต) เพื่อให้แน่ใจว่าสาขาหลักเป็นข้อมูลล่าสุด . หากพบการอัปเดตตรวจสอบให้แน่ใจว่าได้ทำการปรับฐานข้อมูลหลักอีกครั้งในสาขาหัวข้อก่อนที่จะรวมกลับเป็นหลัก
chikamichi

19
@CodeGnome อย่าเรียกมันว่า "หันไปใช้" กับ CLI ... ในความเป็นจริงคุณควรจะเตือนเกี่ยวกับ "การใช้" UI!
Droogans

10

"ทอดด์เอ. จาค็อบส์" ได้กล่าวถึง "rebase" แล้วเป็นแนวคิดของที่นี่ นี่เป็นเพียงวิธีการทำสิ่งต่างๆโดยละเอียดมากขึ้น

สมมติว่าคุณอยู่ในสาขาหลัก

$ git branch
  * master

คุณต้องการทำการแก้ไขดังนั้นให้สร้าง "fixbranch" ซึ่งแตกแขนงมาจากต้นแบบ

$ git checkout -b fixbranch

บางทีคุณอาจจะทำงานสองสามวันในสาขานี้และมีภาระกิจสองสามอย่าง

วันที่คุณต้องการผลักดันความมุ่งมั่นของคุณไปยัง repo หลักของส่วนกลาง! ชำระเงินหลักและรับการเปลี่ยนแปลงล่าสุดจาก repo หลักส่วนกลาง

$ git checkout master
$ git pull origin master

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

$ git checkout fixbranch
$ git rebase master

ตอนนี้ fixbranch ได้รับการอัปเดตกับ master กลางแล้วให้ฉันรวม fixbranch เข้ากับ master branch

 $ git checkout master
 $ git merge fixbranch

เสร็จแล้ว! ให้ฉันผลักดันนายท้องถิ่นไปยังหัวหน้าส่วนกลาง

$ git push origin master

https://git-scm.com/book/en/v2/Git-Branching-Rebasing

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