“ u” ทำอะไรกันแน่ “ git push -u origin master” และ“ git push master กำเนิด”


334

เห็นได้ชัดว่าฉันใช้งานคอมไพล์แย่มากแม้ว่าฉันจะพยายามทำความเข้าใจ

จากkernel.orgสำหรับgit push:

-ยู

ต้งค่า-ต้นน้ำ

สำหรับทุกสาขาที่เป็นข้อมูลล่าสุดหรือถูกผลักสำเร็จให้เพิ่มการอ้างอิง upstream (การติดตาม) ที่ใช้โดยคำสั่ง git-pull (1) และอาร์กิวเมนต์อื่นที่ไม่ใช้อาร์กิวเมนต์ สำหรับข้อมูลเพิ่มเติมดูbranch.<name>.mergeใน git-config (1)

ที่นี่branch.<name>.mergeจากgit config:

branch.<name>.merge

กำหนดพร้อมกับbranch.<name>.remoteสาขาต้นน้ำสำหรับสาขาที่กำหนด มันบอก git fetch / git pull ซึ่งจะรวมสาขาและยังสามารถส่งผลกระทบต่อ git push (ดู push.default) เมื่ออยู่ในสาขา<name>จะบอก git เรียก refspec เริ่มต้นที่จะทำเครื่องหมายสำหรับการรวมใน FETCH_HEAD ค่าจะถูกจัดการเช่นส่วนที่ห่างไกลของ refspec "branch.<name>.remote"และต้องตรงกับโทษซึ่งเป็นความจริงที่ได้รับจากระยะไกลด้วย ข้อมูลการผสานถูกใช้โดย git pull (ซึ่งในตอนแรกเรียก git fetch) เพื่อค้นหาสาขาเริ่มต้นสำหรับการรวม หากไม่มีตัวเลือกนี้ให้ดึงค่าเริ่มต้น git เพื่อรวม refspec ที่ดึงมาครั้งแรก ระบุหลายค่าเพื่อรับ octopus merge หากคุณต้องการตั้งค่าดึง git เพื่อให้มันรวมเข้า<name>กับจากสาขาอื่นในพื้นที่เก็บข้อมูลท้องถิ่นคุณสามารถชี้branch.<name>.mergeไปยังสาขาที่ต้องการและใช้การตั้งค่าพิเศษ (ระยะเวลา) branch.<name>.remoteสำหรับ

ฉันประสบความสำเร็จในการตั้งค่าพื้นที่เก็บข้อมูลระยะไกลด้วย github และฉันประสบความสำเร็จในการผลักดันครั้งแรกของฉันไปที่:

git push -u origin master

จากนั้นฉันผลักดันข้อตกลงที่สองไปยังที่เก็บรีโมตของฉันโดยไม่เจตนาสำเร็จโดยใช้:

git commit -m '[...]'

อย่างไรก็ตามคิดไม่ถูกต้องว่าฉันจะต้องผลักดันอีกครั้งoriginจากmasterฉันวิ่ง:

# note: no -u
git push origin master

มันทำอะไร ดูเหมือนจะไม่มีผลใด ๆ เลย ฉัน "เลิกทำ" git push -u origin masterหรือไม่?


44
I'm apparently terrible at using git, despite my best attempts to understand it.- ฉันไม่เคยมีใครสร้างฉันได้ดีนัก
dgo

คำตอบ:


335

กุญแจสำคัญคือ "ไม่ต้องโต้แย้ง git-pull" เมื่อคุณทำgit pullจากสาขาโดยไม่ต้องระบุรีโมตต้นทางหรือสาขา git จะดูการbranch.<name>.mergeตั้งค่าเพื่อทราบว่าจะดึงจากที่ใด git push -uตั้งค่าข้อมูลนี้สำหรับสาขาที่คุณกำลังผลักดัน

เพื่อดูความแตกต่างลองใช้สาขาใหม่ที่ว่างเปล่า:

$ git checkout -b test

ก่อนอื่นเราดันโดย-u:

$ git push origin test
$ git pull
You asked me to pull without telling me which branch you
want to merge with, and 'branch.test.merge' in
your configuration file does not tell me, either. Please
specify which branch you want to use on the command line and
try again (e.g. 'git pull <repository> <refspec>').
See git-pull(1) for details.

If you often merge with the same branch, you may want to
use something like the following in your configuration file:

    [branch "test"]
    remote = <nickname>
    merge = <remote-ref>

    [remote "<nickname>"]
    url = <url>
    fetch = <refspec>

See git-config(1) for details.

ตอนนี้ถ้าเราเพิ่ม-u:

$ git push -u origin test
Branch test set up to track remote branch test from origin.
Everything up-to-date
$ git pull
Already up-to-date.

โปรดทราบว่ามีการตั้งค่าข้อมูลการติดตามเพื่อให้git pullทำงานได้ตามที่คาดไว้โดยไม่ต้องระบุรีโมตหรือสาขา

อัปเดต:เคล็ดลับโบนัส:

  • มาร์คกล่าวถึงในความคิดเห็นที่นอกเหนือไปจากการตั้งค่านี้ยังมีผลต่อการทำงานเริ่มต้นของgit pull git pushถ้าคุณได้รับในนิสัยของการใช้-uในการจับภาพสาขาที่ห่างไกลคุณตั้งใจจะติดตามผมขอแนะนำการตั้งค่าของคุณคุ้มค่าคอนฟิกการpush.defaultupstream
  • git push -u <remote> HEADจะผลักสาขาปัจจุบันไปยังสาขาที่มีชื่อเดียวกันกับ<remote>(และตั้งค่าการติดตามเพื่อให้คุณสามารถทำgit pushหลังจากนั้น)

4
git push <remote> <branch>ทำให้สิ่งที่ชัดเจน git push -uถ้าคุณปล่อยให้ออกจากระยะไกลหรือสาขาคอมไพล์ตกย้อนกลับไปในการตั้งค่าคอนฟิกสาขาซึ่งมีการตั้งค่าสำหรับคุณด้วย
dahlbyk

2
@dahlbyk ฉันไปแล้วและทำเครื่องหมายว่าคุณเป็นคำตอบ แต่ความคิดเห็นนั้นทำให้ฉันสับสน ในคำตอบของคุณคุณแสดงให้เห็นว่าคอมไพล์ได้รับการสับสนหลังgit push origin test(ซึ่งไม่ได้-u) จากนั้นคุณแสดงให้เห็นว่าgit push -u origin test ขจัดความคลุมเครือ มีการพิมพ์ผิดหรือฉันแค่หนาแน่นอีกครั้ง?
ClosedCowboy

1
ฉันคิดว่าเรากำลังพูดถึงกัน :) เมื่อฉันพูดว่าgit push <remote> <branch>ไม่คลุมเครือฉันหมายถึงความสัมพันธ์git pushที่ขึ้นอยู่กับการกำหนดค่าสาขา ในทำนองเดียวกันgit pull <remote> <branch>มีความชัดเจนและgit pullอาศัยการกำหนดค่าสาขา เมื่อคุณผลักดันให้-uทั้งคู่git pushและgit pullจะทำงานตามที่คาดไว้
dahlbyk

10
@dahlbyk: คำตอบของคุณใช้ได้ แต่ในความคิดเห็นของคุณด้านบนคุณทำซ้ำความเข้าใจผิดทั่วไปเกี่ยวกับgit push- เว้นแต่คุณจะตั้งค่าpush.defaultตัวเองgit pushเพียงใช้การกำหนดค่าสาขาต้นน้ำเพื่อตัดสินใจว่าจะผลักดันรีโมตใด
Mark Longair

1
แนวทางปฏิบัติที่ดีที่สุดสำหรับคอมไพล์คือgit push origin masterและเหมือนกับ IE ในด้านอื่น ๆ git pull origin master.. ดังนั้นหากสมมติว่าการเปลี่ยนแปลงสาขาคุณสามารถทำได้ git push origin branch_nameเช่นเดียวกันกับ IE ด้านอื่น ๆ git pull origin branch_name
Arpit Vaishnav

87
git push -u origin master

... เหมือนกับ:

git push origin master ; git branch --set-upstream master origin/master

ทำคำสั่งสุดท้ายถ้าคุณลืม-u!

หรือคุณสามารถบังคับมันได้:

git config branch.master.remote origin
git config branch.master.merge refs/heads/master

ถ้าคุณให้คำสั่งทำเพื่อคุณก็จะรับความผิดพลาดของคุณเช่นถ้าคุณพิมพ์สาขาที่ไม่มีอยู่จริงหรือคุณไม่ได้git remote add; แม้ว่านั่นอาจเป็นสิ่งที่คุณต้องการ :)


1
BTW masterเป็นเพียงตัวอย่าง :)
sabgenton

ตกลงบิตที่สองจะถูกคิดค่าเสื่อมราคาในรุ่นที่ใหม่กว่าสำหรับ: git branch master -u origin/masterdetails @ stackoverflow.com/a/2286030/790359
sabgenton

2
หากคุณลืมที่จะใช้-uตัวเลือกพิมพ์git push -uทันทีจะตกลง
zeekvfu

1
git รุ่นใหม่แสดงว่า--setup-upstreamเลิกใช้แล้ว: The --set-upstream flag is deprecated and will be removed. Consider using --track or --set-upstream-to
Bill Hoag

- การตั้งค่าอัปgit branch --set-upstream-to=origin/master master
อัลเบอร์โตเปเรซ

43

ในแง่ง่ายมากขึ้น:

ในทางเทคนิคแล้ว-uค่าสถานะจะเพิ่มการอ้างอิงการติดตามไปยังเซิร์ฟเวอร์อัปสตรีมที่คุณกำลังกด

สิ่งสำคัญคือที่นี่ช่วยให้คุณทำgit pullโดยไม่ต้องโต้แย้งใด ๆ เพิ่มเติม ตัวอย่างเช่นเมื่อคุณทำgit push -u origin masterคุณสามารถต่อมาเรียกและคอมไพล์จะรู้ว่าคุณหมายจริงgit pullgit pull origin master

มิฉะนั้นคุณจะต้องพิมพ์คำสั่งทั้งหมด


1
ดังนั้นถ้าฉันตั้งค่า-uสถานะการorgin masterดึงทุกครั้งถัดไปจะอ้างถึงมัน และถ้าฉันต้องการเปลี่ยนgit pullพฤติกรรมที่ฉันควรเรียกใช้git push -u origin some_other_branchและgit pullตอนนี้จะอ้างอิงถึงsome_other_branch? ขอบคุณ!
Toma Tomov

1
เราสามารถใช้ "git push" แทนการใช้ "git push master origin" ได้หรือไม่?
cegprakash

ใช่คุณสามารถ @cegprakash อย่างไรก็ตามในตอนแรกคุณจะทำ agit push -u origin master
AdépòjùOlúwáségun

-11

คำสั่ง git bash ที่จำเป็นทั้งหมดเพื่อผลักดันและดึงเข้าไปใน Github:

git status 
git pull
git add filefullpath

git commit -m "comments for checkin file" 
git push origin branch/master
git remote -v 
git log -2 

หากคุณต้องการแก้ไขไฟล์แล้ว:

edit filename.* 

หากต้องการดูทุกสาขาและความมุ่งมั่น:

git show-branch

4
ฉันคิดว่าคุณตอบจากขอบเขตของคำถาม
AdépòjùOlúwáségun
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.