새 분기를 명시 적으로 푸시해야하는 이유는 무엇입니까?


180

나는 새롭고 git연습 중입니다. 로컬 지점을 만들었지 만 지점을 만들 때 git push리포지토리에 업로드되지 않은 것을 보았습니다 . 나는 실제로해야했다 : git push -u origin --all.
왜 이런거야? 지사가 기본적으로 새로운 변경 사항을 적용하지 않습니까? 두 번째 명령을 실행해야하는 이유는 무엇입니까?


15
이 설정은 구성 가능합니다 (설정 push.default참조 man git-config). 당신이 할 경우 git config --add push.default current, 다음 git push필요한 경우 자동으로 원격 REPO에 지점을 작성합니다. 이것이 기본값이 아닌 이유는 답변에 설명되어 있습니다.
sleske 2016 년

@sleske 동의합니다. 다른 정책 ' currentupstream'에 대해서는 이전 답변 stackoverflow.com/a/13751847/6309를 참조하십시오 .
VonC 2016 년

왜 대답을 받아들이지 않습니까?
laike9m

답변:


224

실제 이유는 새 리포지토리 (git init)에 분기가 없습니다 (아니오 master, 분기가 전혀 없음 , 분기 없음)

따라서 처음으로 업스트림 리포지토리 (일반적으로 베어 리포지토리) 로 푸시 할 때 해당 업스트림 리포지토리에는 동일한 이름의 분기가 없습니다.

과:

두 경우 모두, 업스트림 빈 저장소에는 분기가 없으므로

  • 이름이 일치하는 지점이 아직 없습니다
  • 업스트림 브랜치가 전혀 없습니다 (같은 이름의 유무에 관계없이! 추적 여부)

즉, 로컬 푸시는 전혀 모른다는 것을 의미합니다 .

  • 어디로 밀어야
  • 푸시 대상 (원격 추적 분기로 기록되거나 동일한 이름을 가진 업스트림 분기를 찾을 수 없으므로)

따라서 최소한 다음을 수행해야합니다.

git push origin master

그러나 당신이 그렇게하면, 당신은 :

  • master업스트림 (현재 비어 있지 않은 저장소)에 업스트림 브랜치를 만듭니다 .
  • 로컬 분기 ' '를 업스트림 ( ) ' '(업스트림 분기) 으로 푸시해야 한다고 기록 하지 않습니다 .masteroriginmaster

그렇기 때문에 첫 번째 푸시에서 다음을 수행하는 것이 좋습니다.

git push -u origin master

이것은 원격 추적 브랜치origin/master 로 기록 되고 다음 푸시가 자동으로 푸시 되도록 합니다.masterorigin/master

git checkout master
git push

그리고 그것은 푸시 정책 ' current'또는 ' upstream'에서도 작동합니다.
각각의 경우, initial 이후 git push -u origin master에 간단한 git push로 마스터를 오른쪽 업스트림 브랜치로 계속 밀어 넣기에 충분합니다.


2
이 시점 이후, 다음 git push지점은 이미 지점이 존재할 것으로 예상합니까?
Cratylus

2
예. 해당 분기에 대한 모든 업데이트를 업스트림 저장소로 푸시합니다.
RyPeck 2016 년

@Cratylus yes, 새로운 기본 푸시 정책 ' simple' 때문에 : 업스트림 브랜치의 이름이 로컬 업스트림 브랜치와 동일한 경우 기록 된 업스트림 브랜치로 푸시합니다 . 간단한 git push것만으로 충분합니다.
VonC 2016 년

1
@ButtleButkus 감사합니다. 링크를 복원했습니다.
VonC

3
새로운 분기 'new_branch'에 대한 질문자의 일반적인 경우에는 git push --set-upstream origin new_branch또는 git push -u origin new_branch짧게 사용합니다. -all질문자가 모든 지점을 포함하여 특정 새로운 지점의 이름을 지정 우회 사용되는. 이것은 그의 대답에서 + Klas Mellbourn이 다룹니다.
Paul Masri-Stone

106

당신은하지 않습니다 아래 참조

로켓을 달에 발사하려고하지 않기 때문에이 '기능'이 다소 성가신 것을 발견했습니다. 당신도 아마 그렇지 않으면 당신은 여기 없을 것입니다!

수정 사항은 다음과 같습니다. 분기가 원점에 있는지 여부에 관계없이 현재 분기를 암시 적으로 푸시하려면이 명령을 한 번만 실행하면 어디서나 다시 할 필요가 없습니다 .

git config --global push.default current

따라서 다음과 같이 분기를 만들면

git checkout -b my-new-branch

그런 다음 커밋을 한 다음

git push -u

해당 지점에있는 원산지를 가져오고 존재하지 않는 경우 해당 지점을 만듭니다.

나중에 분기에서 끌어 올 경우 -u 비트가 연결되어 있는지 확인하십시오. 나중에 분기를 당길 계획이 없다면 (또는 다른 라이너로 괜찮다면) -u는 필요하지 않습니다.


3
내가 이것을 할 때, git pull을하면 즉시 두 가지가 연결되지 않습니다. :(
Alisso

이것이 내 문제를 해결 한 유일한 대답입니다.
Raymond Chenon

2
그들을 연결하려면git push -u
Ben Creasy

감사! 이 답변은 빠르고 더러운 솔루션으로 받아 들여 져야합니다. OP의 의도와 가장 가깝습니다.
youngrrrr

3
> 달에 로켓을 발사하려고하지 않습니다. -- 예.
VCavallo

39

의 출력 git push새로운 지점을 밀어 때

> git checkout -b new_branch
Switched to a new branch 'new_branch'
> git push
fatal: The current branch new_branch has no upstream branch.
To push the current branch and set the remote as upstream, use

    git push --set-upstream origin new_branch

간단히 git push말하면 현재 로컬 지점에서 추적중인 원격 지점이 이미 있다고 가정합니다. 그러한 원격 브랜치가 존재하지 않고이를 작성하려면 -u(짧은 형식 --set-upstream) 플래그 를 사용하여 지정해야합니다 .

왜 이럴까요? 구현자는 원격에서 분기를 만드는 것이 실수로하기가 어려워 야하는 주요 조치라고 생각합니다. git push항상 당신이하는 일입니다.

"지사에 기본적으로 새로운 변경 사항이 적용되지 않습니까?" Git의 "변경"은 커밋이라고 말합니다. 브랜치는 커밋에 대한 포인터입니다. 나에게 푸시를 다른 저장소로 커밋하는 것으로 생각하는 것이 더 합리적입니다. 어떤 커밋이 푸시되는지는 어떤 브랜치에 있는지와 해당 브랜치와 리모트의 브랜치 간의 추적 관계에 따라 결정됩니다.

Pro Git 책Remote Branches 장 에서 지점 추적에 대한 자세한 내용을 읽을 수 있습니다 .


나는 얻지 못했지만 fatal지점에서 이미 커밋을 수행했습니다.
Cratylus 2016 년

@Cratylus 아니오 그것은 중요하지 않습니다. 커밋은 저장소에서 안전 git push -u origin하고 원격 저장소로 복사되었습니다.
Klas Mellbourn

아니요, 답변에 fatal언급 한 것과 같은 메시지를 얻지 못했다는 것을 의미합니다. 이 차이는 내가 지점에 무언가를 커밋 한 사실에 달려 있습니까?
Cratylus 2016 년

@Cratylus 왜 fatal메시지 를받지 못한 지 모르겠습니다 . 차이점은 사용중인 git 구현에 정확히 달려 있다고 생각합니다. 내 출력은 Windows 8에서 실행되는 1.8.1.msysgit.1입니다.
Klas

나는 같은 버전이지만 Vista에 있습니다
Cratylus

4

나는 원래 개발자들에 의해 이렇게 빨리 근거를 찾을 수 없었지만, 몇 년간의 Git 경험을 바탕으로 교육받은 추측을 줄 수 있습니다.

아니요, 모든 지점이 외부 세계로 밀려나는 것은 아닙니다. 개인 실험 일 수 있습니다.

또한, git push모든 지점을 어디로 보내야합니까? Git은 여러 리모컨으로 작동 할 수 있으며 각각에 다른 분기 세트를 원할 수 있습니다. 예를 들어 중앙 프로젝트 GitHub 리포지토리에는 릴리스 브랜치가있을 수 있습니다. GitHub 포크는 검토를 위해 토픽 브랜치를 가질 수 있습니다. 로컬 Git 서버에는 로컬 구성이 포함 된 분기가있을 수 있습니다. git push현재 브랜치가 추적하는 모든 브랜치를 원격으로 푸시 하면 이런 종류의 구성표를 쉽게 정리할 수 있습니다.


1) It might represent a private experiment.Ok 그러나 큰 문제는 무엇입니까? 모든 사람이 일하고있는 "주"지점 master은 영향을받지 않습니다. 소스 코드를 숨기려고하지 않는 한 2) git push, without a remote, pushes to the current branch's remote나는 여기서 당신을 잃었습니다 :(
Cratylus

@Cratylus : 1) 모든 분기 광고 라이브러리를 가진 수십 명의 개발자가있는 프로젝트에서 매우 혼란스러운 repos를 얻게 될 것입니다. 나는 그러한 프로젝트를 수행 git fetch하고 있으며 매번 수백 개의 반 작업 지점을 원하지 않습니다 . 2) git push의 기본 동작을 말합니다. 현재 분기가 추적중인 경우 원격으로 푸시합니다.
Fred Foo

3

HEAD는 현재 분기의 약자이므로 git push -u origin HEAD가 작동합니다. 이제 별칭을 사용할 때 마다이 입력을 피하기 위해

git config --global alias.pp 'push -u origin HEAD'

이 후 git -b branch를 통해 생성 된 분기를 푸시 할 때마다 다음을 사용하여 푸시 할 수 있습니다.

자식 PP

이것이 누군가의 시간을 절약하기를 바랍니다!


2

처음 확인시

1 단계 : git remote -v
// git initialize가 발견되면 2 단계를 제거하거나 건너 뜁니다.

2 단계 : git remote rm origin
// 그런 다음 전자 메일 주소를 전 세계적으로 구성하십시오

3 단계 : git config --global user.email "youremail@example.com"

4 단계 : git initial

5 단계 : git commit -m "Initial Project"
// 프로젝트 저장소를 이미 추가 한 경우 6 단계를 건너 뜁니다.

6 단계 : git remote add origin %repo link from bitbucket.org%

7 단계 : git push -u origin master


1

방금이 문제에 대한 추가 순열을 경험했습니다.

feat/XYZ-1234-some-descriptionJira 문제 1234로 작업하고 있었기 때문에 지사를지었습니다. 작업하는 동안 더 작은 작업을 추적하기 위해 새로운 Jira 문제를 만들었습니다. 에:

git push -u origin feat/XYZ-5678-a-different-description # failed

이것은이 SO 스레드에서 논의되는 오류를 주었다. 그러나 현재 지점과 다른 지점 이름 으로 푸시하려고했기 때문에 내 문제는 여기에 설명 된 것과 다릅니다. 푸시하기 전에 로컬 브랜치의 이름을 바 꾸었습니다.

git branch -m feat/XYZ-1234-some-description feat/XYZ-5678-a-different-description
git push -u origin feat/XYZ-5678-a-different-description # now works

조금 더 읽은 후에는 현재 분기 이름으로 또는 적절한 경우 src에를 설정할 수 있음을 깨달았습니다 .git pushHEAD

git push -u origin feat/XYZ-1234-some-description:feat/XYZ-5678-a-different-description # also works

-1

새 지점에서 처음으로 새 변경 사항을 푸시 할 수 있습니다. 그리고 아래 오류가 발생합니다.

*git push -f
fatal: The current branch Coding_Preparation has no upstream branch.

현재 분기를 누르고 리모콘을 업스트림으로 설정하려면

git push -u origin new_branch_name


** Successful Result:** 
 git push -u origin Coding_Preparation
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 4 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 599 bytes | 599.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
remote:
remote: Create a pull request for 'Coding_Preparation' on GitHub by visiting: ...
 * [new branch]      Coding_Preparation -> Coding_Preparation
Branch 'Coding_Preparation' set up to track remote branch 'Coding_Preparation' from 'origin'.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.