git push.default = current와 push.default = upstream의 차이점은 무엇입니까?


89

git-config의 man 페이지에는 push.default에 대한 다음 옵션이 나열되어 있습니다.

nothing - do not push anything.
matching - push all matching branches. All branches having the same name in both ends are considered to be matching. This is the default.
upstream - push the current branch to its upstream branch.
tracking - deprecated synonym for upstream.
current - push the current branch to a branch of the same name.

대부분의 경우 업스트림 분기는 일반적으로 동일한 이름을 가지며 동일한 이름의 분기 ( "현재" )는 일반적으로 (또는 항상 정의에 따라?) 업스트림입니다. 그렇다면 차이점은 무엇입니까?

UPDATE : 자식-설정에 대한 매뉴얼 페이지 구별이 만든 있도록, (사람이 기대하는 것처럼) 업데이트되었습니다 지금 많은 명확하게 할 수있다.


2
개발자들에게는 이것들을 다르게하는 것이 실제로 짜증나 기 때문에 'simple'이 소개되고 git-push의 기본 bahavior가 될 것입니다. 실제로는 등장있어 자식 1.7.11
xhlwill

14
최근 git 경고 push.default is unset; its implicit value is changing in Git 2.0matchingvs 에 대한 자세한 내용 simplestackoverflow.com/questions/13148066/…을
Nate

iconoclaust : 편집 내용이 질문의 무결성을 전혀 변경하지 않았다고 생각하며 오래된 정보는 수정해야합니다. 사용자가 링크를 클릭하는 추가 작업을하는 이유는 무엇입니까?
Flimm 2011

답변:


72

질문의 차이점을 요약했습니다. 구성된 업스트림 분기로 upstream푸시 하고 업스트림 분기의 이름이 현재 로컬 분기 와 동일하다고 가정하고 해당 특정 이름으로 푸시합니다. 실제로 로컬 브랜치의 업스트림 추적 브랜치가 로컬 브랜치 자체와 이름이 같다고 가정 할 이유가 없습니다.current

예를 들어, 여러 저장소에서 또는 여러 공유 개발자 리모컨에서 작동하는 경우, 당신은 종종 같은 지점의 다른 포크, 추적 끝 allen-master또는 susan-master트랙 둘, master각각 알렌과 수잔의 REPOS에 지점을. 이 경우 current해당 분기 이름이 원격에 존재하지 않기 때문에는 잘못된 설정입니다. upstream그러나 잘 작동합니다.

보다 실용적인 예는 a developmentproduction저장소를 모두 추적하는 것 입니다. 워크 플로는 각각에 대해 다른 메인 라인 분기를 사용할 수 있지만 혼란 스러울 수 있습니다. 코드 통합 자이고 두 저장소의 master브랜치를 개별적 으로 추적하려고한다고 가정합니다 .

git checkout -b production --track production/master
git checkout -b development --track development/master

이제 각각의 리포지토리를 추적하는 두 개의 분기가 있으며 둘 다 master명명 규칙을 전혀 사용하지 않습니다 . 브랜치 이름에 대해서는 약간의 혼동이 없습니다. 추적하는 항목을 명시 적으로 설명합니다. 그럼에도 불구하고 push.default = current원격에는 development또는 production분기 가 포함되어 있지 않으므로 의미가 없습니다 .


6
upstream선호하는 경우 두 가지 예를 제공 current합니다. 나는 그것이 매우 명백하다고 생각하기 때문에 오히려 반대 사례에 대한 예를 제시해야합니다.
AndreKR 2013-08-02

1
@AndreKR AFAIK currentgit config특히 어딘가에서 복제 한 경우 에는 별로 필요하지 않기 때문에 새로운 개발자 인 경우 더 좋습니다 . current에 밀어 또는 생성이 - 다음 - 푸시 - 투 원격 REPO에 동측 지점 당신을위한 반면에 그들은 존재하지 않는 경우에 simple동일 이름의 브랜치가 이미 존재하지 않는 경우 철저하게이 작업을 거부합니다. upstream이 경우 업스트림 분기가 명시 적으로 설정되거나 Yawar 의 답변에 언급 된대로 설정되지 않는 한 동일한 동작이 있습니다.
드물게 빈곤 '모니카 어디 없다'

6

current 현재 분기를 원격 저장소의 동일한 이름을 가진 분기로 푸시합니다.

upstream 현재 분기를 업스트림 분기로 푸시합니다.

업스트림 브랜치는 현재 브랜치의 업스트림으로 명시 적 또는 암시 적으로 정의 된 브랜치입니다. 즉, 기본적으로 푸시 및 풀이이 분기와 동기화됩니다. 업스트림 분기는 현재 분기 자체와 동일한 저장소에있을 수 있습니다. 로컬 기능 (주제) 브랜치 에서 업스트림으로 로컬 마스터 브랜치를 설정하는 것과 같은 흥미로운 작업을 수행 할 수 있습니다 .

암시 적 업스트림 설정은 branch.autosetupmerge구성 값을 통해 수행됩니다 . git config도움말 페이지 에서 설명서를 찾을 수 있습니다 . 명시 적 업스트림 설정은 명령에 대한 -u옵션으로 수행됩니다 git branch. 자세한 내용은 도움말 페이지를 참조하십시오.


나는 branch.autoSetupMerge같은 생각이 -u/ 라고 생각 하지 않는다 --set-upstream. 적어도 문서 에서 git push -u가 기본적 으로 호출 된 것처럼 작동하도록한다는 것을 암시하는 것은 아무것도 보지 못합니다 . 당신이 의미하는 바를 명확히 할 수 있습니까?
waldyrious

@waldyrious 확실히; 원격 추적 분기를 체크 아웃 할 때 branch.autoSetupMerge구성은 기본적으로 새 로컬 분기를 만들고 해당 업스트림을 원격 추적 분기로 설정합니다. 이 암시 적 작업은 약간 다른 구문으로 동일한 작업을 수행하는 -t( --track) 또는 -u ...( --set-upstream-to=...) 플래그 를 사용하여 명시 적으로 수행 할 수 있습니다 .
야와 르

1
이 질문에 대해이기 때문에 - 여기 무슨 일이 있었는지보고 git push, 나는 (실수로) 당신이에 대해 말하기 한 가정 -u의 옵션 git push오히려보다, -u의 옵션 git branch. 혼란
스러워서
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.