왜 git branch --unset-upstream을 호출하여 수정합니까?


161

git의 고급 작업에 관해서는 초보자입니다. 블로그 프레임 워크 Octopress를 사용하여 블로그 를 유지 관리 합니다. Octopress는 2011 년 이후 어떤 개발도하지 않았지만 내 목적에 잘 부합하므로 지금까지는 아무것도 바꾸지 않을 것이라고 생각했습니다.

참고로, 내 블로그는 Github Pages에서 호스팅됩니다.

오늘 새 게시물을 작성하는 동안 git status다음 메시지가 표시되었습니다.

On branch source
Your branch is based on 'origin/master', but the upstream is gone.
  (use "git branch --unset-upstream" to fixup)

같은 메시지는 다음과 같은 모든 후속 명령에 대해 반복 git add ., git commit -m 'message'git push origin source.

  • 이 메시지는 무엇을 의미합니까?
  • 뭔가 부러 졌습니까?
  • 그렇다면 무엇입니까?
  • 고쳐야합니까?

가능하다면이 기사를 읽고 나중에 이해할 수있는 pdf / web 기사를 알려주십시오.

자세한 내용은:

bash-3.2$ git branch -a
* source
  remotes/octopress/2.1
  remotes/octopress/HEAD -> octopress/master
  remotes/octopress/gh-pages
  remotes/octopress/linklog
  remotes/octopress/master
  remotes/octopress/refactor_with_tests
  remotes/octopress/rubygemcli
  remotes/octopress/site
  remotes/origin/source

자세한 정보가 필요하면 알려주십시오. 감사.

답변:


197

TL; DR 버전 : 원격 추적 브랜치 origin/master가 존재했지만 지금은 존재하지 않기 때문에 로컬 브랜치 source는 존재하지 않는 것을 추적하고 있습니다. 이는 의심스러운 것입니다. 즉, 다른 Git 기능이 사용자를 위해 아무것도 할 수 없음을 의미합니다. 힘내가 그것에 대해 경고하고 있습니다. "업스트림 추적"기능이 의도 한대로 작동하지 않아도 제대로 작동하므로 변경 여부는 사용자에게 달려 있습니다.

업스트림 설정에 대한 또 다른 방법은 "git push --set-upstream origin <branch>"를 사용해야하는 이유는 무엇입니까?를 참조하십시오 .


이 경고는 Git의 새로운 기능으로 Git 1.8.5에서 처음 나타납니다. 릴리스 노트에는 다음과 같은 간단한 글 머리 기호 항목이 포함되어 있습니다.

  • "git branch -v -v"(및 "git status")는 다른 분기를 기반으로하지 않는 분기, 업스트림 분기와 동기화 된 분기 및 업스트림으로 구성된 분기를 구분하지 않았습니다. 더 이상 존재하지 않는 지점.

이것이 의미하는 바를 설명하려면 먼저 "원격", "원격 추적 지점"및 Git이 "상류 추적"을 처리하는 방법에 대해 알아야합니다. ( 원격 추적 지점 은 끔찍한 용어입니다. 대신 원격 추적 이름을 사용하기 시작 했는데 약간 개선 된 것 같습니다. 아래에서는 Git 문서와의 일관성을 위해 "원격 추적 지점"을 사용합니다. )

각각은 "원격"처럼 단순히 이름 origin이나 octopress이 경우. 그들의 목적은 귀하 git fetch또는 git pull업데이트 된 장소의 전체 URL과 같은 것을 기록하는 것 입니다. 당신이 사용하는 경우 1 힘내는 원격 (저장된 URL을 사용하여)로 이동 및 업데이트의 적절한 설정을 통해 제공합니다. 또한 "원격 추적 분기"를 사용하여 업데이트를 기록 합니다.git fetch remote,

"원격 추적 지점"(또는 원격 추적 이름)은 일부 "원격"에서 마지막으로 본 지점 이름의 기록입니다. 각 리모컨 자체는 Git 저장소이므로 분기가 있습니다. 원격 "원점"의 지점은 아래의 로컬 저장소에 기록됩니다 remotes/origin/. 당신이 보여 텍스트가있다라는 이름의 브랜치 있다고 말한다 sourceorigin, 그리고 가지라는 이름의 2.1, linklog, 등등에 octopress.

물론 "일반"또는 "로컬"브랜치는 자체 저장소에서 만든 브랜치 이름 일뿐입니다.

마지막으로 "원격 추적 지점"을 "추적"하도록 (로컬) 지점을 설정할 수 있습니다. 로컬 브랜치 L가 원격 추적 브랜치를 추적하도록 설정 되면 RGit은 R"업스트림"을 호출 하고 커밋 측면에서 업스트림을 "앞으로"그리고 / 또는 "뒤에"있는지 알려줍니다. 그것은의 정상 (심지어 추천-수) 현지 지사와 (원격 접두사 부분을 제외하고) 같은 이름을 사용하는 지점을 원격 추적 등에 sourceorigin/source실제로 필요한 아니지만.

그리고이 경우에는 일어나지 않습니다. source원격 추적 지점을 추적 하는 로컬 지점이 origin/master있습니다.

Git이 원격 지점을 추적하기 위해 로컬 지점을 설정 하는 방법에 대한 정확한 메커니즘을 알아야 할 필요 는 없지만 아래에서 관련이 있으므로 이것이 어떻게 작동하는지 보여 드리겠습니다. 현지 지사 이름 ()으로 시작합니다 source. 이 이름을 사용하는 철자 branch.source.remote와 철자 두 개의 구성 항목이 branch.source.merge있습니다. 당신이 보여준 결과에서, 그것들이 모두 설정되어 있음을 분명히 알 수 있으므로 주어진 명령을 실행하면 다음을 볼 수 있습니다 :

$ git config --get branch.source.remote
origin
$ git config --get branch.source.merge
refs/heads/master

이것들을 종합하면, 2 이것은 당신의 브랜치가 source"원격 추적 브랜치"를 추적 한다는 것을 Git에 알려준다 origin/master.

그러나 이제의 출력을 보면 git branch -a저장소의 모든 로컬 및 원격 추적 분기 이름이 표시됩니다. 원격 추적 이름은 remotes/... 아래에 나열되며이 없습니다remotes/origin/master . 아마 한 번에 있었지만 지금은 사라졌습니다.

Git은으로 추적 정보를 제거 할 수 있다고 알려줍니다 --unset-upstream. 이것은 모두 지울 것입니다 branch.source.originbranch.source.merge및 경고를 중지합니다.

당신이 원하는,하지만,하는 것입니다 상당히 것으로 보인다 전환 추적에서 origin/master다른 것을 추적에 : 아마 origin/source,하지만 어쩌면 하나 octopress/의 이름.

당신이 할 수있는 git branch --set-upstream-to, 3 예를 :

$ git branch --set-upstream-to=origin/source

(여전히 "source"브랜치에 있고 그것이 origin/source원하는 업스트림 이라고 가정하면 , 실제로 어떤 것을 원하는지 알 수있는 방법이 없습니다).

( 기존 Git 지점을 원격 지점으로 추적하는 방법을 참조하십시오 . )

나는 당신이 여기에 도착한 방법은 당신이 처음했을 때 git clone복제 한 것이 가지 를 가지고 있다고 생각합니다 master. 또한 master추적하도록 설정된 branch 가 있습니다 origin/master(git의 일반적인 표준 설정입니다). 이것은 당신이 의미했다 branch.master.remotebranch.master.merge설정에 originrefs/heads/master. 그러나 origin리모컨의 이름이에서 (으) master로 변경되었습니다 source. 일치하도록 지역 이름을에서 (으) master로 변경했다고 생각합니다 source. 이 변경된 이름 에서, 설정의 branch.master.remotebranch.source.remote과에서 branch.master.mergebranch.source.merge...하지만 기존의 왼쪽 값을 그래서, branch.source.merge지금은 틀렸다.

이 시점에서 "업스트림"연결이 끊어졌지만 1.8.5 이전의 Git 버전에서는 Git이 깨진 설정을 전혀 알아 차리지 못했습니다. 이제 1.8.5가 있으므로 이것을 지적하고 있습니다.


여기에는 대부분의 질문이 포함되어 있지만 "수정해야하는"질문은 아닙니다. (예 :)를 수행하여 현재 몇 년 동안 고장을 해결 한 것 같습니다 . 계속 그렇게하면 문제가 계속 해결되므로 문제 를 해결할 필요 가 없습니다 . 원하는 경우 업스트림을 제거하고 불만을 중지하고 로컬 지점에 업스트림 이 있는 것으로 표시 하지 않도록 사용할 수 있습니다 .git pull remote branchgit pull origin source--unset-upstreamsource

업스트림의 요점은 다양한 작업을보다 편리하게 만드는 것입니다. 예를 들어, git fetch다음 git merge업스트림가 올바르게 설정되어있는 경우 일반적으로 "옳은 일을 할"것, 그리고 git status후에는 git fetch당신의 repo는 해당 분기를 들어, 업스트림 하나와 일치 여부를 알려줍니다.

편의를 원하면 업스트림을 다시 설정하십시오.


1git pull 은을 사용하며 git fetch, Git 1.8.4부터는 (최종!) "원격 추적 지점"정보도 업데이트합니다. 이전 버전의 Git git pull에서는으로 만 원격 추적 분기에 업데이트가 기록되지 않았습니다 git fetch. Git은 버전 1.8.5 이상이어야하므로 이것은 문제가되지 않습니다.

2 글쎄, 이것은 아래에있는 구성 라인을 고의로 무시하고 remote.origin.fetch있습니다. Git은 "병합"이름을 매핑하여 원격 지점의 전체 로컬 이름이임을 확인해야합니다 refs/remotes/origin/master. 매핑은 거의 항상 이와 같이 작동하므로 예측할 masterorigin/master있습니다.

3 또는,와 git config. 당신은 단지 상류 설정하려는 경우 origin/source변화가에있는 유일한 부분 branch.source.merge, 그리고 git config branch.source.merge refs/heads/source 그것을 할 것입니다. 그러나 --set-upstream-to말한다 무엇을 하는가 "더 나은 방법"그래서 당신이 아니라 당신이 수동으로 그것을 스스로 할 가서 만드는 것보다 수행합니다.


3
"원하는 경우 --unset-upstream을 사용하여 로컬 브랜치를 업스트림이 전혀없는 것으로 표시 할 수 있습니다 ."
BeatriceThalo

157

torek의 대답은 아마도 완벽하지만, 원래 질문에 설명 된 것과 다른 다른 사례를 언급하기를 원했지만 동일한 오류가 나타날 수 있습니다 (유사한 문제가있는 다른 사람들을 도울 수 있음).

git init --bare내 서버 중 하나를 사용하여 빈 (새) 저장소를 만들었습니다 . 그런 다음 git clonePC의 로컬 작업 공간으로 가져 왔습니다 .

로컬 리포지토리에서 단일 버전을 커밋 한 후을 호출 한 후 해당 오류가 발생했습니다 git status.

torek의 대답에 따라, 나는 로컬 작업 디렉토리 저장소에 대한 첫 번째 커밋이 "마스터"분기를 만들었다는 것을 이해합니다. 그러나 서버의 원격 저장소에는 아무것도 없었으므로 "마스터"(원격 / 원산지 / 마스터) 지점조차 없었습니다.

git push origin master로컬 리포지토리에서 실행 한 후 원격 리포지토리에는 마침내 마스터 분기가있었습니다. 이로 인해 오류가 나타나지 않습니다.

결론적으로- "마스터"를 포함하여 분기가 없기 때문에 커밋이 0이 아닌 새로운 원격 리포지토리에 대해 이러한 오류가 발생할 수 있습니다.


6
이것은 현재이 오류 메시지의 1 번 결과 On branch source Your branch is based on 'origin/master', but the upstream is gone. (use "git branch --unset-upstream" to fixup)이며 주관적이지만 빈 저장소를 복제하여 대체 대답을 얻을 수 있기 때문에 발생했을 가능성이 큽니다.
Bella

2
빈 파일이더라도 README.md 파일로 새 저장소를 초기화하는 것이 항상 좋은 생각이라고 생각합니다.
Ahmed Hussein

8

문제가 해결 될 수 있습니다.

변경을 한 후 커밋 할 수 있습니다.

git remote add origin https://(address of your repo) it can be https or ssh
then
git push -u origin master

그것이 당신을 위해 작동하기를 바랍니다.

감사


1
이것은 실제로 도움이 될 것입니다-그 이유는 내 대답에 자세히 나와 있습니다 (간단히-이것은 원격 저장소에 누락 된 마스터 분기를 만듭니다).
ElazarR

7

나를 위해, .git/refs/origin/master부패했다.

나는 다음을 수행하여 문제를 해결했다.

rm .git/refs/remotes/origin/master
git fetch
git branch --set-upstream-to=origin/master

0

실제로 torek은 내가 할 수있는 것보다 도구를 더 잘 사용하는 방법을 이미 알려주었습니다. 그러나이 경우 http://octopress.org/docs/deploying/github/ 의 지침을 따르면 특별한 것을 지적하는 것이 중요하다고 생각합니다 . 즉, 설정에 여러 개의 github 리포지토리 가 있습니다. 먼저 디렉토리에 웹 사이트의 모든 소스 코드가 $WEBSITE있고 정적 생성 파일 만있는 디렉토리 가 $WEBSITE/_deploy있습니다. 재미있는 설정은 디렉토리에 .gitignore파일 $WEBSITE이있어서이 설정이 실제로 작동한다는 것입니다.

충분한 소개. 이 경우의 저장소에서 오류가 발생할 수도 있습니다 _deploy.

cd _deploy

git branch -a
* master
remotes/origin/master
remotes/origin/source

에서 .git/config당신이 일반적으로 이런 일을 찾아야합니다 :

[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
[remote "origin"]
    url = git@github.com:yourname/yourname.github.io.git
    fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
    remote = origin
    merge = refs/heads/master

그러나 귀하의 경우 지점 마스터에는 리모콘이 없습니다.

[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
[remote "origin"]
    url = git@github.com:yourname/yourname.github.io.git
    fetch = +refs/heads/*:refs/remotes/origin/*

당신이 해결할 수있는 것 :

cd _deploy
git branch --set-upstream-to=origin/master

따라서 torek이 말한대로 모든 것이 있지만, 이것이 _deploy웹 사이트의 루트가 아닌 디렉토리와 관련이 있다는 것을 지적하는 것이 중요 할 수 있습니다 .

추신 : 나중에이 일에 물리지 않도록 플러그인 zsh과 같은 쉘을 사용하는 git것이 좋습니다. _deploy다른 저장소와 관련이 있음을 즉시 보여줍니다 .


0

나는이 질문을 두 번 가지고 있었고 항상 로컬 지점에서 git 캐시 파일이 손상되어 발생했습니다. 누락 된 커밋 해시를 해당 파일에 작성하여 문제를 해결했습니다. 서버에서 올바른 커밋 해시를 가져 와서 다음 명령을 로컬로 실행했습니다.

cat .git/refs/remotes/origin/feature/mybranch \
echo 1edf9668426de67ab764af138a98342787dc87fe \
>> .git/refs/remotes/origin/feature/mybranch

0

문제 : 지점이 '원산지 / 마스터'를 기반으로하지만 업스트림이 사라졌습니다.

해결책 : 자식 분기-설정 해제 업스트림


3
stackoverflow에 오신 것을 환영합니다. 문제는 어떻게 오류를 고칠 수 있는지에 관한 것이 아니라, 왜이 오류가 발생했는지 그리고 무엇인가를해야하는지 알고 싶어합니다. 답변으로이 문제를 해결하십시오.
cronoik

0

다음 명령으로 로컬 지점을 삭제하십시오.

git branch -d branch_name

당신은 또한 할 수 있습니다

git branch -D branch_name 

기본적으로 삭제 (로컬이 소스에 병합되지 않은 경우에도)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.