“u”는 정확히 무엇을합니까? “git push -u origin master”대“git push origin master”


334

나는 그것을 이해하려는 최선의 시도에도 불구하고 git을 사용하는 것이 끔찍합니다.

에서 kernel.org 에 대한 git push:

-유

-업스트림

최신이거나 성공적으로 푸시 된 모든 브랜치에 대해 인수가없는 git-pull (1) 및 기타 명령에서 사용하는 업스트림 (추적) 참조를 추가하십시오. 자세한 내용 branch.<name>.merge은 git-config (1)를 참조하십시오 .

여기 branch.<name>.merge에서 git config:

branch.<name>.merge

branch.<name>.remote지정된 분기에 대한 업스트림 분기를와 함께 정의합니다 . git fetch / git pull에게 병합 할 분기를 알려주고 git push에도 영향을 줄 수 있습니다 (push.default 참조). branch에있을 때 <name>, git fetch에게 FETCH_HEAD에서 병합을 위해 표시 될 기본 참조 스펙을 알려줍니다. 이 값은 참조 스펙의 원격 부분처럼 처리되며로 지정된 원격에서 가져온 참조와 일치해야합니다 "branch.<name>.remote". 병합 정보는 병합 풀의 기본 분기를 조회하기 위해 git pull (처음에는 git fetch를 호출 함)에 의해 사용됩니다. 이 옵션을 사용하지 않으면 git pull은 기본적으로 가져온 첫 번째 refspec을 병합합니다. 문어 병합을 얻으려면 여러 값을 지정하십시오. <name>로컬 리포지토리의 다른 분기에서 병합되도록 git pull을 설정하려는 경우branch.<name>.merge원하는 분기로 이동하고 특수 설정을 사용하십시오. 에 대한 (기간) branch.<name>.remote.

github을 사용하여 원격 저장소를 성공적으로 설정하고 첫 번째 커밋을 성공적으로 푸시했습니다.

git push -u origin master

그런 다음 무의식적으로 두 번째 커밋을 다음을 사용하여 원격 저장소에 푸시했습니다.

git commit -m '[...]'

그러나 origin에서에서 다시 푸시해야한다고 잘못 생각하여 master실행했습니다.

# note: no -u
git push origin master

그게 무슨 짓이야? 전혀 영향을 미치지 않는 것 같습니다. "취소"했습니까 git push -u origin master?


44
I'm apparently terrible at using git, despite my best attempts to understand it.-누군가가 나를 그렇게 잘 재창조 한 적이 없어요.
dgo

답변:


335

핵심은 "인수가없는 git-pull"입니다. git pull소스 리모트 또는 브랜치를 지정하지 않고 브랜치에서 작업을 수행 할 때 , git은 branch.<name>.merge설정을보고 어디에서 가져올 지 알 수 있습니다. git push -u이 정보를 추진하려는 지점에 설정합니다.

차이점을 확인하려면 새로운 빈 분기를 사용하십시오.

$ git checkout -b test

먼저, 우리는 -u:

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

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

See git-config(1) for details.

이제 우리가 추가하면 -u:

$ git push -u origin test
Branch test set up to track remote branch test from origin.
Everything up-to-date
$ git pull
Already up-to-date.

git pull원격 또는 지점을 지정하지 않고 예상대로 작동 하도록 추적 정보가 설정되었습니다 .

업데이트 : 보너스 팁 :

  • Mark가 주석에서 언급했듯이이 git pull설정 외에도 기본 동작 인에 영향을줍니다 git push. -u추적하려는 원격 브랜치를 캡처 하는 습관을들이는 경우 push.default구성 값을로 설정하는 것이 좋습니다 upstream.
  • git push -u <remote> HEAD현재 지점을 같은 이름의 지점으로 푸시합니다 <remote>(그리고 추적을 설정하여 git push그 후에 할 수 있습니다 ).

4
git push <remote> <branch>일을 모호하게 만듭니다 . 원격 또는 브랜치 git을 끄면 브랜치 구성 설정으로 돌아갑니다 git push -u.
dahlbyk

2
@dahlbyk 나는 당신을 대답으로 표시했지만 그 의견은 다소 혼란 스럽습니다. 당신의 대답에, 당신은 자식이 있음을 증명 후 혼동 git push origin test(하지 않는다 -u). 그런 다음 모호성 을 git push -u origin test 제거 한다는 것을 보여주었습니다 . 오타가 있습니까, 아니면 다시 조밀합니까?
ClosureCowboy

1
우리는 서로 과거를 이야기하고 있다고 생각합니다. :) 내가 git push <remote> <branch>모호하지 않다고 말하면 , 상대 git push구성은 분기 구성에 의존 한다는 것을 의미합니다 . 마찬가지로 git pull <remote> <branch>모호하지 않으며 git pull분기 구성에 의존합니다. 당신이 함께 추진하면 -u모두, git push그리고 git pull예상대로 작동합니다.
dahlbyk

10
@dahlbyk : 당신의 대답은 괜찮지 만, 당신이 위의 의견은 반복에 일반적인 오해를 에 대해 git push- 당신은 설정하지 않는 한 push.default자신을, git push오직 원격 갱신을하지 않는 원격 지사에 밀어 결정하기 위해 상류 지점 구성을 사용합니다.
Mark Longair

1
git의 모범 사례는 git push origin master다른 쪽 IE와 동일합니다. git pull origin master.. 따라서 분기 변경이 있다고 가정 git push origin branch_name하면 다른 쪽 IE와 동일 할 수 있습니다 . git pull origin branch_name
Arpit Vaishnav

87
git push -u origin master

… 와 같다:

git push origin master ; git branch --set-upstream master origin/master

당신이 잊었다면 마지막 진술을하십시오 -u!

또는 당신은 그것을 강요 할 수 있습니다 :

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

만약 명령이 당신을 위해한다면, 존재하지 않는 브랜치를 입력했거나 입력하지 않은 것과 같은 실수를 선택할 것입니다 git remote add; 그게 당신이 원하는 것일 수도 있습니다. :)


1
BTW master는 단지 예입니다 :)
sabgenton

Ok 두 번째 비트는 이제 최신 버전에서 감가 상각됩니다 : git branch master -u origin/masterdetails @ stackoverflow.com/a/2286030/790359
sabgenton

2
-u옵션 사용을 잊어 버린 경우 git push -u즉시 입력 해도됩니다.
zeekvfu

1
최신 버전의 git은 --setup-upstream더 이상 사용되지 않을 것임을 나타냅니다 . The --set-upstream flag is deprecated and will be removed. Consider using --track or --set-upstream-to
Bill Hoag

--set-upstream 은 더 이상 사용되지 않으며 이제 작동합니다.git branch --set-upstream-to=origin/master master
Alberto Perez

43

더 간단한 용어로 :

기술적으로이 -u플래그는 푸시하려는 업스트림 서버에 추적 참조를 추가합니다.

여기서 중요한 것은 git pull더 이상 인수를 제공하지 않고도 할 수 있다는 것 입니다. 예를 들어, 일단을 수행하면 git push -u origin master나중에 호출 할 수 git pull있으며 git은 실제로 의미한다는 것을 알 수 있습니다 git pull origin master.

그렇지 않으면 전체 명령을 입력해야합니다.


1
따라서 모든 다음 풀로 -u플래그를 설정 orgin master하면 참조 할 것입니다. 그리고 git pull동작 을 변경하려면 실행해야 git push -u origin some_other_branch하며 git pull이제는 some_other_branch? 감사합니다!
Toma Tomov

1
"git push origin master"대신 "git push"를 사용할 수 있습니까?
cegprakash

네, @cegprakash 할 수 있습니다. 그러나, 당신은 처음에git push -u origin master
Adépòjù Olúwáségun을

-11

Github를 밀고 당기는 데 필요한 모든 git bash 명령 :

git status 
git pull
git add filefullpath

git commit -m "comments for checkin file" 
git push origin branch/master
git remote -v 
git log -2 

파일을 편집하려면 다음을 수행하십시오.

edit filename.* 

모든 브랜치와 커밋을 보려면 :

git show-branch

4
나는 당신이 질문의 범위 밖에서 대답했다고 생각합니다.
Adépòjù Olúwáségun
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.