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 pushGit จะส่งเสียงดังออกมามากมายเพื่อพยายามโน้มน้าวให้คุณตั้งค่าpush.defaultเพื่อที่git pushจะปิดเครื่อง
คุณไม่ได้ระบุว่าคุณกำลังใช้งาน Git เวอร์ชันใดหรือไม่ว่าคุณได้กำหนดค่าไว้push.defaultหรือไม่ดังนั้นเราจึงต้องเดา ฉันเดาว่าคุณกำลังใช้รุ่น Git 2 จุดบางสิ่งบางอย่างและที่คุณได้ตั้งค่าpush.defaultที่จะsimpleได้รับมันจะปิดขึ้น อย่างแม่นยำซึ่งเป็นรุ่นของ Git ที่คุณมีและสิ่งที่ถ้าสิ่งที่คุณได้push.defaultตั้งค่าให้, ไม่ว่าเนื่องจากว่าประวัติศาสตร์อันยาวนานและน่าเบื่อ แต่ในท้ายที่สุดแล้วความจริงที่ว่าคุณจะได้รับการร้องเรียนจากยัง Git อื่นแสดงให้เห็นว่า Git ของคุณคือกำหนดค่าเพื่อหลีกเลี่ยงข้อผิดพลาดจากอดีต
ต้นน้ำคืออะไร?
ต้นน้ำเป็นเพียงอีกชื่อสาขามักจะเป็นสาขาที่ห่างไกลการติดตามที่เกี่ยวข้องกับ (ปกติท้องถิ่น) สาขา
ทุกสาขามีตัวเลือกในการตั้งค่าต้นน้ำหนึ่ง (1) ชุด นั่นคือทุกสาขามีต้นน้ำหรือไม่มีต้นน้ำ ไม่มีสาขาใดสามารถมีต้นน้ำได้มากกว่าหนึ่งแห่ง
ต้นน้ำควรแต่ไม่จำเป็นต้องเป็นสาขาที่ถูกต้อง (ไม่ว่าจะเป็นการติดตามระยะไกลเช่นหรือในพื้นที่) นั่นคือถ้าสาขาปัจจุบันBมีต้นน้ำU , ควรทำงาน ถ้ามันใช้ไม่ได้ - ถ้ามันบ่นว่าไม่มีU - Git ส่วนใหญ่จะทำราวกับว่าไม่ได้ตั้งค่าต้นน้ำเลย คำสั่งบางคำเช่นจะแสดงการตั้งค่าอัปสตรีม แต่ทำเครื่องหมายว่า "ไปแล้ว"origin/Bmastergit rev-parse U git branch -vv
ต้นน้ำคืออะไร?
หากคุณpush.defaultตั้งค่าเป็นsimpleหรือupstreamการตั้งค่าอัปสตรีมจะgit pushใช้โดยไม่มีข้อโต้แย้งเพิ่มเติมก็ใช้ได้
git pushนั่นคือมันนั่นคือทั้งหมดที่มันไม่สำหรับ แต่นั่นค่อนข้างสำคัญเนื่องจากgit pushเป็นหนึ่งในสถานที่ที่การพิมพ์ผิดง่ายๆทำให้เกิดอาการปวดหัว
หากคุณpush.defaultมีการตั้งค่าnothing, matchingหรือการตั้งค่าต้นน้ำไม่ทำอะไรเลยสำหรับcurrentgit 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 mergegit rebase
(โดยปกติคุณควรทำสองขั้นตอนนี้ด้วยตนเองอย่างน้อยก็จนกว่าคุณจะรู้จัก Git ดีพอที่เมื่อขั้นตอนใดขั้นตอนหนึ่งล้มเหลวซึ่งในที่สุดคุณก็จะรับรู้สิ่งที่ผิดพลาดและรู้ว่าต้องทำอย่างไรกับมัน)
ต้นน้ำส่งผลกระทบ git status
สิ่งนี้อาจสำคัญที่สุด เมื่อคุณตั้งค่าอัปสตรีมแล้วgit statusคุณสามารถรายงานความแตกต่างระหว่างสาขาปัจจุบันของคุณกับสาขาต้นน้ำในแง่ของการคอมมิต
หากเป็นกรณีปกติคุณอยู่ในสาขาBโดยตั้งค่าต้นน้ำเป็นและคุณเรียกใช้คุณจะเห็นได้ทันทีว่าคุณได้กระทำที่คุณสามารถผลักดันและ / หรือยอมรับว่าคุณสามารถรวมหรือตั้งฐานใหม่ได้origin/Bgit status
เนื่องจากการgit statusรัน:
git rev-list --count @{u}..HEAD: คุณมีข้อผูกมัดกี่ข้อกับBสิ่งที่ไม่ได้ทำ?origin/B
git rev-list --count HEAD..@{u}: คุณมีข้อผูกมัดกี่ข้อกับสิ่งที่ไม่ได้ทำ?origin/BB
การตั้งค่าต้นน้ำทำให้คุณได้รับสิ่งเหล่านี้ทั้งหมด
วิธีมา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" เท่านั้น