분기가 지정되지 않은 "git push"의 기본 동작


1366

다음 명령을 사용하여 원격 지점으로 푸시합니다.

git push origin sandbox

내가 말하면

git push origin

다른 지점에서도 변경 사항을 적용합니까, 아니면 현재 지점 만 업데이트합니까? 세 가지가 있습니다. master, productionsandbox.

git push문서는 이것에 대해 명확하지 않기 때문에 이것을 명확히하고 싶습니다.

다음 git push명령은 정확히 어떤 브랜치와 리모트를 업데이트합니까?

git push 
git push origin

origin 위의 리모컨입니다.

나는 git push [remote] [branch]그 지점 만 리모콘으로 밀어 넣을 것이라는 것을 이해합니다 .


일반적으로 diff 도구의 구성 및 새로운 스크립트 git difftool과 관련하여이 다른 SO 질문에 새로운 답변을 추가했습니다. stackoverflow.com/questions/255202/…
VonC

67
나는 한 블로그 게시물 의 놀라운 행동에 대해 git push관심이 될 수도
마크 Longair

1
@Mark : 다른 작업에서는 현재 분기 만 추적 된 업스트림으로 푸시합니다. 좋은.
VonC


help.github.com/articles/pushing-to-re-remote 나 같은 초보자에게 즉각적인 도움을주기 위해이 링크를 여기에두기
MycrofD

답변:


1591

git config에서 push.default를 설정하여 기본 동작을 제어 할 수 있습니다. 에서 힘내-설정 (1) 문서 :

push.default

명령 행에 refspec을 지정하지 않고 원격에 refspec을 구성하지 않았으며 명령 행에 제공된 옵션 중 하나에 의해 refspec을 암시하지 않는 경우 git push가 수행 할 조치를 정의합니다. 가능한 값은 다음과 같습니다.

  • nothing: 아무것도 밀지 마십시오

  • matching: 일치하는 모든 분기를 푸시

    양쪽 끝에 같은 이름을 가진 모든 가지가 일치하는 것으로 간주됩니다.

    이것은 기본값이지만 Git 2.0 이후 simple는 아닙니다 ( 새로운 기본값).

  • upstream: 현재 브랜치를 업스트림 브랜치로 푸시 (업스트림 tracking에서 사용되지 않는 동의어 임)

  • current: 현재 분기를 동일한 이름의 분기로 푸시

  • simple: (Git 1.7.11의 새로운 기능) 업스트림과 같지만 업스트림 브랜치 이름이 로컬 이름과 다른 경우 푸시를 거부합니다.

    이것은 가장 안전한 옵션이며 초보자에게 적합합니다.

    이 모드는 Git 2.0에서 기본값이되었습니다.

단순, 전류 및 업스트림 모드는 다른 분기를 아직 푸시 할 준비가되지 않은 경우에도 작업 완료 후 단일 분기를 푸시하려는 사용자를위한 것입니다.

명령 행 예 :

현재 구성을 보려면

git config --global push.default

새 구성을 설정하려면

git config --global push.default current

11
이것은 v1.6.3의 새로운 기능입니다 : kernel.org/pub/software/scm/git/docs/RelNotes-1.6.3.txt
CB Bailey

8
이 "push.default"는 다중 저장소 작업에있어 가장 큰 것입니다. "추적"으로 설정하면 모두 좋습니다. 분기-설정 업스트림과 결합하여 푸시 앤 풀 방식이 더 편리합니다.
jpswain

13
"트래킹"은 "업스트림"의 더 이상 사용되지 않는 동의어입니다 : kernel.org/pub/software/scm/git/docs/git-config.html
LuckyMalaka

22
Git 1.7.11부터 새로운 simple모드 가 있음을 주목할 가치가 있습니다. 이 모드는 향후 기본값이 될 것입니다. simple처럼 작동 upstream하지만 current분기 이름이 양쪽 끝에서 동일해야합니다.
Kai

9
Git 2.0부터 simple동작이 기본 설정 이라는 점에 주목할 가치가 있습니다.
do0g

209

push를 사용하여 자식의 기본 동작을 설정할 수 있습니다.

git config push.default current

또는 리포지토리가 많고 모두 동일한 것을 원하면

git config --global push.default current

이 설정 의 전류 는 기본적으로 git push 를 할 때 현재 분기 만 푸시

다른 옵션은 다음과 같습니다.

  • 아무것도 : 아무것도 밀지 마십시오
  • matching : 일치하는 모든 분기를 푸시합니다 (기본값).
  • 추적 : 현재 분기를 추적하는 대상으로 푸시
  • 현재 : 현재 분기를 밀어

업데이트-새로운 방법

Git 1.7.11부터 다음을 수행하십시오.

git config --global push.default simple

이것은 현재와 동일한 방식으로 작동하는 새로운 설정이며, 소문에 따라 v 2.0에서 기본으로 설정됩니다.


29
그렇습니다. 나는 당신이 말하는 대답을 읽었지만 그 대답은 무엇을해야하며 어떻게해야하는지 알려줍니다. 그래서 답변을 추가하여 설정에 필요한 모든 정보가 같은 페이지에 있습니다.
Christoffer

3
확인; 투표가 많지 않기 때문에 아무도 답을 볼 수 없기 때문에 해당 게시물에 대한
수정안

현재 브랜치로가는 방법은 무엇입니까? 자식 풀 원점?
Francois

200

git push origin에서 원격 지점을 일치 한 지역 나뭇 가지에 모든 변경 밀어 것 origin뿐만를git push

작품 같은 git push <remote>경우, <remote>(어떤 원격가 현재 브랜치에 대해 구성되어 있지 않은 경우, 또는 기원) 현재 분기를 원격 것입니다.

매뉴얼 페이지 의 예제 섹션에서git-push


2
그렇습니다. 맨 페이지에 이러한 예제가없는 이전 버전의 git (1.6.1.1 Mac OS X)을 실행 중일 수 있습니다.
PlagueHammer 2016 년

아마도 1.6.3.1을 실행하고 있습니다. 그러나 내가 링크 한 사이트에서 찾았습니다.
baudtack 2016 년

2
따라서 모든 로컬 브랜치에 동일한 원격 "원점"이있는 경우 "git push"는 "git push origin"과 정확히 동일하여 원격에 해당 브랜치가있는 로컬 브랜치 만 푸시합니다.
PlagueHammer 2016 년

@Debajit 바로! 그런데 좋은 질문입니다. 나는 항상 git push가 현재 브랜치를 푸시한다고 가정했습니다. 분명히 아닙니다! 알고 아주 좋아요.
baudtack 2016 년

5
이 질문은 오래되었지만 새로운 사람에게는 @docgnome이 맞습니다. 'git push origin'을 실행하면 현재 분기 대신 모든 분기가 푸시됩니다. 'git push -f -v -n origin development'를 사용하여 development라는 브랜치를 강제로 푸시하십시오. -n 플래그를 사용하여 git push 결과를 시뮬레이션하면 영향을받는 분기를 미리 확인할 수 있습니다. 괜찮다면 'git push -f -v origin development'를 실행하십시오. 이것은 유용 할 것입니다 stackoverflow.com/questions/3741136/git-push-f-vs
Dylan Valade

54

방금 코드를 브랜치에 커밋하고 다음과 같이 github에 푸시했습니다.

git branch SimonLowMemoryExperiments
git checkout SimonLowMemoryExperiments
git add .
git commit -a -m "Lots of experimentation with identifying the memory problems"
git push origin SimonLowMemoryExperiments

3
git commit -am "..."`에 대한 커밋을 정리할 수 있습니다.
James Harrington

17
이 답변은 질문과 관련이 있습니까 ?? :?
Asim KT

26

Git Push : Git Push 에 대한 매우 유용하고 유용한 정보는 다음과 같습니다 .

git push의 가장 일반적인 용도는 로컬 변경 사항을 공개 업스트림 저장소로 푸시하는 것입니다. 업스트림이 이름이 "origin"인 원격 (저장소가 복제 인 경우 기본 원격 이름)이고 업데이트 할 지점이 "master"(기본 지점 이름)라고 가정하면 다음과 같이 수행됩니다.git push origin master

git push origin 모든 로컬 브랜치에서 일치하는 브랜치로 원점을 변경합니다.

git push origin master 로컬 마스터 브랜치에서 원격 마스터 브랜치로 변경 사항을 푸시합니다.

git push origin master:staging 로컬 마스터 분기에서 원격 준비 분기 (있는 경우)로 변경 사항을 푸시합니다.


git push origin branch_name어떤 이유로 든 branch_name분기뿐만 아니라 다른 로컬 분기 (git 버전 1.9.1)도 밀어 넣습니다 .
mrgloom

git push origin master:staging멋진 숨겨진 보석입니다!
Shakeel

19

(2012 년 3 월)
주의 : 기본 " matching"정책이 곧 변경 될 수 있습니다
(git1.7.10 + 이후에 때때로)
:

"을 참조하십시오 토론하십시오 : 무엇을" "당신이 밀어 무슨 말을하지 않을 때 어떻게해야합니까? 자식 푸시 "

현재 설정 (즉, push.default=matching)에서 git push인수 없이는 같은 이름으로 로컬 및 원격으로 존재하는 모든 분기를 푸시합니다 .
이것은 일반적으로 개발자가 자신의 공용 저장소로 푸시 할 때 적합하지만 공유 저장소를 사용할 때 위험하지 않으면 혼란 스러울 수 있습니다.

제안은 기본값을 ' upstream' 으로 바꾸는 것입니다. 즉, 현재 분기 만 푸시하고 git pull이 가져올 분기로 푸시합니다.
다른 후보는 ' current'입니다. 현재 분기 만 동일한 이름의 원격 분기로 푸시합니다.

지금까지 논의 된 내용은이 스레드에서 볼 수 있습니다.

http://thread.gmane.org/gmane.comp.version-control.git/192547/focus=192694

이전의 관련 토론은 다음과 같습니다.

토론에 참여하려면 git@vger.kernel.org로 메시지를 보내십시오.


18

나는 이것을 .gitconfig aliases 섹션에 넣고 작동 방식을 좋아합니다.

pub = "!f() { git push -u ${1:-origin} `git symbolic-ref HEAD`; }; f"

현재 브랜치를로 시작 git pub하거나 다른 리포지토리를로 푸시합니다 git pub repo-name. 맛좋은.


4
그것은 좋지만 불행히도 지점이 다른 저장소에서 동일한 이름을 가지고 있다고 가정합니다. git push -u --repo="origin" $1;대신 시도하십시오 . 다른 리포지토리로 푸시하는 경우를 제외하고는 브랜치 이름이 다른 리포지토리에서 사용하는 이름이 아니라 다른 리포지토리에서 사용하는 이름이됩니다.
Casebash

고마워! 푸시하기 전에 추적 상태를 확인하는 더 완전한 버전을 만들고 싶습니다. 그러나 repos 사이에 다른 브랜치 이름이 거의 없기 때문에 지금은 내 것을 고수 할 것입니다.
Mat Schaffer


8

git push는 모든 로컬 브랜치를 원격 서버로 푸시하려고 시도합니다. 원치 않는 것 같습니다. 이 문제를 해결하기 위해 몇 가지 편의 설정이 있습니다.

별칭 "gpull"및 "gpush"는 적절하게 :

내 ~ / .bash_profile에서

get_git_branch() {
  echo `git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/'`
}
alias gpull='git pull origin `get_git_branch`'
alias gpush='git push origin `get_git_branch`'

따라서 "gpush"또는 "gpull"을 실행하면 "현재 켜져있는"분기 만 푸시됩니다.


3
gpush의 동작을 항상 원한다면 git-push 매뉴얼 페이지의 예제 섹션에서 언급 한 것처럼 remote.origin.push = HEAD (예 : "git config remote.origin.push HEAD")를 설정할 수도 있습니다.
Trevor Robinson

5
"Brian L"의 위 게시물을 보면이 작업이 필요하지 않습니다.
jpswain

1
그것은 equv가 없기 때문입니다. 끌어 오기 기본값.
SamGoody

8

.gitconfig예를 들어의 기본 동작을 변경할 수 있습니다 .

[push]
  default = current

현재 설정을 확인하려면 다음을 실행하십시오.

git config --global --get push.default

3

별칭을 사용하는 대신 git-XXX 스크립트를 생성하여 소스 제어를보다 쉽게 ​​소스 제어 할 수 있습니다 (우리 개발자는 모두이 유형의 경로에 대해 특정 소스 제어 디렉토리를 가지고 있습니다).

이 스크립트 ( git-setpush)는 value의 구성 값을 remote.origin.push현재 분기 만 푸시하는 값으로 설정합니다 .

#!/bin/bash -eu

CURRENT_BRANCH=$(git branch | grep '^\*' | cut -d" " -f2)
NEW_PUSH_REF=HEAD:refs/for/$CURRENT_BRANCH

echo "setting remote.origin.push to $NEW_PUSH_REF"
git config remote.origin.push $NEW_PUSH_REF

참고로을 사용 Gerrit하면 대상이refs/for/XXX 이 검토 분기로 푸시되도록 됩니다. 또한 origin이 원격 이름이라고 가정합니다.

와 지점을 체크 아웃 한 후 호출

git checkout your-branch
git setpush

분명히 체크 아웃을 수행하도록 조정할 수도 있지만 스크립트를 사용하여 한 가지 작업을 수행하고 잘 수행하는 것이 좋습니다.


gerrit 사용을 위해 remote.origin.push를 설정하는 것이 좋습니다. 내 로컬 기능 분기 feature/fix_fubar는 모두 masteror 와 같은보다 일반적인 업스트림 분기를 develop가리 키므로 잘못된 업스트림을 가리 킵니다. Gerrit 제어 저장소의 로컬 흐름은 어떻습니까?
spazm 2016 년

gerrit에 "대상"분기가 하나만 있으면 간단히 시도하십시오 git config remote.origin.push HEAD:refs/for/master.
fracz

2

이러한 작업을 자동화하기 위해 .bashrc 파일에 다음 기능을 추가했습니다. git push / git pull + 현재 브랜치 이름을 수행합니다.

function gpush()
{
  if [[ "x$1" == "x-h" ]]; then
    cat <<EOF
Usage: gpush
git: for current branch: push changes to remote branch;
EOF
  else
    set -x
    local bname=`git rev-parse --abbrev-ref --symbolic-full-name @{u} | sed -e "s#/# #"`
    git push ${bname}
    set +x
  fi
}

function gpull()
{
  if [[ "x$1" == "x-h" ]]; then
    cat <<EOF
Usage: gpull
git: for current branch: pull changes from
EOF
  else
    set -x
    local bname=`git rev-parse --abbrev-ref --symbolic-full-name @{u} | sed -e "s#/# #"`
    git pull ${bname}
    set +x
  fi
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.