ฉันจะทำให้การส่งต่ออย่างรวดเร็วถูกปิดโดยปริยายในคอมไพล์หรือไม่?


263

ฉันไม่สามารถคิดถึงเวลาที่ฉันจะใช้git mergeมากกว่าgit rebaseและไม่ต้องการให้มีการแสดง มีวิธีการกำหนดค่า git ให้ส่งต่ออย่างรวดเร็วโดยค่าเริ่มต้นหรือไม่ ความจริงที่ว่ามี--ffตัวเลือกที่ดูเหมือนจะบ่งบอกว่ามีวิธี แต่ฉันไม่สามารถหาได้ในเอกสาร


3
ฉันใช้mergeเวลาตลอดเวลาสำหรับสาขาเมื่อยังไม่ได้ทำการผูกมัดรีโมทเพื่อส่งต่ออย่างรวดเร็ว ดูเหมือนจะเป็นวิธีที่ง่ายและปลอดภัยที่สุดในการทำเช่นนี้ ฉันอยากรู้คุณเห็นได้ชัดว่ามีกรณีใช้ ทำไมคุณต้องการสร้างการรวมที่ไม่มีด้านใดด้านหนึ่งของสาขา
CB Bailey

12
ฉันใช้สาขาเพื่อสร้างการจัดกลุ่มแบบลอจิคัล ดังนั้นถ้าฉันรวมมันเป็นวิธีที่จะพูดว่า "คอมมิชชันเหล่านี้ไปด้วยกัน" คุณเกือบจะคิดได้ว่ามันเป็นการลดและสควอชแบบโต้ตอบของคนยากจน :-)
Jason Baker

13
การปิดการส่งต่ออย่างรวดเร็วมีประโยชน์อย่างยิ่งโดยเฉพาะอย่างยิ่งเมื่อทำตามแบบจำลองเช่นรูปแบบการแยกสาขาของ Git ที่ประสบความสำเร็จ
steinybot

2
โปรดเปลี่ยนคำตอบที่ยอมรับสำหรับสิ่งนี้เป็นคำตอบstackoverflow.com/a/6810687/3408ของ Eric Platon - ฉันทำตามขั้นตอนในคำตอบที่ยอมรับแล้วก็รู้ว่ามันเป็นเพียงสาขาหลักในที่เก็บปัจจุบันซึ่งโง่
rjmunro

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

คำตอบ:


282

ใช่--no-ffแล้ว คุณสามารถกำหนดค่าตัวเลือกการผสานต่อสาขาได้เช่น

git config branch.master.mergeoptions  "--no-ff"

เพิ่มสิ่งต่อไปนี้ใน$(REPO)/.git/configไฟล์ของคุณ:

[branch "master"]
    mergeoptions = --no-ff

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

Footnote 2 ทศวรรษต่อมา: คำตอบอื่น ๆ ด้านล่างมีตัวเลือกการกำหนดค่าที่ทันสมัยกว่า แต่จริงๆแล้วคุณอาจต้องการอยู่กับค่าเริ่มต้น (เช่นการส่งต่อที่รวดเร็วเมื่อใดก็ตามที่เป็นไปได้) ในวันและอายุนี้เนื่องจากการผสานที่ว่างเปล่า สร้างประวัติศาสตร์ให้ยากขึ้นด้วยเหตุผล


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

12
@ โทมัส: ใช่; git pullเป็น+git fetch git merge
Michelle Tilley

9
มันดูดี แต่มีวิธีใดที่จะทำได้ทั่วโลกสำหรับทุกสาขาแทนที่จะต้องตั้งค่าสำหรับทุกสาขาหรือไม่
bwinton

33
ระวังมังกร ตัวเลือกนี้มีอันตรายเช่นเดียวกับ @Thomas ที่กล่าวว่า ... การดึง git ทุกครั้งสร้างการรวม git pull --ff ไม่แทนที่ mergeoptions = no-ff ใน git config
Dalibor Filus

15
ถ้าฉันแค่เบื่อที่จะพิมพ์git merge --no-ff (branchname)ล่ะ และฉันต้องการที่git pullจะทำงานเหมือนที่เคยมีมา?
Dogweather

341

ดูเหมือนว่ายังมีคำถามที่ค้างอยู่ในเธรด: วิธีทำทั่วโลก (เช่นสำหรับสาขาทั้งหมด)? สำหรับบันทึกเราสามารถใช้สิ่งต่อไปนี้:

git config --add merge.ff false

... เพื่อให้ใช้ได้กับทุกสาขาในที่เก็บปัจจุบัน ในการทำให้มันใช้ได้กับทุกสาขาในที่เก็บทั้งหมดที่บางคนไม่ได้รันโดยไม่มี--globalตัวเลือก (การตั้งค่าท้องถิ่นแทนที่ทั่วโลก) ให้รันสิ่งนี้:

git config --global --add merge.ff false

จากเอกสาร :

merge.ff
โดยค่าเริ่มต้น git จะไม่สร้างการรวมพิเศษเมื่อทำการรวมการคอมมิทที่เป็นการสืบทอดของการคอมมิทปัจจุบัน แต่เคล็ดลับของสาขาปัจจุบันจะถูกส่งต่ออย่างรวดเร็ว เมื่อตั้งค่าเป็นเท็จตัวแปรนี้จะบอกให้คอมไพล์สร้างคอมมิวนิตี้การรวมแบบพิเศษในกรณีดังกล่าว (เทียบเท่ากับการให้--no-ffตัวเลือกจากบรรทัดคำสั่ง) เมื่อตั้งค่าเป็นเท่านั้นอนุญาตให้มีการรวมอย่างรวดเร็วไปข้างหน้า (เทียบเท่ากับการให้--ff-onlyตัวเลือกจากบรรทัดคำสั่ง)


18
หมายเหตุ: merge.ffเปิดตัวใน Git 1.7.6 มันไม่มีประสิทธิภาพในรุ่นที่เก่ากว่า
Chris Johnsen

2
สำหรับผู้ที่ใช้ Git 1.7.6 นี่เป็นทางออกที่ดีที่สุดและง่ายที่สุด
Ryan Lundy

22
ฉันใช้สิ่งนี้ร่วมกับนามแฝงpuff = "pull --ff --ff-only"
stigi

11
นอกจากนี้ยังมี (ตอนนี้ดูgit-scm.com/docs/git-config ) ตัวเลือกpull.ffซึ่งสามารถตั้งค่าได้เท่านั้นซึ่งจะทำเช่นเดียวกับนามแฝง
jotomo

1
ขอบคุณ @jotomo คุณลักษณะดังกล่าวมีให้ใน Git v2.0.0 (จากการคอมมิท b814da891e8261b909fc5d9fb07b4e8b13989c2d)
Eric Platon

14

การอ่านชุดคำตอบฉันลงเอยด้วยการใช้สองตัวเลือกต่อไปนี้

git config --global pull.ff only # Disallows non ff merges on pull. Overrides merge.ff when pulling
git config --global merge.ff false # even create extra merge commit when fast forward merge would be possible

เฉพาะที่เกี่ยวข้องอย่างหลวม ๆ ฉันได้พบการตั้งค่านี้เพื่อหลีกเลี่ยงปัญหาระหว่างการดึง

git config --global pull.rebase true # set up pull to rebase instead of merge

1
git config - global pull.rebase true # notice 'true' ที่ท้ายบรรทัด
zowers

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