ทำให้สาขา Git ที่มีอยู่ติดตามสาขาระยะไกลหรือไม่


3535

ฉันรู้วิธีสร้างสาขาใหม่ที่ติดตามสาขาระยะไกล แต่ฉันจะสร้างสาขาที่มีอยู่เพื่อติดตามสาขาระยะไกลได้อย่างไร

ฉันรู้ว่าฉันสามารถแก้ไข.git/configไฟล์ได้ แต่ดูเหมือนจะมีวิธีที่ง่ายกว่า


26
git push -u origin branch-nameตามที่ระบุไว้ด้านล่างสำหรับสาขาที่มีอยู่ที่คุณสามารถใช้
Zags

3
หากสาขาในท้องถิ่นเป็นสาขาปัจจุบันและสาขาในท้องถิ่นยังไม่ได้ติดตามระยะไกลgit pullมักจะให้ข้อความที่เป็นประโยชน์เกี่ยวกับคำสั่งที่เหมาะสมในการตั้งค่าข้อมูลการติดตาม
ผู้รับบิล

57
มันน่ารำคาญเมื่อมีคนเรียนรู้คอมไพล์ที่จะแสดงลิงค์ไปยังเอกสารของคอมไพล์ เอกสารนั้นดูเหมือนว่าจะถูกเขียนขึ้นสำหรับคนที่รู้อยู่แล้วว่าพวกเขากำลังทำอะไรกับคอมไพล์
เฟลิเป้อัลวาเรซ

9
ในฐานะของ Git 2.10 คุณควรเช็คเอาท์ก่อนที่สาขาท้องถิ่นที่ต้องการและจากนั้นทำเช่นนี้git branch --set-upstream-to origin/<branch>
Mahdi Javaheri

2
--set-upstreamสร้างข้อผิดพลาด: fatal: the '--set-upstream' option is no longer supported. Please use '--track' or '--set-upstream-to' instead.ดังนั้นgit branch --set-upstream-to origin/<branch name>เป็นคำสั่งปัจจุบันที่ใช้งานได้
Super Jade

คำตอบ:


4270

ให้สาขาfooและรีโมทupstream:

จาก Git 1.8.0:

git branch -u upstream/foo

หรือถ้าสาขาท้องถิ่นfooไม่ใช่สาขาปัจจุบัน:

git branch -u upstream/foo foo

หรือหากคุณต้องการพิมพ์คำสั่งที่ยาวกว่าสิ่งเหล่านี้จะเทียบเท่ากับสองคำสั่งด้านบน:

git branch --set-upstream-to=upstream/foo

git branch --set-upstream-to=upstream/foo foo

จาก Git 1.7.0:

git branch --set-upstream foo upstream/foo

หมายเหตุ:

  • ทุกคำสั่งดังกล่าวจะทำให้เกิดสาขาในประเทศfooเพื่อติดตามสาขาที่ห่างไกลจากระยะไกล fooupstream
  • ไวยากรณ์เก่า (1.7.x) เลิกใช้แล้วในความโปรดปรานของไวยากรณ์ใหม่ (1.8+) ไวยากรณ์ใหม่มีจุดประสงค์เพื่อให้เข้าใจง่ายและจดจำได้ง่ายขึ้น
  • การกำหนดสาขาอัพสตรีมจะล้มเหลวเมื่อทำงานกับรีโมตที่สร้างขึ้นใหม่ซึ่งยังไม่ถูกดึงข้อมูล ในกรณีดังกล่าวให้เรียกใช้git fetch upstreamล่วงหน้า

ดูเพิ่มเติม: ทำไมฉันต้องทำ `- เซ็ตอัพสตรีม 'ตลอดเวลา


124
"upstream" เป็นชื่อของรีโมทหรือไม่ เช่นค่าเริ่มต้นที่เรียกว่า "จุดเริ่มต้น" คืออะไร
Andrew Vit

172
@Andrew: ใช่ git branch --set-upstream master origin/masterจะเท่ากับสิ่งที่ทำโดยอัตโนมัติเมื่อคุณโคลนที่เก็บครั้งแรก
Dan Molding

62
ในบันทึกที่เกี่ยวข้องเพิ่มนี้เพื่อ gitconfig ของคุณเป็นที่น่ากลัว: "[ผลักดัน] default = ติดตาม" นี้จะทำให้มันเพื่อให้ผลักดันจะไปสถานที่เดียวกันที่ดึงมาจาก :)
jpswain

61
ฉันได้รับ "ถึงแก่ชีวิต: ไม่ใช่ชื่อวัตถุที่ถูกต้อง: 'ต้นกำเนิด / ปรมาจารย์'"
joachim

84
git push -u origin foo ผ่าน
ฝ้าย

236

คุณสามารถทำสิ่งต่อไปนี้ (สมมติว่าคุณได้เช็คเอาต์ที่มาสเตอร์และต้องการที่จะผลักดันไปที่มาสเตอร์สาขาระยะไกล):

ตั้งค่า 'รีโมท' หากคุณยังไม่มี

git remote add origin ssh://...

ตอนนี้กำหนดค่าต้นแบบที่ต้องรู้เพื่อติดตาม:

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

และผลักดัน:

git push origin master

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

5
ใช่ - แต่จากหน่วยความจำคุณอาจต้องชัดเจนสำหรับการกดครั้งแรก สามารถทดสอบได้อย่างง่ายดายแน่นอน ... :)
พอล Hedderly

+1 นี่คือคำตอบสำหรับผู้ใช้ Windows ที่ติดอยู่กับ "หน้าตัวอย่าง" ของ msysgit ที่อยู่ก่อน 1.8 ขอบคุณสำหรับสิ่งนั้น
จอห์น

3
นี่เป็นคำตอบเดียวที่เหมาะกับฉัน เมื่อฉันลองคำตอบที่ได้รับการยอมรับเพื่อตั้งค่ารีโมตอัพสตรีมสำหรับสาขาที่มีอยู่ฉันได้รับ: error: the requested upstream branch 'upstream/master' does not exist.
Steve K

4
@SteveK ที่มีแนวโน้มมากที่สุดเพราะต้นน้ำของคุณเรียกว่าและไม่ได้origin upstream
umläute

160

ฉันทำสิ่งนี้เป็นผลข้างเคียงของการกดด้วย-uตัวเลือกเช่นเดียวกับใน

$ git push -u origin branch-name

--set-upstreamตัวเลือกที่ยาวเทียบเท่า

git-branchคำสั่งยังเข้าใจ--set-upstreamแต่การใช้ของมันสามารถทำให้เกิดความสับสน เวอร์ชัน 1.8.0แก้ไขอินเตอร์เฟส

git branch --set-upstreamเลิกใช้แล้วและอาจถูกลบออกในอนาคตอันใกล้ git branch [-u|--set-upstream-to]ได้รับการแนะนำให้รู้จักกับคำสั่งของ saner

...

มันเป็นเรื่องดึงดูดที่จะพูดgit branch --set-upstream origin/masterแต่นั่นบอกให้ Git จัดสาขา "ที่มา / หลัก" ในท้องถิ่นเพื่อรวมกับสาขาที่เช็คเอาท์ในปัจจุบันซึ่งไม่น่าเป็นไปได้อย่างที่ผู้ใช้หมายถึง ตัวเลือกเลิกใช้แล้ว; ใช้ตัวเลือกใหม่--set-upstream-to(พร้อมตัวเลือกแบบย่อและหวาน-u) แทน

สมมติว่าคุณมีfooสาขาในท้องที่และต้องการให้สาขาปฏิบัติด้วยชื่อเดียวกันกับที่อยู่ต้นน้ำ ทำให้สิ่งนี้เกิดขึ้นได้ด้วย

$ git branch foo
$ git branch --set-upstream-to=origin/foo

หรือเพียงแค่

$ git branch --set-upstream-to=origin/foo foo

1
นี่เป็นวิธีแก้ปัญหาที่ดีกว่ามาก
Nils_e

--set-upstream-to=...เป็นเพียงสิ่งที่ฉันกำลังมองหา
Richard

54

คุณอาจพบว่าgit_remote_branchเครื่องมือมีประโยชน์ มันมีคำสั่งง่ายๆสำหรับการสร้างการเผยแพร่การลบการติดตามและการเปลี่ยนชื่อสาขาระยะไกล คุณสมบัติที่ดีอย่างหนึ่งคือคุณสามารถขอให้grbคำสั่งอธิบายคำสั่ง git ที่จะใช้งานได้

grb explain create my_branch github
# git_remote_branch version 0.3.0

# List of operations to do to create a new remote branch and track it locally:
git push github master:refs/heads/my_branch
git fetch github
git branch --track my_branch github/my_branch
git checkout my_branch

3
grb เป็นอัญมณีทับทิมที่สามารถเข้าถึงได้ตามที่อธิบายไว้ในGitHub
mcabrams

6
OP กำลังถามคำถามเกี่ยวกับ Git ดังนั้นอย่าแนะนำเครื่องมือใหม่อาจจะดีกว่า
zeekvfu

grb เป็นนามแฝงสำหรับ git-rebase ในการติดตั้ง macOS ของฉัน ฉันไม่ได้ทำสิ่งนี้ :)
เบ็นซินแคล

53

จริงๆแล้วสำหรับคำตอบที่ได้รับการยอมรับในการทำงาน:

git remote add upstream <remote-url>
git fetch upstream
git branch -f --track qa upstream/qa
# OR:
git branch --set-upstream qa upstream/qa

สาขาในพื้นที่ได้ติดตามสาขาอยู่แล้วดังนั้นเราจึงสามารถสมมติว่า repo ระยะไกลได้ถูกเพิ่มไปแล้ว
Doppelganger

Dopplerganger: ดูความคิดเห็นของโจอาคิมต่อคำตอบที่ยอมรับ อย่างไรก็ตามสมมติฐานต่างกันอย่างง่ายดาย - สิ่งที่ทำให้สิ่งต่าง ๆ น่าสนใจมาก)
เม่น

44

ฉันเชื่อว่าเร็วเท่าที่ Git 1.5.x คุณสามารถสร้างสาขาท้องถิ่น$BRANCHติดตามสาขาระยะไกลorigin/$BRANCHเช่นนี้

ระบุว่า$BRANCHและorigin/$BRANCHที่มีอยู่และคุณไม่ได้ในขณะนี้การตรวจสอบออก$BRANCH(สวิทช์ไปถ้าคุณมี) ทำ:

git branch -f --track $BRANCH origin/$BRANCH

สิ่งนี้จะสร้าง$BRANCHเป็นสาขาการติดตาม -fกองกำลังสร้างแม้จะ$BRANCHมีอยู่แล้ว --trackเป็นทางเลือกถ้าค่าดีฟอลต์ปกติอยู่ในตำแหน่ง (นั่นคือพารามิเตอร์ git-config branch.autosetupmergeเป็นจริง)

หมายเหตุหากorigin/$BRANCHยังไม่มีคุณสามารถสร้างได้โดยการกดโลคัลของคุณ$BRANCHลงในที่เก็บรีโมตด้วย:

git push origin $BRANCH

ตามด้วยคำสั่งก่อนหน้าเพื่อโปรโมตสาขาโลคัลเป็นสาขาการติดตาม


1
git push origin $BRANCHเป็นสิ่งที่ฉันกำลังมองหา
ผู้ใช้

หลังจากลองใช้โซลูชันทุกประเภทรวมถึงการตั้งค่าอัปสตรีมตามที่อธิบายไว้ข้างต้นไม่มีอะไรทำงาน สิ่งที่ฉันต้องการทำคือดึงการมอบหมายใหม่ 1 รายการไปยังสาขาในพื้นที่ของฉันจากรีโมทและฉันไม่ได้ติดตั้งการติดตามเริ่มแรก คำสั่งgit branch -f --track $BRANCH origin/$BRANCHจะหลอกลวง
DemitryT

38

1- อัปเดต meta-data ในเครื่องของคุณโดยใช้: git fetch --all

ป้อนคำอธิบายรูปภาพที่นี่

2- แสดงสาขาระยะไกลและท้องถิ่นของคุณโดยใช้: git branch -a , ดูภาพหน้าจอต่อไปนี้

ป้อนคำอธิบายรูปภาพที่นี่

3- เปลี่ยนเป็นสาขาเป้าหมายที่คุณต้องการเชื่อมโยงกับรีโมท: การใช้

git checkout branchName

ตัวอย่าง:

ป้อนคำอธิบายรูปภาพที่นี่

4- เชื่อมโยงสาขาท้องถิ่นของคุณไปยังสาขาระยะไกลโดยใช้:

สาขา git - ตั้งค่าอัปสตรีมไปยัง nameOfRemoteBranch

NB: nameOfRemoteBranch : เพื่อคัดลอกจากผลลัพธ์ของขั้นตอนที่ 2 "git branch -r"

ตัวอย่างการใช้งาน:

ป้อนคำอธิบายรูปภาพที่นี่


1
ส่วนใหญ่คำตอบที่ง่ายและง่าย
vibs2006

25

ตรวจสอบให้แน่ใจว่าคุณทำงาน:

git config push.default tracking

เพื่อให้สามารถผลักดันปัญหาได้ฟรี


1
นี่อาจจะสะดวก เราสามารถทราบได้อย่างไรว่าตามgit-config(1)หน้าคู่มือ, เป็นคำพ้องเลิกของtracking upstream
FooF

23

การแก้ไข.git/configอาจเป็นวิธีที่ง่ายที่สุดและเร็วที่สุด นั่นคือสิ่งที่คำสั่ง Git สำหรับจัดการสาขาระยะไกลกำลังดำเนินการอยู่แล้ว

หากคุณไม่ต้องการโคลนกับไฟล์ด้วยมือ (และไม่ใช่เรื่องยากที่จะทำ) คุณสามารถใช้git configเพื่อทำมันได้เสมอ... แต่อีกครั้งนั่นเป็นเพียงการแก้ไข.git/configไฟล์เท่านั้น

แน่นอนว่ามีวิธีการติดตามสาขาระยะไกลโดยอัตโนมัติเมื่อใช้git checkout(โดยผ่านการ--trackตั้งค่าสถานะเป็นต้น) แต่คำสั่งเหล่านี้จะทำงานกับสาขาใหม่ไม่ใช่สาขาที่มีอยู่


18

ในระยะสั้นมาก

git branch --set-upstream yourLocalBranchName origin/develop

ซึ่งจะทำให้คุณติดตามสาขาที่ห่างไกลที่เรียกว่าyourLocalBranchNamedevelop


1
@Quincy ตรวจสอบคำตอบของ greg - ใช้git push -u origin branch(หรือ--set-upstream-to) แทน
Tobias Kienzler

@ MadNik ความแตกต่างระหว่าง--set-upstreamและ--trackคืออะไร? ฉันไม่ค่อยเข้าใจว่าทำไมฉันจึงควรใช้อันอื่น
คิวเมนตัส

15

สำหรับ 1.6.x สามารถทำได้โดยใช้เครื่องมือgit_remote_branch :

grb track foo upstream

ที่จะทำให้เกิด Git เพื่อให้การติดตามfooupstream/foo


12

ฉันใช้คำสั่งต่อไปนี้ (สมมติว่าชื่อสาขาในพื้นที่ของคุณคือ "branch-name-local" และชื่อสาขาระยะไกลคือ "branch-name-remote"):

$ git branch --set-upstream-to=origin/branch-name-remote branch-name-local

หากสาขาทั้งในและนอกเมืองมีชื่อเดียวกันให้ทำดังนี้

$ git branch --set-upstream-to=origin/branch-name branch-name

คุณย้อนกลับ "branch-name" และ "origin / branch-name" บนบรรทัดคำสั่ง ต้นน้ำมาก่อนท้องถิ่น
maharvey67

@ maharvey67 คุณถูกต้องขอบคุณ แก้ไขคำตอบ
yrazlik

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

8

ที่นี่ใช้githubและgit version 2.1.4ทำ:

$ git clone git@github.com:user/repo.git

และรีโมทมาโดย itelsef แม้ว่าจะไม่ได้เชื่อมโยงในเครื่อง:

$ git remote show origin

* remote origin
  Fetch URL: git@github.com:user/repo.git
  Push  URL: git@github.com:user/repo.git
  HEAD branch: master
  Remote branches:
    develop tracked         <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    master  tracked
  Local branch configured for 'git pull':
    master merges with remote master
  Local ref configured for 'git push':
    master pushes to master (up to date)

แต่แน่นอนว่ายังไม่มีสาขาในพื้นที่:

$ git branch
* master                  <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

ดู? ตอนนี้ถ้าคุณเพียงแค่เช็คเอาต์ develp มันจะทำเวทย์มนตร์โดยอัตโนมัติ:

$ git checkout develop
Branch develop set up to track remote branch develop from origin.
Switched to a new branch 'develop'

ง่ายมาก!


สรุป. เพียงแค่เรียกใช้ 2 คำสั่งนี้:

$ git clone git@github.com:user/repo.git
$ git checkout develop

1
ตัวอย่างที่ดีของกรณีการใช้งานที่เหมือนกันของฉัน แม้จะไม่มีวี่แววของสาขา 'พัฒนา' ในท้องที่ แต่เมื่อฉันตรวจสอบสาขา 'พัฒนา' สาขานั้นจะปรากฏขึ้นและได้รับการตั้งค่าอย่างน่าอัศจรรย์เพื่อติดตามสาขา 'การพัฒนา' ที่ห่างไกลจากแหล่งกำเนิด ฉันขอขอบคุณตัวอย่างทีละขั้นตอนและคำอธิบาย!
ElliotPsyIT

8

ใช้ตัวเลือก '- ติดตาม'

  • หลังจากgit pull:

    git checkout --track <remote-branch-name>

  • หรือ:

    git fetch && git checkout <branch-name>


7

สำหรับการสร้างสาขาใหม่เราสามารถใช้คำสั่งดังต่อไปนี้

 git checkout - เพลง -b ตัวอย่าง / ตัวอย่างแหล่งกำเนิด 
สำหรับสาขาที่สร้างไว้แล้วเพื่อสร้างลิงก์ระหว่างรีโมตจากนั้นใช้สาขาด้านล่างคำสั่ง

 git branch -u origin / remote-branch-name


5

นี่ไม่ใช่คำตอบที่ตรงกับคำถามนี้ แต่ฉันต้องการฝากข้อความไว้ที่นี่สำหรับทุกคนที่อาจมีปัญหาเช่นเดียวกับฉันเมื่อพยายามกำหนดค่าสาขาต้นน้ำ

ระวังpush.default

ด้วยเวอร์ชัน git ที่เก่ากว่าค่าเริ่มต้นคือการจับคู่ซึ่งจะทำให้เกิดพฤติกรรมที่ไม่พึงประสงค์หากคุณมีตัวอย่างเช่น:

การติดตาม "ต้นแบบ" ของสาขาท้องถิ่นไปยังจุดเริ่มต้น / หลัก

การติดตาม "อัปสตรีม" จากระยะไกลไปยังอัพสตรีม / มาสเตอร์

หากคุณพยายามที่จะ "git push" เมื่ออยู่ในสาขา "upstream" ด้วยการจับคู่ push.default git จะพยายามรวม "master" ของสาขาท้องถิ่นเข้ากับ "upstream / master" โดยอัตโนมัติทำให้เกิดความวุ่นวายมากมาย

สิ่งนี้ทำให้พฤติกรรมมีสติมากขึ้น:

git config - global push.default upstream


คุณไม่ได้ทิ้งสิ่งนี้ไว้อย่างไร้ประโยชน์ ขอบคุณ
stefgosselin

4

ในทางที่ค่อนข้างเกี่ยวข้องฉันพยายามเพิ่มสาขาการติดตามระยะไกลไปยังสาขาที่มีอยู่ แต่ไม่สามารถเข้าถึงที่เก็บระยะไกลนั้นบนระบบที่ฉันต้องการเพิ่มสาขาการติดตามระยะไกลใน (เพราะฉันส่งสำเนาสำเนานี้บ่อยครั้ง repo ผ่าน sneakernet ไปยังระบบอื่นที่มีการเข้าถึงเพื่อพุชไปยังรีโมตนั้น) ผมพบว่ามีวิธีที่จะบังคับให้เพิ่มสาขาที่ห่างไกลในท้องถิ่นที่ไม่ได้รับความจริงยังไม่มี (ท้องถิ่นจึงไม่ทราบว่าสาขาที่มีอยู่ในระยะไกลและฉันจะได้รับข้อผิดพลาด: the requested upstream branch 'origin/remotebranchname' does not exist)

ในที่สุดฉันก็จัดการที่จะเพิ่มสาขาใหม่ที่ไม่รู้จักมาก่อน (โดยไม่ต้องดึงข้อมูล) โดยการเพิ่มไฟล์ head ใหม่ที่.git/refs/remotes/origin/remotebranchnameและจากนั้นก็ทำการคัดลอกอ้างอิง repo ไปยังเวิร์กสเตชัน (ด้วย repo ในพื้นที่ที่ฉันเพิ่มสาขาระยะไกลไว้)

เมื่อเสร็จแล้วฉันก็สามารถใช้ git branch --set-upstream-to=origin/remotebranchname


3

หรือเพียงแค่โดย:

เปลี่ยนเป็นสาขาหากคุณไม่ได้อยู่ในนั้น:

[za]$ git checkout branch_name

วิ่ง

[za]$ git branch --set-upstream origin branch_name
Branch origin set up to track local branch brnach_name by rebasing.

และคุณพร้อมที่จะ:

 [za]$ git push origin branch_name

คุณสามารถดูไฟล์ปรับแต่งเพื่อดูว่ากำลังติดตามอะไรโดยการเรียกใช้:

 [za]$ git config -e

นอกจากนี้ยังเป็นการดีที่ได้รู้สิ่งนี้แสดงให้เห็นว่ามีสาขาใดบ้างที่ถูกติดตามและสาขาไหนไม่ :

  [za]$ git remote show origin 

0

สำหรับทุกคนที่ชอบฉันเพียงต้องการซิงค์ชื่อสาขาในพื้นที่ของคุณด้วยชื่อสาขาระยะไกลนี่คือคำสั่งที่มีประโยชน์:

git branch -u origin/$(git rev-parse --abbrev-ref HEAD)

0

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

โปรดระบุสาขาที่คุณต้องการผสาน ดูคอมไพล์ดึง (1)
สำหรับรายละเอียด
.....

คุณสามารถใช้สคริปต์ต่อไปนี้ซึ่งตั้งค่าต้นกำเนิดเป็นอัปสตรีมสำหรับสาขาปัจจุบันที่คุณอยู่

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

#!/bin/bash
# scriptname: git-branch-set-originupstream
current_branch="$(git branch | grep -oP '(?<=^\* )(.*)$')"
upstream="origin/$current_branch"
git branch -u "$upstream"

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.