TL; DR: git branch --set-upstream-to origin/solaris
คำตอบสำหรับคำถามที่คุณถาม - ซึ่งฉันจะเขียนใหม่เล็กน้อยว่า "ฉันต้องตั้งค่าต้นน้ำ" คือ: ไม่คุณไม่ต้องตั้งค่าต้นน้ำเลย
อย่างไรก็ตามหากคุณไม่มีต้นน้ำสำหรับสาขาปัจจุบัน Git จะเปลี่ยนพฤติกรรมของมันgit push
และคำสั่งอื่น ๆ ด้วย
เรื่องราวการผลักดันที่สมบูรณ์ที่นี่ยาวและน่าเบื่อและย้อนกลับไปในประวัติศาสตร์ก่อน Git เวอร์ชัน 1.5 เพื่อให้สั้นลงมากgit push
มีการนำไปใช้งานไม่ดี 1 ในฐานะของ Git รุ่น 2.0 Git ตอนนี้มีการกำหนดค่าลูกบิดสะกดซึ่งขณะนี้เริ่มต้นที่push.default
simple
สำหรับ Git หลายเวอร์ชันก่อนและหลัง 2.0 ทุกครั้งที่คุณวิ่งgit push
Git จะส่งเสียงดังออกมามากมายเพื่อพยายามโน้มน้าวให้คุณตั้งค่าpush.default
เพื่อที่git push
จะปิดเครื่อง
คุณไม่ได้ระบุว่าคุณกำลังใช้งาน Git เวอร์ชันใดหรือไม่ว่าคุณได้กำหนดค่าไว้push.default
หรือไม่ดังนั้นเราจึงต้องเดา ฉันเดาว่าคุณกำลังใช้รุ่น Git 2 จุดบางสิ่งบางอย่างและที่คุณได้ตั้งค่าpush.default
ที่จะsimple
ได้รับมันจะปิดขึ้น อย่างแม่นยำซึ่งเป็นรุ่นของ Git ที่คุณมีและสิ่งที่ถ้าสิ่งที่คุณได้push.default
ตั้งค่าให้, ไม่ว่าเนื่องจากว่าประวัติศาสตร์อันยาวนานและน่าเบื่อ แต่ในท้ายที่สุดแล้วความจริงที่ว่าคุณจะได้รับการร้องเรียนจากยัง Git อื่นแสดงให้เห็นว่า Git ของคุณคือกำหนดค่าเพื่อหลีกเลี่ยงข้อผิดพลาดจากอดีต
ต้นน้ำคืออะไร?
ต้นน้ำเป็นเพียงอีกชื่อสาขามักจะเป็นสาขาที่ห่างไกลการติดตามที่เกี่ยวข้องกับ (ปกติท้องถิ่น) สาขา
ทุกสาขามีตัวเลือกในการตั้งค่าต้นน้ำหนึ่ง (1) ชุด นั่นคือทุกสาขามีต้นน้ำหรือไม่มีต้นน้ำ ไม่มีสาขาใดสามารถมีต้นน้ำได้มากกว่าหนึ่งแห่ง
ต้นน้ำควรแต่ไม่จำเป็นต้องเป็นสาขาที่ถูกต้อง (ไม่ว่าจะเป็นการติดตามระยะไกลเช่นหรือในพื้นที่) นั่นคือถ้าสาขาปัจจุบันBมีต้นน้ำU , ควรทำงาน ถ้ามันใช้ไม่ได้ - ถ้ามันบ่นว่าไม่มีU - Git ส่วนใหญ่จะทำราวกับว่าไม่ได้ตั้งค่าต้นน้ำเลย คำสั่งบางคำเช่นจะแสดงการตั้งค่าอัปสตรีม แต่ทำเครื่องหมายว่า "ไปแล้ว"origin/B
master
git rev-parse U
git branch -vv
ต้นน้ำคืออะไร?
หากคุณpush.default
ตั้งค่าเป็นsimple
หรือupstream
การตั้งค่าอัปสตรีมจะgit push
ใช้โดยไม่มีข้อโต้แย้งเพิ่มเติมก็ใช้ได้
git push
นั่นคือมันนั่นคือทั้งหมดที่มันไม่สำหรับ แต่นั่นค่อนข้างสำคัญเนื่องจากgit push
เป็นหนึ่งในสถานที่ที่การพิมพ์ผิดง่ายๆทำให้เกิดอาการปวดหัว
หากคุณpush.default
มีการตั้งค่าnothing
, matching
หรือการตั้งค่าต้นน้ำไม่ทำอะไรเลยสำหรับcurrent
git push
(ทั้งหมดนี้ถือว่าเวอร์ชัน Git ของคุณเป็นอย่างน้อย 2.0)
ต้นน้ำส่งผลกระทบ git fetch
หากคุณเรียกใช้git fetch
โดยไม่มีอาร์กิวเมนต์เพิ่มเติม Git จะคำนวณว่าจะดึงข้อมูลจากรีโมตใดโดยปรึกษาต้นน้ำของสาขาปัจจุบัน หากต้นน้ำเป็นสาขาการติดตามระยะไกล Git จะดึงข้อมูลจากรีโมตนั้น (หากไม่ได้ตั้งค่าต้นน้ำหรือเป็นสาขาในพื้นที่ Git จะพยายามดึงข้อมูลorigin
)
ต้นน้ำส่งผลกระทบgit merge
และgit rebase
ด้วย
หากคุณเรียกใช้git merge
หรือgit rebase
ไม่มีอาร์กิวเมนต์เพิ่มเติม Git จะใช้ต้นน้ำของสาขาปัจจุบัน ดังนั้นจึงทำให้การใช้สองคำสั่งนี้สั้นลง
ต้นน้ำส่งผลกระทบ git pull
คุณไม่ควรใช้2 อย่างgit pull
ต่อไป แต่ถ้าคุณทำให้git pull
ใช้การตั้งค่าต้นน้ำเพื่อดูว่าจะดึงข้อมูลจากรีโมตใดจากนั้นสาขาใดที่จะรวมหรือสร้างฐานใหม่ด้วย นั่นคือgit pull
จะเป็นสิ่งเดียวกันเป็นgit fetch
-because มันจริงทำงาน git fetch
และอื่นแล้วจะเป็นสิ่งเดียวกันเป็นgit merge
หรือgit rebase
เพราะมันจริงทำงาน หรือgit merge
git rebase
(โดยปกติคุณควรทำสองขั้นตอนนี้ด้วยตนเองอย่างน้อยก็จนกว่าคุณจะรู้จัก Git ดีพอที่เมื่อขั้นตอนใดขั้นตอนหนึ่งล้มเหลวซึ่งในที่สุดคุณก็จะรับรู้สิ่งที่ผิดพลาดและรู้ว่าต้องทำอย่างไรกับมัน)
ต้นน้ำส่งผลกระทบ git status
สิ่งนี้อาจสำคัญที่สุด เมื่อคุณตั้งค่าอัปสตรีมแล้วgit status
คุณสามารถรายงานความแตกต่างระหว่างสาขาปัจจุบันของคุณกับสาขาต้นน้ำในแง่ของการคอมมิต
หากเป็นกรณีปกติคุณอยู่ในสาขาB
โดยตั้งค่าต้นน้ำเป็นและคุณเรียกใช้คุณจะเห็นได้ทันทีว่าคุณได้กระทำที่คุณสามารถผลักดันและ / หรือยอมรับว่าคุณสามารถรวมหรือตั้งฐานใหม่ได้origin/B
git status
เนื่องจากการgit status
รัน:
git rev-list --count @{u}..HEAD
: คุณมีข้อผูกมัดกี่ข้อกับB
สิ่งที่ไม่ได้ทำ?origin/B
git rev-list --count HEAD..@{u}
: คุณมีข้อผูกมัดกี่ข้อกับสิ่งที่ไม่ได้ทำ?origin/B
B
การตั้งค่าต้นน้ำทำให้คุณได้รับสิ่งเหล่านี้ทั้งหมด
วิธีมาmaster
แล้วมีชุดต้นน้ำ?
เมื่อคุณโคลนจากระยะไกลเป็นครั้งแรกโดยใช้:
$ git clone git://some.host/path/to/repo.git
หรือคล้ายกันขั้นตอนสุดท้าย Git git checkout master
ไม่สามารถเป็นหลัก การตรวจสอบจากสาขาในประเทศนี้master
เท่านั้นคุณไม่ได้มีmaster
สาขาในท้องถิ่น
บนมืออื่น ๆ คุณจะมีสาขาที่ห่างไกลติดตามชื่อorigin/master
เพราะคุณเพียงแค่โคลนมัน
Git เดาว่าคุณต้องหมายถึง: "ทำให้ฉันเป็นคนท้องถิ่นใหม่master
ที่ชี้ไปที่การกระทำเดียวกันกับการติดตามระยะไกลorigin/master
และในขณะที่คุณอยู่ให้ตั้งค่าต้นน้ำสำหรับmaster
เป็นorigin/master
"
สิ่งนี้เกิดขึ้นกับทุกสาขาgit checkout
ที่คุณยังไม่มี Git สร้างสาขาและทำให้ "ติดตาม" (มีเป็นต้นน้ำ) สาขาการติดตามระยะไกลที่เกี่ยวข้อง
แต่ตอนนี้ไม่ได้ทำงานใหม่สาขาคือสาขาที่ไม่มีสาขาที่ห่างไกลการติดตามเลย
หากคุณสร้างสาขาใหม่ :
$ git checkout -b solaris
origin/solaris
มีเป็นยังไม่มี ในพื้นที่ของคุณsolaris
ไม่สามารถติดตามสาขาการติดตามระยะไกลorigin/solaris
เนื่องจากไม่มีอยู่
เมื่อคุณผลักดันสาขาใหม่ครั้งแรก:
$ git push origin solaris
ที่สร้าง solaris
ขึ้นorigin
และด้วยเหตุนี้ยังสร้างorigin/solaris
ในที่เก็บ Git ของคุณเอง แต่มันสายเกินไปคุณมีท้องถิ่นsolaris
ที่ไม่มีต้นน้ำแล้ว 3
ไม่ควรตั้ง Git ตอนนี้เป็นอัปสตรีมโดยอัตโนมัติใช่หรือไม่
อาจ. ดู "ใช้งานได้ไม่ดี" และเชิงอรรถ 1 ตอนนี้เปลี่ยนยาก: มีสคริปต์4ล้านรายการที่ใช้ Git และบางสคริปต์อาจขึ้นอยู่กับพฤติกรรมในปัจจุบัน การเปลี่ยนแปลงลักษณะการทำงานจำเป็นต้องมีรีลีสหลักใหม่ nag-ware เพื่อบังคับให้คุณตั้งค่าฟิลด์คอนฟิกูเรชันและอื่น ๆ กล่าวโดยย่อ Git เป็นเหยื่อของความสำเร็จของตัวเองไม่ว่าจะมีข้อผิดพลาดใด ๆ ในวันนี้สามารถแก้ไขได้ก็ต่อเมื่อการเปลี่ยนแปลงนั้นส่วนใหญ่มองไม่เห็นชัดเจนดีขึ้นมากหรือทำได้ช้าลงเมื่อเวลาผ่านไป
ความจริงก็คือไม่มีวันนี้เว้นแต่คุณจะใช้--set-upstream
หรือ-u
ในช่วงgit push
. นั่นคือสิ่งที่ข้อความกำลังบอกคุณ
คุณไม่จำเป็นต้องทำแบบนั้น ดังที่เราได้กล่าวไว้ข้างต้นคุณไม่จำเป็นต้องทำเลย แต่สมมติว่าคุณต้องการต้นน้ำ คุณได้สร้างสาขาsolaris
ไว้origin
แล้วผ่านการพุชก่อนหน้านี้และเมื่อgit branch
ผลลัพธ์ของคุณแสดงแสดงว่าคุณมีที่ origin/solaris
เก็บในเครื่องของคุณแล้ว
solaris
คุณเพียงแค่ไม่ได้ตั้งเป็นต้นน้ำสำหรับ
git branch --set-upstream-to
ในการตั้งค่าได้ในขณะนี้มากกว่าในระหว่างการผลักดันครั้งแรกที่ใช้ --set-upstream-to
คำสั่งย่อยใช้ชื่อของสาขาที่มีอยู่เช่นorigin/solaris
และชุดต้นน้ำสาขาปัจจุบันที่สาขาอื่น ๆ
นั่นคือทั้งหมดที่ทำ - แต่มันมีผลกระทบทั้งหมดที่ระบุไว้ข้างต้น หมายความว่าคุณสามารถวิ่งgit fetch
แล้วมองไปรอบ ๆ แล้ววิ่งgit merge
หรือgit rebase
ตามความเหมาะสมจากนั้นทำการคอมมิตใหม่แล้ววิ่งgit push
โดยไม่ต้องวุ่นวายเพิ่มเติม
1เพื่อความเป็นธรรมในตอนนั้นยังไม่ชัดเจนว่าการนำไปใช้งานครั้งแรกเกิดข้อผิดพลาดได้ง่าย สิ่งนี้จะชัดเจนเมื่อผู้ใช้ใหม่ทุกคนทำผิดพลาดเหมือนกันทุกครั้ง ตอนนี้ "ยากจนน้อยลง" ซึ่งไม่ได้หมายความว่า "ยิ่งใหญ่"
2 "ไม่เคย" ค่อนข้างแรง แต่ฉันพบว่ามือใหม่ Git เข้าใจสิ่งต่าง ๆ ได้ดีขึ้นมากเมื่อแยกขั้นตอนออกโดยเฉพาะอย่างยิ่งเมื่อฉันสามารถแสดงให้พวกเขาเห็นว่าสิ่งที่git fetch
ทำได้จริงแล้วพวกเขาจะเห็นว่าอะไรgit merge
หรือgit rebase
จะทำอะไรต่อไป
3ถ้าคุณรันครั้งแรก git push
ในชื่อgit push -u origin solaris
- นี่ถ้าคุณเพิ่ม-u
แฟล็ก - Git จะตั้งค่าorigin/solaris
เป็นอัพสตรีมสำหรับสาขาปัจจุบันของคุณถ้าการพุชสำเร็จ (และต่อเมื่อ) ดังนั้นคุณควรจัดหา-u
ในการผลักดันครั้งแรก ในความเป็นจริงคุณสามารถจัดหาได้ในการผลักดันใด ๆ ในภายหลังและจะตั้งค่าหรือเปลี่ยนแปลงต้นน้ำ ณ จุดนั้น แต่ฉันคิดว่าgit branch --set-upstream-to
ง่ายกว่าถ้าคุณลืม
4วัดโดยวิธี Austin Powers / Dr Evil เพียงแค่พูดว่า "one MILLLL-YUN" เท่านั้น