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.