“ simple” เทียบกับ“ current” push.default ใน git สำหรับเวิร์กโฟลว์แบบกระจายอำนาจ


122

พูดตามหน้าที่ในเวิร์กโฟลว์แบบกระจายอำนาจฉันไม่เห็นความแตกต่างระหว่างsimpleและcurrentตัวเลือกสำหรับpush.defaultการตั้งค่าการกำหนดค่า

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

ใครช่วยอธิบายความแตกต่างที่สำคัญระหว่างสองอย่างสำหรับเวิร์กโฟลว์แบบกระจายอำนาจที่ฉันขาดหายไปได้ไหม



2
@Trevor - ไม่เกี่ยวข้องกับคำถามของฉันเลย
void.pointer

คำตอบ:


185

ความแตกต่างคือมีsimple, git push(โดยไม่ต้องผ่าน refspec ก) จะล้มเหลวถ้าสาขาปัจจุบันไม่ได้ติดตามสาขาต้นน้ำระยะไกล (แม้ว่าสาขาที่มีชื่อเดียวกันที่มีอยู่ในระยะไกล):

$ git checkout -b foo
Switched to a new branch 'foo'

$ git config push.default simple
$ git push
fatal: The current branch foo has no upstream branch.
To push the current branch and set the remote as upstream, use

    git push --set-upstream origin foo

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

$ git config push.default current
$ git push
Total 0 (delta 0), reused 0 (delta 0)
To /Documents/GitHub/bare
 * [new branch]      foo-> foo

เอกสารประกอบ

จากเอกสารการกำหนดค่า Git :

  • upstream - ผลักดันสาขาปัจจุบันสู่สาขาต้นน้ำ ...

  • simple - เหมือนต้นน้ำ แต่ไม่ยอมผลักดันหากชื่อสาขาต้นน้ำแตกต่างจากท้องถิ่น ...

  • current - ดันสาขาปัจจุบันไปยังสาขาที่มีชื่อเดียวกัน


4
ฉันเดาว่าคำถามเฉพาะ "โบนัส" คือ "ทำไม" ฉันเดาว่าการบังคับให้สาขาการติดตามต้นน้ำช่วยขจัดข้อผิดพลาด (เขียนทับสาขานั้นโดยไม่ได้ตั้งใจในรีโมทที่ไม่ถูกต้อง)
void.pointer

7
ดูเหมือนง่ายตัวเลือก "เข็มขัดนิรภัย" ที่ปลอดภัยกว่า
Jonathan

2
ทบทวนคำถามของตัวเองหลังจากผ่านไปนาน :-) currentรู้ได้อย่างไรว่าจะเลือกรีโมทตัวไหน หากคุณไม่มีชุดสาขาการติดตามจะส่งไปที่ใด
void.pointer

2
มันดันไปที่รีโมตเริ่มต้น -> นั่นหมายถึงจุดเริ่มต้น จาก man git-push: เมื่อบรรทัดคำสั่งไม่ได้ระบุตำแหน่งที่จะพุชด้วยอาร์กิวเมนต์ <repository> จะมีการปรึกษาการกำหนดค่ารีโมต branch. * สำหรับสาขาปัจจุบันเพื่อกำหนดตำแหน่งที่จะพุช หากการกำหนดค่าขาดหายไปค่าเริ่มต้นจะเป็นจุดเริ่มต้น
reegnz

2
ฉันใช้ 'ปัจจุบัน' มาโดยตลอดโดยไม่มีปัญหาใด ๆ สำหรับกรณีส่วนใหญ่ใช้งานได้: ดึง / ผลักดันไปที่ repo เดียวสร้างสาขาใหม่หรือตรวจสอบสาขาที่มีอยู่ซึ่งไม่น่าจะเกิดความขัดแย้งในการตั้งชื่อ ใช้งานได้ดีไม่มีปัญหา ไม่สามารถพูดได้ว่าควรเป็นค่าเริ่มต้น (เนื่องจากไม่ปลอดภัย) แต่ขอบคุณพระเจ้าที่มีอยู่
trisweb

10

ความแตกต่างคือจะถูกส่งsimpleไปยังสาขาการติดตามหากมีชื่อเดียวกันในขณะที่currentจะส่งไปยังสาขาที่มีชื่อเดียวกันโดยไม่คำนึงถึงสาขาการติดตามใด ๆ :

$ git branch -vvv
  master 58d9fdc [origin/master: ahead 1] t1 bobo
* new    37132d3 [origin/save: ahead 1] t1 bibi   # <- tracking branch 'save'

$ git -c push.default=current push                # <- set `push.default=current`
Counting objects: 3, done.
Writing objects: 100% (3/3), 234 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To /home/jthill/sandbox/20/t1
 * [new branch]      new -> new                   # <- and push creates `new` 
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.