Làm cách nào để đẩy một nhánh cục bộ mới vào kho Git từ xa và cũng theo dõi nó?


4305

Tôi muốn có thể làm như sau:

  1. Tạo một nhánh cục bộ dựa trên một số nhánh khác (từ xa hoặc cục bộ) (thông qua git branchhoặc git checkout -b)

  2. Đẩy nhánh cục bộ vào kho lưu trữ từ xa (xuất bản), nhưng làm cho nó có thể theo dõi được git pullgit pushsẽ hoạt động ngay lập tức.

Làm thế nào để làm điều đó?

Tôi biết về --set-upstreamGit 1.7, nhưng đó là một hành động hậu sáng tạo. Tôi muốn tìm một cách để thực hiện một thay đổi tương tự khi đẩy chi nhánh vào kho lưu trữ từ xa.



72
chỉ để chỉ ra - ngược dòng là -u
Baiyan Huang

@BaiyanHuang cảm ơn vì đã chỉ ra điều đó. Ban đầu tôi nghĩ rằng -u có nghĩa là không bị theo dõi mà không có ý nghĩa với tôi
Dmitry

Câu trả lời:


6613

Trong Git 1.7.0 trở lên, bạn có thể kiểm tra một nhánh mới:

git checkout -b <branch>

Chỉnh sửa tập tin, thêm và cam kết. Sau đó đẩy với-u--set-upstream tùy chọn (viết tắt ) :

git push -u origin <branch>

Git sẽ thiết lập thông tin theo dõi trong quá trình đẩy.


81
Cũng đáng lưu ý rằng nếu bạn có một nhánh theo dõi hiện có đã được đặt trên nhánh bạn đang đẩy và push.defaultđược đặt thành upstream, điều này sẽ không làm những gì bạn nghĩ nó sẽ làm. Nó sẽ cố gắng đẩy qua nhánh theo dõi hiện có. Sử dụng: git push -u origin mynewfeature:mynewfeaturehoặc làm git branch --unset-upstreamđầu tiên.
void.pulum

13
Đối với những người sử dụng Git từ Visual Studio: Thật ra đây là "Publish Branch" trong Visual Studio. Sau khi thực hiện git đẩy với tham số -u, cuối cùng tôi cũng có thể thấy nhánh của mình được xuất bản trong VS UI.
Puterdo Borato 19/03/2015

3
Có phải git push -u origin <Branch> giống với git push -u origin HEAD (giả sử bạn có nhánh bạn muốn đẩy ra kiểm tra?)
gymbrall

13
Chúng ta có cần -utùy chọn mỗi khi chúng ta đẩy chi nhánh đến điều khiển từ xa hay chỉ cần nó lần đầu tiên?
Stephane

17
@Stephane Bạn chỉ cần -umột lần để bắt đầu theo dõi. Sau đó chỉ cần sử dụnggit push
Todd

491

Nếu bạn không chia sẻ repo của mình với người khác, điều này rất hữu ích để đẩy tất cả các chi nhánh của bạn đến điều khiển từ xa và --set-upstreamtheo dõi chính xác cho bạn:

git push --all -u

(Không chính xác những gì OP yêu cầu, nhưng lớp lót này khá phổ biến)

Nếu bạn đang chia sẻ repo của mình với người khác thì đây không phải là hình thức thực sự tốt vì bạn sẽ làm tắc nghẽn repo với tất cả các nhánh thử nghiệm tinh ranh của bạn.


14
git pull --allkéo tất cả trở lại nơi khác? kewl
commonpike

1
Lệnh này thiết lập theo dõi đến nhánh chính xác mà không cần phải đẩy bất cứ thứ gì. Cảm ơn bạn.
amey91

45
Git cho phép cam kết một chi nhánh và không đẩy nó vì những lý do rất tốt. Chỉ sử dụng git đẩy --all giống như thả một mảnh kiến ​​trúc git. Nếu nó làm việc cho bạn, nó là hoàn toàn ok, tuyệt vời, làm điều đó mãi mãi. Nhưng xin đừng khuyên người khác tránh học git chỉ vì đó là cách nhanh chóng để làm mọi việc.
Federico Razzoli

4
Đây thực sự không phải là câu trả lời đúng và không phải là một công cụ tốt để được đề xuất mà không có lời giải thích thực sự về những gì nó làm và ý nghĩa của nó là gì. Hãy xem xét đưa câu trả lời này xuống.
akronymn

3
@Federico @akronymn Người ta có thể tìm thấy những nguy hiểm khi làm ở git push --all -uđâu?
dùng1823664

155

Trước khi giới thiệu git push -u, không có git pushtùy chọn để có được những gì bạn mong muốn. Bạn phải thêm các câu lệnh cấu hình mới.

Nếu bạn tạo một nhánh mới bằng cách sử dụng:

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

Bạn có thể sử dụng git configlệnh để tránh chỉnh sửa trực tiếp .git/configtệp.

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

Hoặc bạn có thể chỉnh sửa thủ công .git/configtệp để có thông tin theo dõi đến chi nhánh này.

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

4
đôi khi bạn cần điều nàygit push origin -u local_branch:remote_branch
Bruce Lee

127

Nói một cách đơn giản, để tạo một chi nhánh địa phương mới , hãy làm:

git branch <branch-name>

Để đẩy nó vào kho lưu trữ từ xa , hãy làm:

git push -u origin <branch-name>

17
git branch <branch-name>git checkout -b <branch-name>cả hai tạo ra một chi nhánh nhưng thanh toán chuyển sang chi nhánh mới
Robert

1
khung anh chàng chỉ để đề cập đến bạn phải thay thế bằng bất kỳ tên chi nhánh nào bạn muốn tạo và đẩy.
piyushmandovra

đó là một chi nhánh chưa có trên điều khiển từ xa và từ chối vớisrc branch-name does not match any
Adi Prasetyo

96

Một biến thể nhỏ của các giải pháp đã được đưa ra ở đây:

  1. Tạo một nhánh cục bộ dựa trên một số nhánh khác (từ xa hoặc cục bộ):

    git checkout -b branchname
    
  2. Đẩy nhánh cục bộ vào kho lưu trữ từ xa (xuất bản), nhưng làm cho nó có thể theo dõi được git pullgit pushsẽ hoạt động ngay lập tức

    git push -u origin HEAD
    

    Sử dụng HEADlà "cách tiện dụng để đẩy chi nhánh hiện tại về cùng tên trên điều khiển từ xa". Nguồn: https://git-scm.com/docs/git-push Trong thuật ngữ Git, HEAD (viết hoa) là một tham chiếu đến đỉnh của nhánh hiện tại (cây).

    Các -utùy chọn chỉ là viết tắt của --set-upstream. Điều này sẽ thêm một tham chiếu theo dõi ngược dòng cho chi nhánh hiện tại. bạn có thể xác minh điều này bằng cách tìm trong tệp .git / config của bạn:

    Nhập mô tả hình ảnh ở đây


2
Cảm ơn bạn :) git push -u origin <branch-name>đã không làm việc cho tôi nhưng sử dụng HEADthay vì <branch-name>làm việc hoàn hảo :)
Daniel Tonon

56

Tôi chỉ đơn giản là làm

git push -u origin localBranch:remoteBranchToBeCreated

trên một dự án đã được nhân bản.

Git tạo ra một chi nhánh mới có tên remoteBranchToBeCreatedtheo cam kết của tôi mà tôi đã làm localBranch.

Chỉnh sửa : điều này thay đổi localBranchngược dòng của chi nhánh địa phương hiện tại của bạn (có thể được đặt tên ) origin/remoteBranchToBeCreated. Để khắc phục điều đó, chỉ cần gõ:

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

Vì vậy, chi nhánh địa phương hiện tại của bạn theo dõi origin/localBranchtrở lại.


1
Đây chính xác là những gì tôi đã tích cực tìm kiếm
eli

git ném error: src refspec <new branch> does not match any.khi tôi thử điều này.
codeforester

1
Đây phải là câu trả lời hàng đầu.
Aditya Abhas

30

Tôi cho rằng bạn đã nhân bản một dự án như:

git clone http://github.com/myproject.git
  1. Sau đó, trong bản sao cục bộ của bạn, tạo một chi nhánh mới và kiểm tra xem nó:

    git checkout -b <newbranch>
    
  2. Giả sử bạn đã tạo "git Bare --init" trên máy chủ của mình và tạo myapp.git, bạn nên:

    git remote add origin ssh://example.com/var/git/myapp.git
    git push origin master
    
  3. Sau đó, người dùng sẽ có thể

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

LƯU Ý: Tôi giả sử rằng bạn có máy chủ hoạt động. Nếu không, nó sẽ không hoạt động. Một cách tốt để làm là ở đây .

THÊM

Thêm một chi nhánh từ xa:

git push origin master:new_feature_name

Kiểm tra xem mọi thứ có tốt không (lấy nguồn gốc và liệt kê các nhánh từ xa):

git fetch origin
git branch -r

Tạo một nhánh cục bộ và theo dõi nhánh từ xa:

git checkout -tb new_feature_name origin/new_feature_name

Cập nhật mọi thứ:

git pull

1
Kịch bản của William mà tôi đã liên kết thực hiện tương tự với tùy chọn bổ sung để xóa các chi nhánh từ xa và một số biện pháp bảo vệ
Tobias Kienzler

1
> để đẩy chi nhánh địa phương lên repo từ xa (xuất bản), nhưng làm cho nó> có thể theo dõi để git pull và git đẩy sẽ hoạt động ngay lập tức. github sẽ tự động làm gì khi bạn đẩy mã của mình vào kho lưu trữ của họ :-)
VP.

1
Điều này không trả lời cho câu hỏi, <newbranch> của repo ban đầu không thể theo dõi được (và được đổi tên thành <master> là repo mới mà bạn sao chép ở bước 3).
Lohrun

1
Có vẻ như quá mức cần thiết. không git remote add originlàm cho các chi nhánh địa phương có thể theo dõi? Đó có phải là lệnh chính ở đây?
Roni Yaniv

3
@Roni Yaniv: không git remote add originchỉ đăng ký một kho lưu trữ từ xa mới. Đây chỉ là một bước cần thiết trước khi đẩy chi nhánh của bạn đến kho lưu trữ từ xa đó (nếu bạn không muốn nhập toàn bộ địa chỉ mỗi lần)
Lohrun

23

chỉnh sửa lỗi thời, chỉ cần sử dụnggit push -u origin $BRANCHNAME


Sử dụng git publish-branchtừ các công cụ Git linh tinh của William ( repobản sao ).

OK, không có Ruby, vì vậy - bỏ qua các biện pháp bảo vệ! - lấy ba dòng cuối cùng của tập lệnh và tạo tập lệnh bash , 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}

Sau đó chạy git-publish-branch REMOTENAME BRANCHNAME, trong đó REMOTENAME thường là nguồn gốc (bạn có thể sửa đổi tập lệnh để lấy nguồn gốc làm mặc định, v.v ...)


1
giả định này tôi đã cài đặt ruby. không có may mắn như vậy còn ý tưởng nào khác không?
Roni Yaniv

2
kịch bản ruby ​​gọi git pushgit configlệnh. Tôi đã sử dụng mã của kịch bản để chỉnh sửa câu trả lời của mình. Bạn có thể đã sử dụng thông tin này để tạo một tập lệnh shell nhỏ thực hiện việc xuất bản cho bạn.
Lohrun

1
Các công cụ git linh tinh của William dường như đã di chuyển (liên kết đó hiện đã chết). Một liên kết hoạt động là: gitorious.org/willgit
Mike D

1
Liên kết "William's" lại bị hỏng; liên kết mới dường như là git-wt-commit.rubyforge.org
ScottJ

22

Để tạo một nhánh mới bằng cách phân nhánh từ một nhánh hiện có

git checkout -b <new_branch>

và sau đó đẩy nhánh mới này vào kho lưu trữ bằng cách sử dụng

git push -u origin <new_branch>

Điều này tạo và đẩy tất cả các cam kết cục bộ đến một nhánh từ xa mới được tạo origin/<new_branch>


12

Đối với phiên bản GitLab trước 1.7, hãy sử dụng:

git checkout -b name_branch

(tên_branch, ví dụ master:)

Để đẩy nó vào kho lưu trữ từ xa, hãy làm:

git push -u origin name_new_branch

(name_new_branch, ví dụ feature:)


9

Tôi đã tạo một bí danh để bất cứ khi nào tôi tạo một nhánh mới, nó sẽ đẩy và theo dõi nhánh từ xa tương ứng. Tôi đặt đoạn sau vào .bash_profiletập tin:

# 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

Cách sử dụng : chỉ cần gõ gcb thuy/do-sth-koolvới thuy/do-sth-koollà tên chi nhánh mới của tôi.


4

Dựa vào các câu trả lời ở đây, tôi đã kết thúc quá trình này như một tập lệnh Bash đơn giản, tất nhiên cũng có thể được sử dụng như một bí danh Git.

Bổ sung quan trọng đối với tôi là điều này nhắc tôi chạy thử nghiệm đơn vị trước khi cam kết và chuyển vào tên chi nhánh hiện tại theo mặc định.

$ 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

Bạn có thể làm điều đó trong 2 dốc:

1. Sử dụng checkoutđể tạo chi nhánh địa phương:

git checkout -b yourBranchName

Làm việc với Chi nhánh của bạn như bạn muốn.

2. Sử dụng pushlệnh để tự động tạo nhánh và gửi mã đến kho lưu trữ từ xa:

git push -u origin yourBanchName

Có nhiều cách để làm điều này nhưng tôi nghĩ rằng cách này thực sự đơn giản.


0

Để linh hoạt nhất, bạn có thể sử dụng lệnh Git tùy chỉnh . Ví dụ: tạo tập lệnh Python sau ở đâu đó trong $PATHtên của bạn git-publishvà làm cho tập lệnh thực thi:

#!/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())

Sau đó git publish -hsẽ cho bạn thấy thông tin sử dụng:

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)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.