Git - ความแตกต่างระหว่าง push.default“ การจับคู่” กับ“ ง่าย ๆ ” คืออะไร


285

ตอนนี้ฉันใช้คอมไพล์มาซักพักแล้ว แต่ฉันไม่เคยตั้ง repo ทางไกลตัวใหม่มาก่อนและฉันก็อยากรู้อยากเห็น ฉันได้อ่านบทช่วยสอนและฉันสับสนในการรับ "git push" ในการทำงาน

ถ้าฉันเพียงแค่ใช้git pushมันขอให้ฉันดูสาขาเริ่มต้น (?) เพื่อชี้ไปที่? ความแตกต่างระหว่างสองตัวเลือกนี้มันให้ฉันเป็นอย่างไร

git config --global push.default matching
git config --global push.default simple

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



1
ตอนนี้ถ้ามีเพียงpull.defaultสำหรับการอัปเดตสาขาทั้งหมดในพื้นที่
— Nogurenn

คำตอบ:


368

git push สามารถผลักสาขาทั้งหมดหรือสาขาเดียวขึ้นอยู่กับการกำหนดค่านี้:

ผลักดันทุกสาขา

git config --global push.default matching

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

กดเฉพาะสาขาปัจจุบัน

git config --global push.default simple

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


16
ฉันชอบpush.default currentคำตอบจาก @UpAndAdam ไม่ทราบเกี่ยวกับมัน
— alanjds

4
โปรดทราบว่าsimpleไม่มีตัวเลือกอีกต่อไป ใน1.7.8.4(และก่อนหน้า?) มันส่งผลให้เกิดข้อผิดพลาดเมื่อคุณพยายามที่จะผลักดัน แต่currentยังคงมีอยู่
— sixty4bit

@ sixty4bit: ฉันใช้ git เวอร์ชั่น 1.7.1 ฉันกำลังใช้tracking-> ผลักดันสาขาปัจจุบันไปยังสาขาต้นน้ำ
— kevinarpe

@ sixty4bit ไม่มันรวมอยู่ใน Git เวอร์ชันใหม่กว่าซึ่งฉันไม่รู้ แต่ (1.7) นั้นเก่าแก่มากแม้ว่าในปี 2559 ฉันไม่แนะนำให้ใช้เวอร์ชั่นเก่าเลย
— Schmoudi

downvoted ขออภัยคำอธิบายของหน้าลิงค์ที่เชื่อมโยงsimpleนั้นไม่สมเหตุสมผลขัดแย้งกับคำตอบนี้และไม่ถูกต้องซึ่งทำให้คำตอบนี้สับสน หน้าที่ลิงก์มาจะพูดว่าsimple"จะผลักสาขาไปทีละส่วนเชื่อมต่อกับสาขาปัจจุบันเป็นส่วนใหญ่" นั่นหมายความว่ามันจะผลักกิ่งไม้ตามลำดับเมื่อเทียบกับขนานหรือไม่? "เชื่อมต่อส่วนใหญ่" หมายความว่าอะไร? จากนั้นคำอธิบายสำหรับsimpleไปในการพูดรายละเอียดของmatchingที่หนึ่งจะคิดว่าหมายถึงรายละเอียดของยังนำไปใช้matching simpleแต่เห็นได้ชัดว่าไม่เป็นความจริง
— tvanc

91

จากเอกสาร GIT: Git Docs

ด้านล่างให้ข้อมูลที่ครบถ้วน ในระยะสั้นsimpleจะกดcurrent working branchและแม้กระทั่งถ้ามันยังมีชื่อเดียวกันบนรีโมท นี่เป็นการตั้งค่าที่ดีมากสำหรับผู้เริ่มต้นและจะเป็นค่าเริ่มต้นGIT 2.0

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

ในการใช้งานส่วนตัวของฉันฉันมักจะใช้ตัวเลือกที่แตกต่างกัน: currentซึ่งผลักดันสาขาการทำงานปัจจุบัน (เพราะฉันมักจะสาขาสำหรับการเปลี่ยนแปลงใด ๆ ) แต่สำหรับผู้เริ่มต้นฉันขอแนะนำsimple

push.default
กำหนด action git push ที่ควรทำหากไม่มีการระบุ refspec อย่างชัดเจน ค่าที่ต่างกันนั้นเหมาะสมสำหรับเวิร์กโฟลว์เฉพาะ ตัวอย่างเช่นในเวิร์กโฟลว์ส่วนกลางล้วน ๆ (เช่นแหล่งดึงข้อมูลเท่ากับปลายทางของการส่งข้อมูล) ต้นน้ำอาจเป็นสิ่งที่คุณต้องการ ค่าที่เป็นไปได้คือ:

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

กระแสน้ำ - ผลักดันสาขาปัจจุบันเพื่ออัพเดทสาขาที่มีชื่อเดียวกันกับที่สิ้นสุดการรับ ทำงานได้ทั้งในส่วนกลางและไม่ใช่เวิร์กโฟลว์

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

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

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

โหมดนี้จะกลายเป็นค่าเริ่มต้นใน Git 2.0

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

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

นี่เป็นค่าเริ่มต้นในขณะนี้ แต่ Git 2.0 จะเปลี่ยนค่าเริ่มต้นเป็นแบบง่าย


ใช่ แต่ฉันคิดว่าแม้จะมีการตั้งค่า push.default ว่าถ้าคุณทำ "$ git push master ต้นกำเนิด " มันจะผลักสาขาปัจจุบันให้กำเนิดสาขาที่กำเนิดด้วยชื่อเดียวกันใช่ไหม? คุณควรพูดถึงว่ามีรีโมตเริ่มต้นด้วยเช่นกัน
— Alexander Mills

1
ฉันไม่แน่ใจว่าฉันเข้าใจสิ่งที่คุณได้รับ ในโหมดใดก็ได้ถ้าคุณบอกว่าgit push origin masterมันจะทำแบบเดียวกัน จุดของโหมดและค่าเริ่มต้นโดยทั่วไปแล้วจะเกิดอะไรขึ้นเมื่อคุณพูดgit pushและคุณจะไม่บอกรีโมตหรือสาขา การตั้งค่าเริ่มต้นใด คุณหมายถึงการตั้งค่าเริ่มต้นของ push.default หรือไม่ การตั้งค่าเริ่มต้นในเวอร์ชัน git ... หากคุณไม่ได้รับความคิดเห็นของคุณจะคลุมเครือมาก
— UpAndAdam

'push.default กำหนด action git push ที่ควรทำหากไม่มีการให้ refspec อย่างชัดเจน' ถ้าคุณบอกว่า master git push origin คุณให้ข้อมูลเพิ่มเติม แต่ก็อาจไม่ทำตามที่คุณอธิบาย ขึ้นอยู่กับ refspec ที่คุณตั้งค่า .. git-scm.com/book/en/v2/Git-Internals-The-Refspec
— UpAndAdam

2

บันทึกประจำรุ่น Git v2.0

บันทึกความเข้ากันได้ย้อนหลัง

เมื่อgit push [$there]ไม่พูดสิ่งที่จะผลักดันเราได้ใช้ความหมาย "การจับคู่" แบบดั้งเดิมมาแล้ว (สาขาของคุณทั้งหมดถูกส่งไปยังระยะไกลตราบใดที่มีสาขาที่มีชื่อเดียวกันอยู่แล้ว) ใน Git 2.0 ค่าเริ่มต้นคือความหมาย "แบบง่าย" ซึ่งจะผลักดัน:

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

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

คุณสามารถใช้ตัวแปรการกำหนดค่า "push.default" เพื่อเปลี่ยนแปลงสิ่งนี้ หากคุณเป็นตัวจับเวลาเก่าที่ต้องการใช้ความหมาย "การจับคู่" ต่อไปคุณสามารถตั้งค่าตัวแปรเป็น "การจับคู่" ได้ อ่านเอกสารสำหรับความเป็นไปได้อื่น ๆ

เมื่อgit add -uและgit add -Aรันภายในไดเร็กทอรีย่อยโดยไม่ระบุพา ธ ที่จะเพิ่มในบรรทัดคำสั่งพวกมันจะทำงานบนทรีทั้งหมดเพื่อความสอดคล้องกับgit commit -aและคำสั่งอื่น ๆ (คำสั่งเหล่านี้ใช้เพื่อทำงานกับไดเร็กทอรีย่อยปัจจุบันเท่านั้น) พูดgit add -u .หรือgit add -A .ถ้าคุณต้องการ จำกัด การทำงานในไดเรกทอรีปัจจุบัน

git add <path>เหมือนกับgit add -A <path>ตอนนี้ดังนั้น git add dir/จะสังเกตเห็นเส้นทางที่คุณลบออกจากไดเรกทอรีและบันทึกการลบ ใน Git เวอร์ชันเก่าgit add <path>ใช้เพื่อละเว้นการลบ คุณสามารถพูดgit add --ignore-removal <path>เพื่อเพิ่มเฉพาะเส้นทางที่เพิ่มหรือแก้ไขใน<path>ถ้าคุณต้องการจริงๆ

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