왜 항상`--set-upstream`을해야합니까?


1467

Git에 새로운 브랜치를 생성합니다 :

git branch my_branch

밀어:

git push origin my_branch

이제 누군가 서버에서 일부를 변경했다고 말하고 싶습니다 origin/my_branch. 나는한다:

git pull

그러나 나는 얻는다 :

You asked me to pull without telling me which branch you
want to merge with, and 'branch.my_branch.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 "my_branch"]
    remote = <nickname>
    merge = <remote-ref>

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

See git-config(1) for details.

나는 그것이 작동하도록 할 수 있다는 것을 배웠다.

git branch --set-upstream my_branch origin/my_branch

하지만 내가 만드는 모든 지점에 대해 왜 이렇게해야합니까? 내가 밀어 경우 분명하지 않다 my_branchorigin/my_branch, 나는 당겨 할 것 origin/my_branch으로 my_branch? 이것을 기본 동작으로 만들려면 어떻게해야합니까?


21
의 기본값 branch.autosetupmerge은 새 분기의 업스트림 구성이 원격 추적 분기 (예 :)에서 분기를 만들 때만 자동으로 설정됨을 의미합니다 <remote-name>/<branch-name>( git-config (1) 참조 ). 기존 로컬 지점에서 지점을 작성 중일 수 있습니다. 로컬 브랜치에도 불구하고 원격 브랜치의 끝에서 직접 효과적으로 브랜칭하는 git branch my_branch <remote-name>/<branch-name>경우 업스트림 구성을 자동으로 설정하는 데 사용할 수 있습니다 .
크리스 존슨

20
참고로이 --set-upstream옵션은 더 이상 사용되지 않습니다. --track또는 --set-upstream-to대신 사용해야 합니다.
숀 더 빈

139
--set-upstream더 이상 사용되지 않으면 git devs는 git push옵션없이 실행 하고 업스트림이 설정되지 않은 경우 표시되는 도움말 메시지에서 제거해야 합니까?
Christopher Hunter

17
@ChristopherHunter 귀하의 의견 이후 1 년이 지났으며 여전히 그렇게 말합니다. 단지 부주의 한 피드백일까요, 아니면 우리가 모르는 것에 대해 기술적으로 현명한 이유가 있습니까?
Konrad Viltersten

15
@ChristopherHunter git branch --set-upstream는 더 이상 사용되지 않습니다. git push --set-upstream아니다.
Brian Gordon

답변:


1538

git branch --set-upstream 1 의 구문을 기억하지 않는 바로 가기 는 다음과 같습니다.

git push -u origin my_branch

그 지점을 처음 눌렀을 때 또는 현재 브랜치를 동일한 이름의 브랜치로 푸시하려면 (별명에 적합) :

git push -u origin HEAD

-u한 번만 사용 하면 브랜치와 브랜치 origin가 같은 방식으로 연결됩니다.git branch --set-upstream .

개인적으로 지사와 원격 지사 사이의 연결을 명시 적으로 설정하는 것이 좋습니다. 이 규칙이 있음을 단지 수치 에 대해 서로 다른 git pushgit pull .


1 어리석은 소리가 들릴지 모르지만 기본값이 아니라고 가정하면 현재 분기를 지정하는 것을 잊어 버립니다. 결과가 가장 혼란 스럽습니다. :)

2012-10-11 업데이트 : 분명히 내가 잘못하기 쉬운 것을 발견 한 유일한 사람은 아닙니다! 덕분에 VonC 그 자식에게 더 분명 1.8.0 소개합니다 지적 git branch --set-upstream-to당신이 지점에 있다면, 다음과 같이 사용할 수 있습니다 my_branch:

git branch --set-upstream-to origin/my_branch

... 또는 짧은 옵션으로 :

git branch -u origin/my_branch

이 변경 및 추론은 git 1.8.0, 릴리스 후보 1의 릴리스 정보에 설명되어 있습니다 .

그것은 유혹적 git branch --set-upstream origin/master이지만 Git에게 로컬 origin/master체크 아웃을 현재 체크 아웃 된 브랜치와 통합 하도록 정렬하도록 지시 합니다. 이 옵션은 더 이상 사용되지 않습니다. 대신 새롭고 --set-upstream-to짧고 달콤한 -u옵션을 사용하십시오.


95
또한 -u처음 푸시 를 잊어 버린 경우에도 해당 플래그를 사용하여 푸시를 다시 실행할 수 있으며 추적이 시작됩니다.
Henrik N

70
이들 중 어느 것도 인수없이 git push를 사용하는 유스 케이스를 만족시키지 않습니다. 새 분기를 원격으로 처음 이동할 때 여전히 'git push -u origin my-branch'를 기억해야합니다.
칼 이교도

19
나는 그 구문도 기억하는 것을 싫어해서 다음과 같은 별칭을 만들었습니다.alias gpo="git push --set-upstream origin $(git branch | awk '/^\* / { print $2 }')"
lillialexis

99
이것은 괜찮지 만 OP의 불만은 여전히 ​​유효하다고 생각합니다. 로컬 브랜치를 시작하고, 작업하고, (args없이) 공유하도록 원점으로 푸시합니다. 왜 업스트림을 설정해서는 안됩니까? 어떤 이유로 새 분기를 리모컨으로 푸시 할 때 업스트림을 설정하지 않는 것이 실제로 바람직합니까?
GaryO

23
개발 시간은 전혀 가치가 없습니다. 왜 자동으로 수행되지 않습니까?
sudo

1346

적은 타이핑으로도 가능합니다. 먼저 푸시 작동 방식을 변경하십시오.

git config --global push.default current

이것은 origin my_branch부분 을 유추 하므로 다음을 수행 할 수 있습니다.

git push -u

동일한 이름으로 원격 브랜치를 생성하고 추적합니다.


4
새로 생성 된 저장소에서 새로 생성 된 분기를 origin실행할 때 git이 어떻게 추론 할 수 git push -u있습니까? 저장소가 복제되었다고 가정하면 현재 분기의 원격 설정이 origin?
Piotr Dobrogost

73
이것이 기본값이어야합니다. 더 나은 기본값으로 방금 제공되면 git의 많은 것들이 더 사용자 친화적 일 수 있습니다.
phreakhead

13
'현재'는 동일한 작업을 수행하기 위해 '단순'을 사용하는 것보다 약간 안전하지 않습니다. stackoverflow.com/questions/23918062/…
Air

30
그렇게하지만 시도 할 때 pull어디서부터 지정해야합니다. -u기원과 지역의 repo 사이의 지점 추적 설정합니다.
Zamith

7
비록 편리하지는 않지만, 여전히이 명령의 첫 번째 push요점을 무너 뜨리는 첫 번째 명령 만 다른 명령을 실행해야합니다 . 요컨대, 좋은 대답이 없습니다. Git 개발자들은 광범위한 커뮤니티의 반대 의견에 직면하여이 어색한 사용자 경험 (AUX)을 유지해야한다고 주장합니다. 그리고 낙담. (대부분 낙담합니다.)
Cecil Curry 5

87

당신은 단순히 할 수 있습니다

git checkout -b my-branch origin/whatever

처음에. 사용자가 설정 한 경우 branch.autosetupmerge또는 branch.autosetuprebase(내가 좋아하는)에 always(기본값은 true), my-branch자동으로 추적합니다origin/whatever .

참조하십시오 git help config.


5
"치명적인 : 경로를 업데이트 할 수없고 'my-branch'분기로 동시에 전환 할 수 없습니다."
칼 이교도

12
그건 그렇고, 나는 보통 그냥 git checkout -t origin/whatever이며, 또한 whatever새로운 branch-name으로 선택합니다. 매우 편리합니다!
cdunn2001

2
@cdunn 이것은 이상적이지만 거의 일관성이 없습니다. 플래그는 -u/ 이어야합니다 --set-upstream.
Tobu

1
git checkout -t origin/whatever새 지점을 만들려고 할 때 작동하지 않습니다.fatal: Cannot update paths and switch to branch 'whatever' at the same time.
wisbucky

1
git checkout -b my-branch origin/whatever또한 같은 오류가 있습니다 (로컬 또는 원격에 존재하지 않는 새 분기를 만들려고합니다). fatal: Cannot update paths and switch to branch 'whatever' at the same time.
wisbucky

81

두 가지 방법으로보다 간단하게 업스트림을 설정할 수 있습니다. 먼저 지점을 만들 때 :

git branch -u origin/my-branch

또는 분기를 만든 후이 명령을 사용할 수 있습니다.

git push -u origin my-branch

단일 명령으로 분기, 체크 아웃 및 업스트림을 설정할 수도 있습니다.

git checkout -b my-branch -t origin/my-branch

개인적으로 선호하는 것은 2 단계 명령으로이를 수행하는 것입니다.

git checkout -b my-branch
git push -u origin my-branch

1
좋은 답변입니다! 두 가지 일반적인 사용 사례를 모두 해결합니다. 실행 후 변경 사항을 풀다운하기 위해 git branch -u origin/my-branch실행할 수 있습니다 git pull.
Benjamin Atkin

2
"git checkout -b my-branch -t origin / my-branch" 'origin / my-branch'가 아직 존재하지 않으면 작동하지 않습니다.
Spongman

1
실제로는 git checkout -t origin/my-branch없이도 -b my-branchmy-branch수 있으며 로컬 지점 이름을 자동으로 유추 합니다. 그러나 @Spongman이 언급 했듯이이 명령이 origin/my-branch먼저 존재 하지 않으면 작동 하지 않습니다.
wisbucky

예, @wisbucky에서 작동합니다. -t 작동합니다. 개인적으로, 비록 그 대답을 쓴 지 2 년이 지난 후에도 여전히 체크 아웃 -b와 push -u를 사용하여 두 줄로 나누기를 선호합니다. 체크 아웃시 더 명확하고 오류가 없습니다. -b 원격에 없을 때
Tzen

2
git push -u origin/my-branch와 함께 실패합니다 fatal: 'origin/my-branch' does not appear to be a git repository. git push -u origin my-branch
stason

80

이것은 The Fuck에 대한 나의 가장 일반적인 사용입니다 .

$ git push
fatal: The current branch master has no upstream branch.
To push the current branch and set the remote as upstream, use

    git push --set-upstream origin master

$ fuck
git push --set-upstream origin master [enter/↑/↓/ctrl+c]
Counting objects: 9, done.
...

또한 터미널에 욕설을 입력하는 것도 재미 있습니다.


따라서 Windows (또는 적어도 git-bash)로 이식해야합니다.
BrianHVB

1
이 작은 발견이 방금 저의 하루를 만들었습니다. 감사합니다
Ivan Durst

웅장한 도구, 감사합니다!
Yurii

48

당신이 사용할 수있는:

git config --global branch.autosetup 병합 항상

새 분기를 만들거나 체크 아웃 할 때마다 업스트림 분기를 연결합니다.

https://felipec.wordpress.com/2013/09/01/advanced-git-concepts-the-upstream-tracking-branch/를 참조 하십시오

branch.autosetuprebaserebase에 초점을 맞춘 워크 플로를 따르는 경우 에도 작동 하지만 수행중인 작업을 알지 못하는 한이를 사용하지 마십시오. 풀 동작이 rebase로 기본 설정되어 이상한 결과가 발생할 수 있습니다.


8
작동하지 않지만 여전히 --set-upstream메시지가 나타납니다
Dorian

2
@Dorian, 분기를 만들기 전에이를 설정해야합니다. 참조 stackoverflow.com/a/9753268/263998
cdunn2001

8
그러나 이것은 추적 브랜치를 동일한 브랜치가있는 원격으로 설정하지 않고 현재 로컬 브랜치로 설정합니다. 따라서 푸시하면 새 브랜치를 생성하기 전에 LOCAL 브랜치로 푸시하려고 시도합니다.
Arnold Roa

1
이것은 기본값보다 더 이상한 동작을합니다. 지점에서 작업을하면 정말 이상하게 행동합니다.
Beefster

1
이 설정에 주의하십시오 !! 설정 한 후에이 동작이 나타납니다. 1.로 전환하십시오 master. 2.를 실행하십시오 git checkout -b new_branch. 3. 해당 분기에 커밋을 추가하십시오. 4 git push origin new_branch. 이렇게하면 해당 커밋이master 이라는 원점의 새 분기가 아닌 원점 분기로 푸시new_branch 됩니다.
stwr667

38

그건 그렇고, 현재 지점을 같은 이름의 리모컨으로 푸시하는 바로 가기입니다.

$ git push -u origin HEAD

22

나는 개인적으로 bash에서 다음 별칭을 사용합니다.

~ / .gitconfig 파일에서

[alias]
    pushup = "!git push --set-upstream origin $(git symbolic-ref --short HEAD)"

~ / .bashrc 또는 ~ / .zshrc 파일에서

alias gpo="git pushup"
alias gpof="gpo -f"
alias gf="git fetch"
alias gp="git pull"

1
.gitconfig를 hcange하기 만하면 git pushup되며 항상 현재 분기를 원점으로 푸시하는 명령 을 사용할 수 있습니다 . 나는 항상 👍 git pushup대신 사용할 수 있습니다git push
thespacecamel

18

아래가 작동하지 않는 경우 :

git config --global push.default current

프로젝트에 로컬 자식 구성이있을 수 있으므로 프로젝트의 로컬 구성을 업데이트해야합니다.

git config --local push.default current

2
더 많은 설명이 좋을 것입니다. 첫 번째 줄은 무엇을합니까?
빠삐용

3
이 답변은 합법적 인 느낌입니다. 별명을 제안하는 모든 것은 벙어리 해결 방법입니다. 그리고 긴 명령 시퀀스를 암기하는 것을 정당화하는 다른 것들은 pedantic입니다.
MarkHu

10

git pull에게 어떤 원격 브랜치를 가져올 지 명시 적으로 알 수 있습니다 (오류 메시지에서 언급했듯이).

git pull <remote-name> <remote-branch>

그러나이 점에주의하십시오 . 다른 브랜치에 있고 명시적인 풀을 수행하면 가져온 참조 스펙이 현재 브랜치에 병합됩니다!


10

가치있는 것을 위해, 이미 원격에 존재하지만 (예 : origin / somebranch) 지점을 추적하려고 시도했지만 아직 로컬에서 확인하지 않은 경우 다음을 수행 할 수 있습니다.

$ git checkout --track origin/somebranch

참고 : '-t'는 '--track'옵션의 단축 버전입니다.

이것은 박쥐와 동일한 연관성을 설정합니다.


5
실제로 지점에 체크 아웃 할 수 있습니다. 따라서 git checkout somebranch동등합니다.
Zamith

2
@Zamith git fetch바로 호출 한 후에 만 ​​작동하지 않습니까?
Walter Roman

1
즉시는 아니지만 그렇습니다 . git fetch또는 을 호출 할 때마다 발생하는 로컬 리포지토리의 해당 분기에 대한 참조가 필요합니다 git pull. 그래도 문제가되는 것을 결코 발견하지 못했습니다.
Zamith

10
git branch --set-upstream-to=origin/master<branch_name>

9

매번 Git의 제안을 복사 / 붙여 넣는 대신이 Git 별칭을 사용합니다. https://gist.github.com/ekilah/88a880c84a50b73bd306

아래에 소스가 복사되었습니다 ( ~/.gitconfig파일에 추가 ).

[alias]
  pushup = "!gitbranchname() { git symbolic-ref --short HEAD; }; gitpushupstream() { git push --set-upstream origin `gitbranchname`; }; gitpushupstream"

7

지나치게 장황한 구문없이이를 처리 할 수있는 정말 좋은 별칭을 설정할 수 있습니다.

에 다음과 같은 별칭이 있습니다 ~/.gitconfig.

po = "!git push -u origin \"$(git rev-parse --abbrev-ref HEAD)\""

새 브랜치에서 커밋을 한 후 다음 명령을 입력하여 새 브랜치를 푸시 할 수 있습니다.

git po

po? push origin? 여러 번 실행하면 어떻게됩니까?
Arnold Roa

예, 푸시 원점 에서처럼. 여러 번 실행되면 아무 일도 일어나지 않습니다. 또한 git push -f별칭을로 설정 git pf했으므로 원점이 이미 푸시되면 해당 별칭을 사용합니다.
123

djanowski의 의견 참조 , 직접 사용할 수 있습니다HEAD
arhak

3

와 함께 작동하는 별칭을 찾는 사람들에게는 git pull이것이 내가 사용하는 것입니다.

alias up="git branch | awk '/^\\* / { print \$2 }' | xargs -I {} git branch --set-upstream-to=origin/{} {}"

지금 당신이 얻을 때마다 :

$ git pull
There is no tracking information for the current branch.
...

그냥 실행 :

$ up
Branch my_branch set up to track remote branch my_branch from origin.
$ git pull

그리고 너는 잘가


2

git은 다른 브랜치를 다른 "업스트림"리포지토리로 푸시 / 풀할 수있는 멋진 기능을 가지고 있기 때문입니다. 동일한 브랜치에서 밀고 당기는 데 별도의 리포지토리를 사용할 수도 있습니다. 이것은 분산 된 멀티 레벨 흐름을 만들 수 있습니다. Linux 커널과 같은 프로젝트에서 이것이 유용하다는 것을 알 수 있습니다. Git은 원래 해당 프로젝트에서 사용하도록 만들어졌습니다.

결과적으로 지점에서 추적해야 할 리포지토리를 가정하지 않습니다.

반면에 대부분의 사람들은 이런 식으로 git을 사용하지 않으므로 기본 옵션으로 사용하는 것이 좋습니다.

힘내는 일반적으로 꽤 낮은 수준이며 좌절 할 수 있습니다. 그러나 GUI가 있으며 쉘에서 여전히 사용하려는 경우 도우미 스크립트를 작성하는 것이 쉬워야합니다.



0

나는 다시 발견했다 legit이 문제로 인해 되었습니다 (OS X 만 해당). 이제 분기 할 때 사용하는 것은 다음 두 명령입니다.

legit publish [<branch>] 지정된 분기를 원격에 게시합니다. (별명:pub )

legit unpublish <branch> 리모콘에서 지정된 분기를 제거합니다. (별칭 : unp)

SublimeGit 에는 legit기본적 으로 지원 이 제공 되므로 Ctrl-b를 누르는 것처럼 전체 분기 루틴을 쉽게 수행 할 수 있습니다.


0

우리는 phabricator를 사용하고 git을 사용하여 밀어 넣지 않습니다. Linux / mac에서 작동하는 bash 별칭을 만들어야했습니다.

vim ~/.bash_aliases

new_branch() {
    git checkout -b "$1"
    git branch --set-upstream-to=origin/master "$1"
}

저장

source ~/.bash_aliases
new_branch test #instead of git checkout -b test
git pull

0

다음은 모든 푸시에 대해 안전하게 실행되는 git push의 bash 별칭입니다. 첫 번째 푸시에 대한 업스트림 설정과 그 후 일반 푸시를 자동으로 전환합니다.

alias gpu='[[ -z $(git config "branch.$(git symbolic-ref --short HEAD).merge") ]] && git push -u origin $(git symbolic-ref --short HEAD) || git push'

원본 게시물

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.