새로운 로컬 브랜치를 원격 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 나에게 이해가되지 않았다 추적되지 의미가 있다고 생각
드미트리

답변:


6609

Git 1.7.0 이상에서 새로운 브랜치를 체크 아웃 할 수 있습니다 :

git checkout -b <branch>

파일을 편집하고 추가하고 커밋하십시오. 그런 다음 (Short for ) 옵션으로 푸시하십시오-u--set-upstream .

git push -u origin <branch>

힘내는 푸시 동안 추적 정보를 설정합니다.


81
또한 기존 추적 분기가 이미 추진중인 분기 push.default에 설정되어 있고 로 설정되어 upstream있으면이 방식으로 생각하지 않을 것입니다. 기존 추적 분기를 푸시하려고 시도합니다. 사용 : git push -u origin mynewfeature:mynewfeature또는 git branch --unset-upstream먼저하십시오.
void.pointer

13
Visual Studio에서 Git을 사용하는 사람들의 경우 : 실제로 이것은 Visual Studio의 "Publish Branch"입니다. -u 매개 변수로 git push를 실행하면 마침내 VS UI에 게시 된 분기를 볼 수 있습니다.
Puterdo Borato

3
git push -u origin <branch>는 git push -u origin HEAD와 동일합니까? (
누르고

13
우리는 필요합니까 -u우리가 원격으로 분기를 밀거나가 처음으로 필요할 때만 때마다 옵션을?
Stephane

17
@Stephane -u한 번만 추적을 시작할 수 있습니다. 나중에 사용git push
Todd

491

레포를 다른 사람과 공유하지 않는 경우 모든 분기를 원격 으로 푸시 하고--set-upstream 올바르게 추적 하는 데 유용 합니다.

git push --all -u

(OP가 요구하는 것과 정확히 일치하지는 않지만이 원 라이너는 꽤 인기가 있습니다)

레포를 다른 사람들과 공유하는 경우 모든 dodgy 실험 브랜치로 레포를 막을 수 있으므로 이것은 좋은 형태가 아닙니다.


14
그리고 git pull --all그것은 다른 모든 다시 끌어? kewl
commonpike

1
이 명령은 아무 것도 누르지 않아도 올바른 지점으로 추적을 설정합니다. 감사합니다.
amey91

45
힘내는 분기를 커밋하고 아주 좋은 이유로 밀어 넣지 않습니다. git push --all 만 사용하는 것은 git 아키텍처를 삭제하는 것과 같습니다. 그것이 당신에게 효과가 있다면, 그것은 완벽하게 괜찮습니다. 그러나 git 학습을 피하기 위해 다른 사람들을 권장하지 마십시오.
Federico Razzoli

4
이것은 실제로 정답이 아니며 그 기능과 그 의미에 대한 실제 설명없이 추천하는 좋은 도구가 아닙니다. 이 답변을 거절하십시오.
akronymn

3
@Federico @akronymn 어디에서 위험을 감수 할 수 있습니까 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>모두 새로운 지점에 지점 만 체크 아웃 스위치를 만들
로버트

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>:) 완벽하게 작동
다니엘 TONON에게

56

나는 단순히

git push -u origin localBranch:remoteBranchToBeCreated

이미 복제 된 프로젝트를 통해

Git은 remoteBranchToBeCreated내가 한 커밋 아래에 새 브랜치를 만듭니다 localBranch.

편집 : 현재 로컬 지점의 localBranch업스트림으로 변경 될 수 origin/remoteBranchToBeCreated있습니다. 이를 수정하려면 다음을 입력하십시오.

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

따라서 현재 지역 지점이 origin/localBranch다시 추적 됩니다.


1
이것은 내가 정확하게 적극적으로 찾고 있었던 것입니다
eli

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
    

참고 : 서버를 가동하고 있다고 가정합니다. 그렇지 않으면 작동하지 않습니다. 좋은 방법은 여기에 있습니다 .

추가

원격 브랜치를 추가하십시오.

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
로컬 브랜치를 원격 저장소 (게시)로 푸시하지만 추적 가능하게하여 git pull 및 git push가 즉시 작동합니다. 코드를 저장소로 푸시 할 때 github이 자동으로 수행하는 작업 :-)
VP.

1
이 질문에 응답하지 않고 원래 리포지토리의 <newbranch>를 추적 할 수 없습니다 (3 단계에서 복제 한 새 리포지토리로 <master>로 이름이 바)).
Lohrun

1
일종의 잔인한 것 같습니다. 는 않습니다 git remote add origin로컬 브랜치 추적 가능한을? 그게 핵심 명령입니까?
Roni Yaniv

3
@Roni Yaniv : git remote add origin새로운 원격 저장소 만 등록 할 필요는 없습니다 . 분기를 해당 원격 저장소로 푸시하기 전에 필요한 단계입니다 (매번 전체 주소를 입력하지 않으려는 경우)
Lohrun

23

구식 편집 , 그냥 사용git push -u origin $BRANCHNAME


사용 git publish-branch에서 윌리엄의 기타 힘내 도구 ( gitorious의 repo복제 ).

좋아요, 루비는 없습니다. 안전 장치를 무시하십시오! -스크립트의 마지막 세 줄을 가져 와서 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}

그런 다음 git-publish-branch REMOTENAME BRANCHNAMEREMOTENAME이 일반적으로 origin 인 곳에서을 실행하십시오 (원본을 기본값으로 사용하도록 스크립트를 수정할 수 있음 등).


1
이것은 내가 루비를 설치했다고 가정합니다. 그런 운이 없습니다. 다른 아이디어?
Roni Yaniv

2
루비 스크립트 호출 git pushgit config명령. 스크립트 코드를 사용하여 답변을 편집했습니다. 이 정보를 사용하여 게시를 수행하는 작은 쉘 스크립트를 작성할 수 있습니다.
Lohrun

1
William의 기타 git 도구가 이동 한 것 같습니다 (링크가 이제 죽었습니다). 작업 링크 : gitorious.org/willgit
Mike D

1
"윌리엄"링크가 다시 끊어졌습니다. 새로운 링크는 git-wt-commit.rubyforge.org
ScottJ

22

기존 분기에서 분기하여 새 분기를 만들려면

git checkout -b <new_branch>

그런 다음을 사용 하여이 새로운 지점을 저장소로 푸시하십시오.

git push -u origin <new_branch>

이것은 모든 로컬 커밋을 생성하고 새로 생성 된 원격 브랜치에 푸시합니다. origin/<new_branch>


12

1.7 이전의 GitLab 버전의 경우 다음을 사용하십시오.

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 개의 가파른 곳에서 할 수 있습니다 :

1.를 사용하여 checkout로컬 분기를 만듭니다.

git checkout -b yourBranchName

원하는대로 지사와 협력하십시오.

2.push 명령을 사용하여 분기를 자동 생성하고 코드를 원격 저장소로 보냅니다.

git push -u origin yourBanchName

이 작업을 수행하는 여러 가지 방법이 있지만이 방법은 정말 간단하다고 생각합니다.


0

유연성을 극대화 하기 위해 사용자 지정 Git 명령을 사용할 수 있습니다 . 예를 들어, $PATH이름 아래 에 다음 Python 스크립트를 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.