อะไรคือความแตกต่างระหว่าง git push.default = current และ push.default = upstream?


89

หน้า man สำหรับ git-config แสดงรายการตัวเลือกเหล่านี้สำหรับ push.default:

nothing - do not push anything.
matching - push all matching branches. All branches having the same name in both ends are considered to be matching. This is the default.
upstream - push the current branch to its upstream branch.
tracking - deprecated synonym for upstream.
current - push the current branch to a branch of the same name.

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

UPDATE :หน้าคนสำหรับ Git-configได้รับการปรับปรุง (เป็นหนึ่งคาดหวัง) ดังนั้นความแตกต่างที่เกิดขึ้นที่นั่นอาจจะชัดเจนมากในขณะนี้


2
สำหรับนักพัฒนาแล้วมันน่ารำคาญที่จะแตกต่างกันดังนั้นจึงมีการแนะนำ 'simple' และจะเป็น bahavior เริ่มต้นสำหรับ git-push จริงๆแล้วมันปรากฏในgit 1.7.11
xhl จะ

14
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับคำเตือน git ล่าสุดpush.default is unset; its implicit value is changing in Git 2.0และเกี่ยวกับmatchingvs simpleโปรดดูstackoverflow.com/questions/13148066/…
เนท

iconoclaust: ฉันไม่คิดว่าการแก้ไขของฉันเปลี่ยนความสมบูรณ์ของคำถามเลยและข้อมูลที่ล้าสมัยจำเป็นต้องได้รับการแก้ไข เหตุใดจึงทำให้ผู้ใช้ต้องทำงานพิเศษในการคลิกลิงก์
Flimm

คำตอบ:


72

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

ตัวอย่างเช่นหากคุณทำงานในที่เก็บหลายแห่งหรือใช้รีโมตสำหรับนักพัฒนาที่ใช้ร่วมกันจำนวนมากคุณมักจะลงเอยด้วยการติดตามส้อมที่แตกต่างกันของสาขาเดียวกันเช่นallen-masterหรือsusan-masterทั้งสองอย่างติดตามmasterสาขาในที่เก็บของ Allen และ Susan ตามลำดับ ในกรณีนี้currentอาจเป็นการตั้งค่าที่ไม่ถูกต้องเนื่องจากชื่อสาขาเหล่านั้นไม่มีอยู่ในรีโมท upstreamอย่างไรก็ตามจะทำงานได้ดี

ตัวอย่างที่ใช้งานได้จริงอาจติดตามทั้ง a developmentและproductionrepository เวิร์กโฟลว์ของคุณอาจใช้สาขาหลักที่แตกต่างกันสำหรับแต่ละสาขา แต่อาจทำให้สับสนได้ สมมติว่าคุณเป็นผู้รวมโค้ดและต้องการติดตามmasterสาขาของที่เก็บทั้งสองแยกกัน

git checkout -b production --track production/master
git checkout -b development --track development/master

ตอนนี้คุณมีสองสาขาที่ติดตามที่เก็บตามลำดับซึ่งทั้งสองสาขาไม่ได้ใช้หลักการmasterตั้งชื่อเลย มีความสับสนเล็กน้อยเกี่ยวกับชื่อสาขา: พวกเขาอธิบายสิ่งที่ติดตามอย่างชัดเจน อย่างไรก็ตามpush.default = currentจะไม่มีเหตุผลใด ๆ เนื่องจากไม่มีรีโมตประกอบด้วยdevelopmentหรือproductionสาขา


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

1
@AndreKR AFAIK currentจะดีกว่าในกรณีที่คุณเป็นนักพัฒนาหน้าใหม่เพราะคุณไม่จำเป็นต้องทำอะไรgit configมากโดยเฉพาะอย่างยิ่งหากคุณโคลนจากที่ไหนสักแห่ง currentผลักดันหรือสร้างสาขา homonymous บน repo ระยะไกลให้คุณหากไม่มีอยู่แล้วในขณะที่simpleจะปฏิเสธที่จะดำเนินการนี้ทันทีเมื่อไม่มีสาขาที่มีชื่อเดียวกัน upstreamมีพฤติกรรมเดียวกันในกรณีนี้เว้นแต่จะมีการตั้งค่าสาขาต้นน้ำไว้อย่างชัดเจนหรือตั้งค่าเป็นอย่างอื่นตามที่กล่าวไว้ในคำตอบของYawar
ไม่ค่อย 'Where's Monica' Needy

6

current จะผลักสาขาปัจจุบันไปยังสาขาที่มีชื่อเดียวกันบน repo ระยะไกล

upstream จะผลักดันสาขาปัจจุบันไปยังสาขาต้นน้ำ

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

การตั้งค่าอัปสตรีมโดยปริยายทำได้ผ่านbranch.autosetupmergeค่ากำหนดค่า คุณสามารถค้นหาเอกสารประกอบได้ในgit configหน้าวิธีใช้ การตั้งค่าอัปสตรีมอย่างชัดเจนทำได้โดยใช้-uตัวเลือกสำหรับgit branchคำสั่ง ดูรายละเอียดในหน้าความช่วยเหลือ


ฉันไม่คิดว่าbranch.autoSetupMergeไม่คิดเช่นเดียวกับ/-u --set-upstreamอย่างน้อยฉันก็ไม่เห็นอะไรในเอกสารที่บ่งบอกว่ามันทำให้ git push ทำงานราวกับว่ามันถูกเรียก-uโดยค่าเริ่มต้นซึ่งดูเหมือนว่าคุณกำลังพูดสำหรับฉัน คุณสามารถชี้แจงสิ่งที่คุณหมายถึง?
waldyrious

@waldyrious นั่นเอง; เมื่อคุณกำลังตรวจสอบสาขาการติดตามระยะไกลการกำหนดbranch.autoSetupMergeค่าตามค่าเริ่มต้นจะสร้างสาขาภายในเครื่องใหม่และตั้งค่าต้นน้ำเป็นสาขาการติดตามระยะไกล การดำเนินการโดยนัยนี้สามารถทำได้อย่างชัดเจนโดยใช้แฟล็ก-t( --track) หรือ-u ...( --set-upstream-to=...) ซึ่งทำสิ่งเดียวกันกับไวยากรณ์ที่แตกต่างกันเล็กน้อย
Yawar

1
ผมเห็นสิ่งที่เกิดขึ้นที่นี่ - ตั้งแต่คำถามนี้เป็นเรื่องเกี่ยวกับgit pushผม (เข้าใจผิด) สันนิษฐานว่าคุณกำลังพูดเกี่ยวกับ-uตัวเลือกของการgit pushมากกว่าตัวเลือกในการ-u git branchขออภัยในความสับสน :)
waldyrious
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.