programing

왜 항상 '--set-upstream'을 해야 하나요?

telecom 2023. 4. 15. 08:22
반응형

왜 항상 '--set-upstream'을 해야 하나요?

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_branchmy_branch이것을 디폴트 동작으로 하려면 어떻게 해야 합니까?

Git v2.37.1 이후

상기 버전 이상을 사용하고 있는 경우는, 다음의 새로운 설정 엔트리를 사용해 리모트트래킹을 자동적으로 설정할 수 있습니다.

git config --global push.autoSetupRemote true

후, ,을 할 때, 신을 할 때git push이치노 git push -u origin my_branch


의 하는 것에.git branch --set-upstream 1 다음 작업을 수행합니다.

git push -u origin my_branch

처음 그 나뭇가지를 밀었을 때 말이야또는 같은 이름의 분기에서 현재 분기로 푸시하려면(에일리어스 취급):

git push -u origin HEAD

사용하시면 .-u지점과 됩니다.origin git branch --set-upstream

개인적으로는 지점과 리모트 지점 간의 관련성을 명시적으로 설정하는 것이 좋다고 생각합니다.규칙이 및 에 대해 다르다는 것은 유감스러운 일입니다.


1 우습게 들릴지 모르지만, 디폴트인 것을 상정하고, 현재의 브랜치를 지정하는 것을 자주 잊어 버립니다.그렇지 않고, 결과가 매우 혼란스럽습니다.

업데이트 2012-10-11: 틀리기 쉬운 것은 저뿐만이 아닌 것 같습니다!Git 1.8.0이 더 명백한 것을 도입했다고 지적해준 VonC에게 감사한다.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 릴리즈 노트에 설명되어 있습니다.

라고 말하는 .git branch --set-upstream origin/master 브랜치 Git을 origin/master이치노이것은 사용자가 의도한 것이 아닐 가능성이 매우 높습니다.되지 않습니다. 추가된 옵션을 합니다.--set-upstream-to으로)-u옵션을 선택합니다.

입력 횟수를 줄이면 이 작업을 수행할 수 있습니다.먼저 푸시 방식을 변경합니다.

git config --global push.default current

해서 해 볼 수 있습니다.origin my_branch이치노

git push -u

둘 다 같은 이름의 리모트브런치를 생성하여 추적합니다.

이게 내가 가장 자주 쓰는 거지

$ 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.
...

또한 단말기에 욕설을 입력하는 것도 재미있어요.

간단하게 할 수 있습니다.

git checkout -b my-branch origin/whatever

★★★★★★★★★★★★★★★를 설정하면,branch.autosetupmerge ★★★★★★★★★★★★★★★★★」branch.autosetuprebase always는 ( ( ) 。truemy-branch으로 추적됩니다.origin/whatever.

것은, 을 참조하십시오.git help config.

git config --global push.autoSetupRemote true

OP는 다음과 같이 질문합니다.

다음과 같은 기능을 사용할 수 있다는 것을 배웠습니다.

git branch --set-upstream my_branch origin/my_branch

하지만 왜 내가 만드는 모든 브랜치에 대해 이 작업을 수행해야 합니까?

업스트림을 항상 설정할 필요는 없습니다.
11번입니다.

Git 2.37(Q3 2022)에서는 a가 대신 처리해 드립니다.

Tao Klerks()TaoK의 commit 05d5775, commit 8a649be, commit bdaf1df (2022년 4월 29일)를 참조하십시오.
(Junio C Hamano에 의해 병합 ---- 커밋 f49c478, 2022년 5월 26일)

push: 새로운 구성 옵션 "push.autoSetupRemote " " " 를 합니다.simple

서명자:타오 클락스

에서는. in. in. in. in. in. in.simple일원화된 워크플로우에서는 리모트 트래킹 브랜치명이 로컬 브랜치명과 일치해야 합니다.
「」는 브랜치의 리모트버전 또는 리모트브런치로의 변경(git pull(man)같은 사용자가 다른 장소에 있거나 다른 사용자가 변경한 것)을 푸시 합니다).git push(man)

는 '이러다'에 되고 있습니다.push.default 옵션 default"simple또, 새로운 트래킹브런치명에 , 「」는 「Matching Branch Name」이 됩니다.branch.autosetupmerge "syslog, "simple「」에서는, 같은 이름의 리모트브런치에 대해서만 리모트트래킹을 설정합니다.

경우(및 「」는 「」를 참조해 주세요).push.default는 '이렇게 하다'로 않습니다.current ) 에게 " ) The current branch %s has no upstream branch에러 및 트래킹 푸시 및 추가 방법에 대한 설명입니다.

이 에러는, 브랜치 마다 1회씩의 어드바이스를 따르는 것으로, 그 브랜치의 문제를 「영원히 해결」할 수 있는 경우에 도움이 됩니다만, 「간단한」중앙집중형 워크플로우에서는, 항상 이 방법이 올바른 것이므로, 그냥 실행하는 것이 좋습니다.

「」으로이 를 서포트합니다.push.autoSetupRemote는 리모트트래킹브런치가 않은 또, 는 「」로 푸시 됩니다.--set-upstream.

이 .The current branch %s has no upstream branch에러가 발생하여 대응하는 테스트를 추가합니다.

새로운 힌트는 다음과 같습니다.

에 대해
「」을 참조해 주세요.push.autoSetupRemote config help config'의 'syslog help config'에 있습니다.

git config이제 man 페이지에 다음이 포함됩니다.

push.autoSetupRemote

「 」로되어 있는 .true라고 가정하다--set-upstream하지 않는 .

은 '보다 낫다'에서 유효합니다.push.default선택사항'simple , ' , 'upstream, , , ' "current

합니다(「」의등).push.default=current이치노
이점을 수 있는 는 '어느 정도'입니다simple리모트상에서 모든 브랜치의 이름이 같은 중앙 워크플로우.

업스트림은 2가지 방법으로 간단하게 설정할 수 있습니다.먼저 브랜치를 작성할 때:

git branch -u origin/my-branch

또는 브런치를 작성한 후에 이 명령을 사용할 수 있습니다.

git push -u origin my-branch

1개의 명령어로 브런치, 체크아웃 및 업스트림 설정을 할 수도 있습니다.

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

개인적으로는 2단계 명령어로 이 작업을 수행하는 것이 좋습니다.

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

다음을 사용할 수 있습니다.

git config --global branch.autosetupmerge always

새로운 브런치를 작성 또는 체크아웃할 때마다 업스트림브런치가 링크 됩니다

https://felipec.wordpress.com/2013/09/01/advanced-git-concepts-the-upstream-tracking-branch/ 를 참조해 주세요.

도 ★★★★★★★★★★★★★★★★★★★★★★★branch.autosetuprebase보다 기본 재배치 위주의 워크플로우를 따르지만, 수행 방법을 모를 경우 이 워크플로우를 사용하지 마십시오. 풀 동작이 기본 재배치되어 이상한 결과가 발생할 수 있습니다.

덧붙여서, 현재의 브랜치를 같은 이름의 리모트에 푸시 하는 쇼트 컷:

$ git push -u origin HEAD

아래가 기능하지 않는 경우:

git config --global push.default current

프로젝트의 로컬 설정도 업데이트해야 합니다.프로젝트에 로컬 git 설정이 있을 수 있습니다.

git config --local push.default current

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

~/.syslogconfig 파일에서

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

및 ~/.sqrc 또는 ~/.zshrc 파일에 있습니다.

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

리모트상에 이미 존재하는 브랜치(오리진/썸브런치 등)를 추적하려고 하지만 아직 로컬로 체크 아웃하지 않은 브랜치를 추적하려면 다음 작업을 수행할 수 있습니다.

$ git checkout --track origin/somebranch

주의: '-t'는 '--track' 옵션의 줄임말입니다.

이것은 즉시 같은 연관성을 설정한다.

push.autoSetupRemote이제 이 문제를 더 쉽게 해결할 수 있게 되었습니다, 마침내!상세한 것에 대하여는, 여기를 참조해 주세요.

원답:

매번 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"

또한 git pull에 어떤 리모트브런치를 풀할지를 명시적으로 지시할 수 있습니다(에러 메시지에 기재되어 있습니다).

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

단, 이 점에 주의해 주세요.다른 브랜치에 있는 경우, 명시적으로 풀링 하는 refspec은 현재 브랜치에 Marge 됩니다.

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

지나치게 상세한 구문 없이도 이를 처리할 수 있는 매우 좋은 에일리어스를 설정할 수 있습니다.

.~/.gitconfig:

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

새 브랜치로 커밋한 후 명령어를 입력하기만 하면 새 브랜치를 푸시할 수 있습니다.

git po

다른 많은 유저들과 비슷한 일을 했지만, 다른 유저들이 글을 올리는 것을 보지 못했기 때문에 다른 사용자들과 공유하고 싶었습니다.

alias gpu='git push --set-upstream origin $(git branch --show-current)'

(oh-my-zsh는 이미 .oh-my-zsh/plugins/sys/sys/sys.zsh에서 편집된 GPU 에일리어스를 가지고 있습니다).

를 있는 .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

이제 가도 돼

git 겟겟2.37.0혹은 그 이후로는 리모콘을 자동으로 설정하도록 git에게 지시할 수 있습니다. 하면 .

git config --global --add --bool push.autoSetupRemote true

그냥 쓰면 요.git push이치노

업스트림을 같은 이름의 브랜치로 설정하고 싶은 경우가 99%로, 이것을 사용합니다(*nix 또는 Git Bash).

git branch --set-upstream-to=origin/$(git branch --show-current)

이치노 커맨드를 주의해 .git branch --show-current현재 지점 이름을 인쇄하거나, 분리된 경우 아무것도 인쇄하지 않습니다.

사이드 노트:사용할 수 있도록 설정이 되어 있다.git push -u그래서 이걸 할 필요가 거의 없어요.을 사용법일반적으로 리모트상의 변경으로 로컬 변경을 리셋하고 싶을 때, 그 순간에는 -u를 사용하지 않고 눌렀다는 것을 깨달았습니다.따라서 일반적으로 업스트림 설정 후 실행할 다음 명령어는 리모트브런치로 리셋됩니다.

git reset --hard @{u}

그것도 지사에 구애받지 않습니다.(아마도 저는 지점 이름을 입력하는 것을 정말 싫어할 것입니다.)

oh-my-zsh의 git 플러그인은 이미 이 에일리어스를 가지고 있습니다.gpsup그러면 브런치로 업스트림이 푸시되어 설정됩니다.★★★★★★★★★★★★★★★★★★!

저는 개인적으로 표준화된 일관된 솔루션을 좋아합니다.다른 사람에게도 같은 별칭을 사용할 것을 권장합니다.:)

왜냐하면 git은 다양한 분기를 다른 "업스트림" 저장소로 푸시/풀링할 수 있는 쿨한 기능을 가지고 있기 때문입니다.같은 브랜치에서 푸시 및 풀링에 개별 저장소를 사용할 수도 있습니다.이를 통해 분산된 멀티레벨 플로우를 생성할 수 있으며 Linux 커널 등의 프로젝트에서 유용하게 사용할 수 있습니다.Git은 원래 그 프로젝트에서 사용하기 위해 만들어졌습니다.

그 결과, 어느 지사를 추적해야 하는지에 대한 가정은 이루어지지 않습니다.

한편, 대부분의 사람들은 git를 이런 식으로 사용하지 않기 때문에 디폴트 옵션에 적합한 경우가 될 수 있습니다.

Git은 일반적으로 상당히 낮은 수준이어서 실망스러울 수 있습니다.그러나 GUI가 있기 때문에 셸에서 도우미 스크립트를 사용하는 경우에도 쉽게 작성할 수 있습니다.

다음 git 명령어 중 하나를 실행하면 git이 자동으로 업스트림 브랜치를 만들 수 있습니다.

  1. git config --global --add push.default 현재
  2. git config --global --add push.autoSetupRemote true

도 할 수 있어요.git push -u origin $(current_branch)

우리는 패브릭을 사용하고 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

여기 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'

오리지널 투고

내가 원했던 건 이런 거였어

git checkout -b my-branch
git commit -a -m "my commit"
git push

해결책을 에, 저는 '바쉬'라는 '라는 .~/.bashrc:

alias push="git push -u origin HEAD"

막 있다push이는 에일리어스를 로 추가할 수 ).~/.gitconfig같은 다른 이름으로도 사용할 수 있습니다.pushup)

이 문제(OS X만 해당)로 인해 재검출되었습니다.분기할 때 사용하는 것은 다음 두 가지 명령어뿐입니다.

legit publish [<branch>]지정된 브런치를 리모트에 퍼블리시합니다.(필수:pub)

legit unpublish <branch>지정된 분기를 리모트에서 삭제합니다.(필수:unp)

SublimeGit에는legit디폴트에서는 Ctrl+b를 누르는 것만으로 브랜치 루틴 전체를 간단하게 할 수 있습니다.

좋은 다요.git pull

"로컬이 적절하게 추적하는 리모트브런치를 작성함으로써 git push가 정상적으로 동작하도록 한다"와 같은 작업을 하는 에일리어스를 가지는 것은 확실히 도움이 됩니다.그러나 이러한 기능을 사용하는 것을 잊었거나 다른 워크플로우를 거쳤을 때 도움이 되지 않습니다.

리모트 머지타깃이 설정되어 있지 않은 경우 리모트에 로컬브런치와 같은 이름의 브런치가 있는 경우를 검출하여 그 브런치를 머지타깃으로 설정하고 풀링함으로써 풀링에 사용할 수 있는 bash 함수를 다음에 나타냅니다.

git-pulldown() {
    head="$(git rev-parse --abbrev-ref HEAD)"

    if [[ $(git config "branch.$head.merge") ]]; then #there's already a merge target configured, just pull as normal from there
        git pull
    else
        if [[ $(git ls-remote --heads origin $head) ]]; then #there is an upstream branch existing with the same name as our branch
            git branch --set-upstream-to origin/$head #set merge target to upstream branch with same name
            git pull
        else #fail with explanation
            echo "Branch $head has no upstream or merge target! You will likely have to push first, or manually configure it"
            return 1
        fi
    fi
}

git 명령의 기본 옵션을 덮어쓸 수 있는 지원 방법은 없는 것 같습니다.섀도우 원래 명령어와 동일한 이름을 가진 git 에일리어스를 정의하기 위한답변에 기초하여 우리는 다음 동작을 덮어쓸 수 있습니다.git push "bash"를 호출합니다.git push -u 에.~/.bash_profile이 파일은 푸시할 때마다 --set-module을 실행하는 것과 같아야 합니다.

function do_git {
  cmd=$1
  shift
  myArgs=( "$@" )

  if [ "$cmd" == "push" ]; then
    myArgs=( "-u" "${myArgs[@]}" )
  fi
  myArgs=( "$cmd" "${myArgs[@]}" )

  $(which git) "${myArgs[@]}"
}
alias  git='do_git'

언급URL : https://stackoverflow.com/questions/6089294/why-do-i-need-to-do-set-upstream-all-the-time

반응형