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


4303

ฉันต้องการที่จะสามารถทำต่อไปนี้:

  1. สร้างสาขาท้องถิ่นตามสาขาอื่น (ระยะไกลหรือท้องถิ่น) (ผ่านgit branchหรือgit checkout -b)

  2. พุชสาขาโลคัลไปที่ที่เก็บรีโมต (เผยแพร่) แต่ทำให้สามารถติดตามได้git pullและgit pushจะทำงานได้ทันที

ฉันจะทำอย่างไร

ฉันรู้เกี่ยวกับ--set-upstreamGit 1.7 แต่นั่นเป็นการกระทำหลังการสร้าง ฉันต้องการหาวิธีที่จะทำการเปลี่ยนแปลงที่คล้ายกันเมื่อผลักสาขาไปยังพื้นที่เก็บข้อมูลระยะไกล



71
เพียงแค่ชี้ให้เห็น --set-upstream คือ -u
Baiyan Huang

@BaiyanHuang ขอบคุณสำหรับการชี้ว่า เริ่มแรกฉันคิดว่า -u หมายถึงไม่ได้ติดตามซึ่งไม่สมเหตุสมผลสำหรับฉัน
Dmitry

คำตอบ:


6610

ใน Git 1.7.0 และใหม่กว่าคุณสามารถชำระเงินสาขาใหม่:

git checkout -b <branch>

แก้ไขไฟล์เพิ่มและกระทำ จากนั้นกด-u--set-upstreamตัวเลือก(สั้น ๆ) :

git push -u origin <branch>

Git จะตั้งค่าข้อมูลการติดตามในระหว่างการพุช


81
นอกจากนี้ยังเป็นที่น่าสังเกตว่าถ้าคุณมีสาขาการติดตามที่มีอยู่แล้วในสาขาที่คุณกำลังผลักดันและpush.defaultถูกตั้งค่าเป็นupstreamสิ่งนี้จะไม่ทำในสิ่งที่คุณคิดว่ามันจะทำ มันจะพยายามผลักดันสาขาการติดตามที่มีอยู่ ใช้: git push -u origin mynewfeature:mynewfeatureหรือทำgit branch --unset-upstreamก่อน
void.pointer

13
สำหรับผู้ที่ใช้ Git จาก Visual Studio: จริง ๆ แล้วนี่คือ "Publish Branch" ใน Visual Studio ทำ หลังจากรัน git push ด้วยพารามิเตอร์ -u ฉันสามารถเห็นสาขาของฉันตามที่เผยแพร่ใน VS UI
Puterdo Borato

3
git push -u origin <branch> เหมือนกับ git push -u origin HEAD (สมมติว่าคุณมีสาขาที่คุณต้องการจะเช็คเอาท์หรือไม่?)
gymbrall

13
เราต้องการ-uตัวเลือกทุกครั้งที่เราผลักสาขาไปยังระยะไกลหรือต้องการเพียงครั้งแรกเท่านั้น?
Stephane

17
@Stephane คุณต้องการเพียง-uหนึ่งครั้งเพื่อเริ่มการติดตาม หลังจากนั้นเพียงใช้git push
ทอดด์

491

หากคุณไม่แชร์ repo ของคุณกับผู้อื่นสิ่งนี้จะเป็นประโยชน์ในการผลักสาขาทั้งหมดของคุณไปยังรีโมทและ--set-upstreamติดตามอย่างถูกต้องสำหรับคุณ:

git push --all -u

(ไม่ตรงกับที่ OP ขอมา แต่สายการบินนี้ได้รับความนิยมมาก)

หากคุณแบ่งปัน repo ของคุณกับคนอื่น ๆ นี่ไม่ใช่รูปแบบที่ดีจริงๆเพราะคุณจะขัดขวาง Repo ที่มีสาขาทดลองหลบทั้งหมดของคุณ


14
และgit pull --allดึงมันทั้งหมดกลับไปที่อื่น? kewl
commonpike

1
คำสั่งนี้ตั้งค่าการติดตามไปยังสาขาที่ถูกต้องโดยไม่จำเป็นต้องกดอะไร ขอบคุณ.
amey91

45
Git อนุญาตให้กระทำการสาขาและไม่ผลักมันด้วยเหตุผลที่ดีมาก เฉพาะการใช้ git push - ทั้งหมดก็เหมือนการทิ้งส่วนหนึ่งของสถาปัตยกรรม git ถ้ามันเหมาะกับคุณมันก็โอเคเยี่ยมเลยทำมันตลอดไป แต่โปรดอย่าแนะนำให้ผู้อื่นหลีกเลี่ยงการเรียนรู้คอมไพล์เพียงเพราะมันเป็นวิธีที่รวดเร็วในการทำสิ่งต่าง ๆ
Federico Razzoli

4
นี่ไม่ใช่คำตอบที่ถูกต้องและไม่ใช่เครื่องมือที่ดีที่จะแนะนำหากไม่มีคำอธิบายที่แท้จริงเกี่ยวกับสิ่งที่มันทำและสิ่งที่เกี่ยวข้อง โปรดลองพิจารณาคำตอบนี้
akronymn

3
@akronymn @Federico ไหนสามารถพบกับอันตรายของการทำgit push --all -u?
user1823664

155

ก่อนที่จะมีการเปิดตัวgit push -uไม่มีgit pushทางเลือกที่จะได้รับสิ่งที่คุณปรารถนา คุณต้องเพิ่มคำสั่งกำหนดค่าใหม่

หากคุณสร้างสาขาใหม่โดยใช้:

$ git checkout -b branchB
$ git push origin branchB:branchB

คุณสามารถใช้git configคำสั่งเพื่อหลีกเลี่ยงการแก้ไข.git/configไฟล์โดยตรง

$ git config branch.branchB.remote origin
$ git config branch.branchB.merge refs/heads/branchB

หรือคุณสามารถแก้ไขไฟล์ด้วยตนเอง.git/configเพื่อติดตามข้อมูลในสาขานี้

[branch "branchB"]
    remote = origin
    merge = refs/heads/branchB

4
บางครั้งคุณต้องการสิ่งนี้git push origin -u local_branch:remote_branch
Bruce Lee

127

เพียงแค่ใส่เพื่อสร้างสาขาท้องถิ่นทำ:

git branch <branch-name>

หากต้องการพุชไปยังที่เก็บรีโมตให้ทำ:

git push -u origin <branch-name>

17
git branch <branch-name>และgit checkout -b <branch-name>ทั้งคู่สร้างสาขา แต่เปลี่ยนเช็คเอาต์เป็นสาขาใหม่
Robert

1
วงเล็บเพื่อนเป็นเพียงการพูดถึงคุณจะต้องแทนที่ด้วยชื่อสาขาใดที่คุณต้องการสร้างและผลักดัน
piyushmandovra

มันเป็นสาขาที่ไม่มีตัวตนบนรีโมทและปฏิเสธด้วยsrc branch-name does not match any
Adi Prasetyo

96

ความแตกต่างเล็กน้อยของโซลูชันที่ให้ไว้แล้วที่นี่:

  1. สร้างสาขาท้องถิ่นตามสาขาอื่น (ระยะไกลหรือท้องถิ่น):

    git checkout -b branchname
    
  2. พุชสาขาโลคัลไปที่ที่เก็บรีโมต (เผยแพร่) แต่ทำให้สามารถติดตามได้git pullและgit pushจะทำงานได้ทันที

    git push -u origin HEAD
    

    การใช้HEADเป็น "วิธีที่สะดวกในการผลักสาขาปัจจุบันไปยังชื่อเดียวกันบนรีโมท" ที่มา: https://git-scm.com/docs/git-push ในแง่ Git HEAD (เป็นตัวพิมพ์ใหญ่) เป็นการอ้างอิงไปยังด้านบนของสาขาปัจจุบัน (ต้นไม้)

    ตัวเลือกที่เป็นเพียงสั้น-u--set-upstreamสิ่งนี้จะเพิ่มการอ้างอิงการติดตามต้นน้ำสำหรับสาขาปัจจุบัน คุณสามารถตรวจสอบได้โดยดูในไฟล์. git / config ของคุณ:

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


2
ขอบคุณ :) git push -u origin <branch-name>ไม่ได้ทำงานสำหรับฉัน แต่ใช้HEADแทนการ<branch-name>ทำงานอย่างสมบูรณ์ :)
แดเนียลเกโร

56

ฉันแค่ทำ

git push -u origin localBranch:remoteBranchToBeCreated

ผ่านโครงการโคลนแล้ว

Git สร้างสาขาใหม่ที่ชื่อว่าภายใต้การกระทำของฉันที่ฉันได้ในremoteBranchToBeCreatedlocalBranch

แก้ไข : การเปลี่ยนแปลงนี้สาขาในท้องถิ่นของคุณในปัจจุบัน (อาจจะชื่อlocalBranch) origin/remoteBranchToBeCreatedต้นน้ำถึง หากต้องการแก้ไขให้พิมพ์เพียง:

git branch --set-upstream-to=origin/localBranch

ดังนั้นสาขาในพื้นที่ปัจจุบันของคุณจึงติดตามorigin/localBranchกลับ


1
นี่คือสิ่งที่ฉันกำลังมองหา
eli

git พ่นerror: src refspec <new branch> does not match any.เมื่อฉันลองนี้
codeforester

1
นี่ควรเป็นคำตอบที่ดีที่สุด
Aditya Abhas

30

ฉันคิดว่าคุณได้โคลนโครงการเช่น:

git clone http://github.com/myproject.git
  1. จากนั้นในสำเนาของคุณสร้างสาขาใหม่และตรวจสอบ:

    git checkout -b <newbranch>
    
  2. สมมติว่าคุณทำ "git bare --init" บนเซิร์ฟเวอร์ของคุณและสร้าง myapp.git คุณควร:

    git remote add origin ssh://example.com/var/git/myapp.git
    git push origin master
    
  3. หลังจากนั้นผู้ใช้ควรจะสามารถ

    git clone http://example.com/var/git/myapp.git
    

หมายเหตุ:ฉันสมมติว่าคุณมีเซิร์ฟเวอร์ของคุณและทำงานอยู่ หากไม่เป็นเช่นนั้นมันจะไม่ทำงาน ดีวิธีการคือที่นี่

ADDED

เพิ่มสาขาระยะไกล:

git push origin master:new_feature_name

ตรวจสอบว่าทุกอย่างดี (ดึงจุดเริ่มต้นและแสดงรายการสาขาระยะไกล):

git fetch origin
git branch -r

สร้างสาขาท้องถิ่นและติดตามสาขาระยะไกล:

git checkout -tb new_feature_name origin/new_feature_name

อัปเดตทุกอย่าง:

git pull

1
สคริปต์ของ William ฉันเชื่อมโยงทำเช่นเดียวกันกับตัวเลือกเพิ่มเติมเพื่อลบสาขาระยะไกลและการป้องกันบางอย่างเช่นกัน
Tobias Kienzler

1
> เพื่อผลักสาขาท้องถิ่นไปยัง repo ระยะไกล (เผยแพร่) แต่ทำให้> ติดตามได้ดังนั้นการดึง git และ git push จะทำงานทันที มันเป็นสิ่งที่ github ทำโดยอัตโนมัติเมื่อคุณกดรหัสของคุณไปยังที่เก็บของพวกเขา :-)
VP

1
สิ่งนี้ไม่ตอบคำถาม <newbranch> ของ repo ดั้งเดิมไม่สามารถติดตามได้ (และเปลี่ยนชื่อเป็น <master> เป็น repo ใหม่ที่คุณโคลนในขั้นตอนที่ 3)
Lohrun

1
ดูเหมือนว่าชนิดของ overkill เหตุใดจึงgit remote add originทำให้สาขาท้องถิ่นสามารถติดตามได้ นั่นคือคำสั่งที่สำคัญที่นี่หรือไม่
Roni Yaniv

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

23

แก้ไขล้าสมัยเพียงใช้git push -u origin $BRANCHNAME


การใช้งานgit publish-branchจากวิลเลียมเบ็ดเตล็ดเครื่องมือ Git ( repo gitoriousและโคลน )

ตกลงไม่มี Ruby ดังนั้น - ละเว้นมาตรการป้องกัน! - ใช้สามบรรทัดสุดท้ายของสคริปต์และสร้างสคริปต์ทุบตีgit-publish-branch:

#!/bin/bash
REMOTE=$1 # Rewrite this to make it optional...
BRANCH=$2
# Uncomment the following line to create BRANCH locally first
#git checkout -b ${BRANCH}
git push ${ORIGIN} ${BRANCH}:refs/heads/${BRANCH} &&
git config branch.${BRANCH}.remote ${REMOTE} &&
git config branch.${BRANCH}.merge refs/heads/${BRANCH}

จากนั้นเรียกใช้git-publish-branch REMOTENAME BRANCHNAMEโดยที่ REMOTENAME มักจะเป็นจุดเริ่มต้น (คุณสามารถแก้ไขสคริปต์เพื่อให้เริ่มต้นเป็นค่าเริ่มต้น ฯลฯ ... )


1
นี่ถือว่าฉันติดตั้งทับทิมแล้ว ไม่มีโชคเช่นนั้น ความคิดอื่น ๆ ?
Roni Yaniv

2
การเรียกสคริปต์git pushและgit configคำสั่งruby ฉันใช้รหัสของสคริปต์เพื่อแก้ไขคำตอบของฉัน คุณอาจใช้ข้อมูลนี้เพื่อสร้างเชลล์สคริปต์ขนาดเล็กที่ทำหน้าที่เป็น puslishing ให้คุณ
Lohrun

1
เครื่องมือ git จิปาถะของ William ดูเหมือนจะย้ายไปแล้ว (ตอนนี้ลิงก์นั้นตายแล้ว) ลิงก์ทำงานคือ: gitorious.org/willgit
Mike D

1
ลิงก์ "William's" แตกอีกครั้ง ลิงค์ใหม่น่าจะเป็นgit-wt-commit.rubyforge.org
ScottJ

22

เพื่อสร้างสาขาใหม่โดยแยกออกจากสาขาที่มีอยู่

git checkout -b <new_branch>

จากนั้นพุชสาขาใหม่นี้ไปยังที่เก็บโดยใช้

git push -u origin <new_branch>

สิ่งนี้สร้างและผลักดันการกระทำในท้องถิ่นทั้งหมดไปยังสาขาระยะไกลที่สร้างขึ้นใหม่ origin/<new_branch>


12

สำหรับเวอร์ชัน GitLab ก่อน 1.7 ให้ใช้:

git checkout -b name_branch

(name_branch อดีต: master)

หากต้องการพุชไปยังที่เก็บรีโมตให้ทำ:

git push -u origin name_new_branch

(name_new_branch ตัวอย่าง: feature)


9

ฉันสร้างนามแฝงเพื่อที่เมื่อใดก็ตามที่ฉันสร้างสาขาใหม่มันจะผลักดันและติดตามสาขาระยะไกลตามนั้น ฉันใส่ก้อนต่อไปนี้ลงใน.bash_profileไฟล์:

# Create a new branch, push to origin and track that remote branch
publishBranch() {
  git checkout -b $1
  git push -u origin $1
}
alias gcb=publishBranch

การใช้งาน : เพียงพิมพ์gcb thuy/do-sth-koolด้วยthuy/do-sth-koolเป็นชื่อสาขาใหม่ของฉัน


4

เมื่อสร้างคำตอบที่นี่เล็กน้อยฉันได้รวมกระบวนการนี้เป็นสคริปต์ Bash แบบง่ายๆซึ่งแน่นอนว่าสามารถใช้เป็นนามแฝง Git ได้เช่นกัน

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

$ git_push_new_branch.sh

  Have you run your unit tests yet? If so, pass OK or a branch name, and try again

  usage: git_push_new_branch {OK|BRANCH_NAME}

  e.g.

  git_push_new_branch           -> Displays prompt reminding you to run unit tests
  git_push_new_branch OK        -> Pushes the current branch as a new branch to the origin
  git_push_new_branch MYBRANCH  -> Pushes branch MYBRANCH as a new branch to the origin

git_push_new_branch.sh

function show_help()
{
  IT=$(cat <<EOF

  Have you run your unit tests yet? If so, pass OK or a branch name, and try again

  usage: git_push_new_branch {OK|BRANCH_NAME}

  e.g.

  git_push_new_branch.sh           -> Displays prompt reminding you to run unit tests
  git_push_new_branch.sh OK        -> Pushes the current branch as a new branch to the origin
  git_push_new_branch.sh MYBRANCH  -> Pushes branch MYBRANCH as a new branch to the origin

  )
  echo "$IT"
  exit
}

if [ -z "$1" ]
then
  show_help
fi

CURR_BRANCH=$(git rev-parse --abbrev-ref HEAD)
if [ "$1" == "OK" ]
then
  BRANCH=$CURR_BRANCH
else
  BRANCH=${1:-$CURR_BRANCH}
fi

git push -u origin $BRANCH

2

คุณสามารถทำได้ใน 2 steeps:

1.ใช้checkoutสำหรับสร้างสาขาท้องถิ่น:

git checkout -b yourBranchName

ทำงานกับสาขาของคุณตามที่คุณต้องการ

2.ใช้pushคำสั่งเพื่อสร้างสาขาและส่งรหัสไปยังที่เก็บระยะไกล:

git push -u origin yourBanchName

มีหลายวิธีในการทำเช่นนี้ แต่ฉันคิดว่าวิธีนี้ง่ายมาก


0

เพื่อความยืดหยุ่นสูงสุดคุณสามารถใช้คำสั่ง Git ที่กำหนดเองได้ ตัวอย่างเช่นสร้างสคริปต์ Python ต่อไปนี้ที่ใดที่หนึ่งใน$PATHชื่อของคุณgit-publishและทำให้สามารถเรียกใช้งานได้:

#!/usr/bin/env python3

import argparse
import subprocess
import sys


def publish(args):
    return subprocess.run(['git', 'push', '--set-upstream', args.remote, args.branch]).returncode


def parse_args():
    parser = argparse.ArgumentParser(description='Push and set upstream for a branch')
    parser.add_argument('-r', '--remote', default='origin',
                        help="The remote name (default is 'origin')")
    parser.add_argument('-b', '--branch', help='The branch name (default is whatever HEAD is pointing to)',
                        default='HEAD')
    return parser.parse_args()


def main():
    args = parse_args()
    return publish(args)


if __name__ == '__main__':
    sys.exit(main())

จากนั้นgit publish -hจะแสดงข้อมูลการใช้งานให้คุณ:

usage: git-publish [-h] [-r REMOTE] [-b BRANCH]

Push and set upstream for a branch

optional arguments:
  -h, --help            show this help message and exit
  -r REMOTE, --remote REMOTE
                        The remote name (default is 'origin')
  -b BRANCH, --branch BRANCH
                        The branch name (default is whatever HEAD is pointing to)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.