จะทำให้ Git pull ใช้ rebase เป็นค่าเริ่มต้นสำหรับที่เก็บข้อมูลทั้งหมดของฉันได้อย่างไร


186

มีวิธีการตั้งค่าพื้นที่เก็บข้อมูลโฮสต์ Git ที่git pullทำจากโคลน (ท้องถิ่น) ของใช้--rebaseโดยค่าเริ่มต้น? จากการค้นหาใน Stack Overflow ฉันได้เรียนรู้เกี่ยวกับbranch.autosetuprebaseแต่ต้องกำหนดค่าแต่ละโคลน

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


6
ทำไมคุณต้องการที่ ฉันคิดว่ามันสมเหตุสมผลมากกว่าที่จะสอนผู้ใช้ให้คิดอย่างแข็งขันว่ากรณีใดจะเหมาะสมกว่า (ขึ้นอยู่กับขนาดของการเปลี่ยนแปลงที่พวกเขาทำหรือคาดหวังจากอัปสตรีม) '
Jonas Schäfer

4
@JonasWielicki ใช่ฉันเห็นด้วย เป็นเพียงว่าสมาชิกในทีมของฉันบางคนยังใหม่กับ Git และฉันต้องการทราบว่ามีวิธีการบังคับใช้เพื่อหลีกเลี่ยงปัญหาในช่วงเริ่มต้นหรือไม่ (จนกว่าพวกเขาจะได้เรียนรู้) ทีมยังทำงานจากระยะไกลในเขตเวลาที่แตกต่างกันซึ่งหมายความว่าพวกเขาจะติดอยู่เป็นเวลาหลายชั่วโมงหากมีอะไรผิดพลาด แค่อยากรู้ว่าเป็นไปได้ไหม
ชายสวมหน้ากาก

1
ฉันคิดว่าโดยเฉพาะอย่างยิ่งสำหรับการตั้งค่าเริ่มต้นจะดีกว่าที่จะรวม Rebase ทำให้สิ่งที่แปลกประหลาดมากขึ้นถ้ารหัสของคุณเบี่ยงเบนไป คุณต้องแก้ไขข้อขัดแย้งเดิมซ้ำแล้วซ้ำอีกจนกว่าคุณจะผลักดัน ดังนั้นหากสมาชิกในทีมต้องการทำงานกับโค้ดให้ใช้ rebase และไม่ผลักจนกว่าเขาจะทำเสร็จ (ซึ่งผู้มาใหม่อาจทำแทนที่จะแยกตัวเอง) พวกเขาจะต้องเผชิญกับความขัดแย้งแบบเดียวกันที่พวกเขาแก้ไข X ครั้งแล้ว .
Jonas Schäfer

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

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

คำตอบ:


205

ขณะนี้มีการกำหนดค่า 3 ระดับที่แตกต่างกันสำหรับพฤติกรรมการดึงเริ่มต้น จากคนทั่วไปไปจนถึงคนที่ดีที่สุด:

1 pull.rebase

การตั้งค่านี้เป็นtrueวิธีที่git pullเทียบเท่ากับเสมอgit pull --rebase(เว้นแต่branch.<branchname>.rebaseตั้งค่าไว้อย่างชัดเจนfalse) นอกจากนี้ยังสามารถตั้งค่าต่อที่เก็บหรือทั่วโลก

2 branch.autosetuprebase

การตั้งค่านี้เป็นalwaysหมายความว่าเมื่อใดก็ตามที่มีการสร้างสาขาการติดตามรายการการกำหนดค่าเช่นเดียวกับด้านล่างจะถูกสร้างขึ้น สำหรับการควบคุมปลีกย่อยเม็ดเล็กนี้ยังสามารถตั้งค่าให้never, localหรือremoteและสามารถตั้งค่าต่อพื้นที่เก็บข้อมูลหรือทั่วโลก ดูgit config --helpรายละเอียดเพิ่มเติมได้ที่

3 branch.<branchname>.rebase

การตั้งค่านี้เพื่อtrueหมายความว่าสาขาเฉพาะจะดึงจากต้นน้ำผ่านการรีบูทเสมอเว้นแต่git pull --no-rebaseจะใช้อย่างชัดเจน

ข้อสรุป

ดังนั้นในขณะที่คุณไม่สามารถเปลี่ยนพฤติกรรมเริ่มต้นสำหรับทุกโคลนอนาคตของพื้นที่เก็บข้อมูลที่คุณสามารถเปลี่ยนค่าเริ่มต้นทั้งหมดของที่เก็บ (ที่มีอยู่และในอนาคต) git config --global pull.rebase trueของผู้ใช้ปัจจุบันผ่าน


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

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

139

เกี่ยวกับ

git config --global pull.rebase true

นี่จะบอกคอมไพล์ให้ดึงด้วยการรีบูตเสมอ


3
ขอขอบคุณวิธีนี้ใช้ได้ดีสำหรับสาขาการติดตามที่มีอยู่
Fls'Zen

1
โปรดลบออก--boolมันไม่จำเป็น
diralik

38

คำตอบคือไม่

ไม่มีวิธีการตั้งค่าพื้นที่เก็บข้อมูลระยะไกลเพื่อให้ทุกคนที่โคลนมันมีพฤติกรรมเริ่มต้นของการgit pullเปลี่ยนแปลง

อย่างไรก็ตามคุณสามารถตั้งค่าเบ็ดฝั่งเซิร์ฟเวอร์ที่ตรวจสอบว่าไม่มีใครผลักดันการรวม ( อาจเป็นแบบนี้ )

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

1. ตัวเลือก branch.<name>.rebase

คุณสามารถกำหนดค่าสาขาท้องถิ่นที่จะใช้--rebaseเช่นนี้แทนที่<name>ด้วยชื่อสาขา:

git config branch.<name>.rebase true

หลังจากทำงานเกี่ยวกับเรื่องนี้masterที่masterส่วนในการ.git/configมองเช่นนี้

[branch "master"]
    remote = origin
    merge = refs/heads/master
    rebase = true

2. ตัวเลือก branch.autosetuprebase

การเรียกใช้คำสั่ง config ก่อนหน้านี้สำหรับทุกสาขา Git อาจเป็นเรื่องยุ่งยากดังนั้นคุณสามารถกำหนดค่า Git ให้ตั้งค่าโดยอัตโนมัติสำหรับสาขาใหม่ทุกแห่ง:

git config branch.autosetuprebase always

(คุณยังสามารถระบุnever, remoteและlocalดูman git-configรายละเอียด.)

หากไม่มี--globalตัวเลือกการกำหนดค่าจะถูกบันทึกไว้.git/configและเฉพาะที่เก็บปัจจุบันเท่านั้นที่ได้รับผลกระทบ ด้วย--globalการกำหนดค่าจะถูกบันทึกไว้~/.gitconfigและที่เก็บข้อมูลที่ไม่ได้กำหนดค่าทั้งหมดจะได้รับผลกระทบ

ตัวเลือกนี้จะไม่ส่งผลกระทบต่อสาขาที่มีอยู่แล้ว

3. ตัวเลือก pull.rebase

git config --bool pull.rebase true

(คุณสามารถให้--globalตัวเลือกได้ด้วย)

ถ้าตัวเลือกนี้เป็นความจริงการทำงานgit pullเทียบเท่ากับgit pull --rebaseเว้นแต่ได้รับการตั้งค่าให้branch.<name>.rebasefalse


3

ทำให้--rebaseตัวเลือกนี้เป็นค่าเริ่มต้นเมื่อมีการออกgit pull ในสาขาที่กำหนด

@Flimm ฉันต้องเพิ่มtrueเพื่อให้ตัวเลือกแรกของคุณใช้งานได้

ดังนั้นไวยากรณ์ที่ถูกต้องคือ:

git config branch.<branch>.rebase true

ในการรันคำสั่งนี้บนdevelopสาขา:

git config branch.develop.rebase true

และตอนนี้developส่วนใน.git/configลักษณะเช่นนี้

[branch "develop"]
        remote = origin
        merge = refs/heads/develop
        rebase = true

ขอบคุณฉันได้แก้ไขคำตอบของฉันในอนาคตรู้สึกอิสระที่จะแก้ไขคำตอบด้วยตัวเอง
Flimm

2
Donwvoter ไม่ว่าคุณจะเป็นใครโปรดอธิบายเหตุผลของคุณ การ downvoting โดยไม่ต้องแสดงความคิดเห็นดูเหมือนอย่างสมบูรณ์โดยพลการและไม่เป็นธรรมกับฉัน
Daishi

1

ขณะนี้ไม่มีวิธีตั้งค่านโยบายเริ่มต้นสำหรับที่เก็บ

หากคุณต้องการด้วยตัวคุณเองและคุณใช้อย่างน้อย git 1.7.9 คุณสามารถกำหนดpull.rebaseค่าได้ดังนี้:

git config --global pull.rebase true

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

หากคุณไม่ต้องการผสานคุณสามารถกำหนดเบ็ดฝั่งเซิร์ฟเวอร์เพื่อปฏิเสธการพุชด้วยการผสาน

สำหรับการอ้างอิงของคุณเขาเป็นแหล่งข้อมูลสำหรับ pull.rebase:

เมื่อเป็นจริงรีบูตสาขาที่ด้านบนของสาขาที่ดึงข้อมูลแทนที่จะรวมสาขาเริ่มต้นจากรีโมตเริ่มต้นเมื่อเรียกใช้ "git pull" ดูที่ "branch..rebase" สำหรับการตั้งค่านี้สำหรับแต่ละสาขา

เมื่อทำการผสานผ่านตัวเลือก --rebase-merges เพื่อคอมไพล์รีบูตเพื่อให้คอมมิชชันการรวมโลคัลรวมอยู่ในรีบูต (ดู รายละเอียดgit-rebase )

เมื่อเก็บรักษาให้ส่งผ่าน --preserve- การผสานพร้อมกับการรีบูท git เพื่อให้คอมมิชชันการคอมมิทที่ทำไว้ภายในเครื่องจะไม่ถูกแบนด้วยการดึง git

เมื่อค่าเป็นแบบโต้ตอบการรีบูตจะทำงานในโหมดโต้ตอบ

หมายเหตุ: นี่เป็นการดำเนินการที่อาจเป็นอันตราย อย่าใช้มันจนกว่าคุณจะเข้าใจความหมาย (ดูgit-rebaseสำหรับรายละเอียด)

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