it-swarm-ko.tech

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

Git의 고급 작업에 관해서는 초보자입니다. 블로그 프레임 워크 Octopress 를 사용하여 blog 을 유지합니다. 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

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

129
Jatin Ganhotra

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과 같은 것을 기록하는 것입니다. git fetch remote,를 사용하는 경우1 Git은 저장된 URL을 사용하여 원격으로 가서 적절한 업데이트 세트를 가져옵니다. 또한 "원격 추적 분기"를 사용하여 업데이트를 기록 합니다.

"원격 추적 지점"(또는 원격 추적 이름)은 일부 "원격"에서 마지막으로 본 지점 이름의 기록입니다. 각 리모컨 자체는 Git 저장소이므로 분기가 있습니다. 원격 "원본"의 분기는 remotes/Origin/ 아래의 로컬 저장소에 기록됩니다. 표시 한 텍스트는 sourceOrigin이라는 분기가 있고 linklog2.1, octopress 등의 분기가 있음을 나타냅니다.

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

마지막으로 "원격 추적 지점"을 "추적"하도록 (로컬) 지점을 설정할 수 있습니다. 로컬 분기 L이 원격 추적 분기 R을 추적하도록 설정되면, Git은 R을 "업스트림"이라고 부르고 커밋 측면에서 업스트림에 "앞에"있는지 또는 "뒤에"있는지 알려줍니다. . 로컬 지점과 원격 추적 지점은 sourceOrigin/source와 같은 동일한 이름 (원격 접두사 부분 제외)을 사용하는 것이 일반적이지만 권장 가능하지만 실제로는 필요하지 않습니다.

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

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

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

이것들을 정리하면2 이것은 Git에게 source 브랜치가 "remote-tracking branch"인 Origin/master를 추적한다고 알려줍니다.

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

Git은 --unset-upstream로 추적 정보를 제거 제거 할 수 있다고 알려줍니다. 그러면 branch.source.Originbranch.source.merge가 모두 지워지고 경고가 중지됩니다.

그러나 원하는 것은 Origin/master 추적에서 다른 것을 추적하는 것 switch , 아마도 Origin/source이지만 아마도 octopress/ 중 하나 일 것입니다. 이름.

git branch --set-upstream-to로이 작업을 수행 할 수 있습니다. 예 :

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

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

(또한 기존 Git 브랜치 트랙을 원격 브랜치로 만드는 방법은 무엇입니까? )

당신이 여기에 도달 한 방식은 처음 git clone를했을 때 복제 한 것이 master 분기를 가지고 있다고 생각합니다. Origin/master를 추적하도록 설정된 master 브랜치도 있습니다 (git의 일반적인 표준 설정입니다). 이것은 branch.master.remotebranch.master.mergeOriginrefs/heads/master로 설정되었음을 의미합니다. 그러나 Origin 리모컨의 이름이 master에서 source (으)로 변경되었습니다. 일치하도록 로컬 이름을 master에서 source (으)로 변경했다고 생각합니다. 이렇게하면 설정의 이름 branch.master.remote에서 branch.source.remote로, branch.master.merge에서 branch.source.merge ...로 변경되었지만 이전 이므로 branch.source.merge이 잘못되었습니다.

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


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

업스트림의 요점은 다양한 작업을보다 편리하게 만드는 것입니다. 예를 들어, 업스트림이 올바르게 설정되어 있으면 git fetch 뒤에 git merge가 오는 것은 일반적으로“올바른 일”이며 git status 뒤에 git fetch는 해당 리포지토리의 리포지토리가 업스트림과 일치하는지 여부를 알려줍니다.

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


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

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

또는 git config를 사용하십시오. 업스트림을 Origin/source로 설정하려는 경우 변경해야하는 유일한 부분은 branch.source.merge이며 git config branch.source.merge refs/heads/source가이를 수행합니다. 그러나 --set-upstream-to what 하고 싶다고 말합니다. 수동으로 직접 만드는 대신 "더 나은 방법"입니다.

172
torek

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

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

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

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

로컬 리포지토리에서 git Push Origin master를 실행 한 후 원격 리포지토리에는 최종적으로 마스터 분기가있었습니다. 이로 인해 오류가 나타나지 않습니다.

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

143
ElazarR

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

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

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

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

감사

7
Ajay Kotnala

나를 위해 .git/refs/Origin/master가 손상되었습니다.

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

rm .git/refs/remotes/Origin/master
git fetch
git branch --set-upstream-to=Origin/master
7
smremde

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

git branch -d branch_name

당신은 또한 할 수 있습니다

git branch -D branch_name 

기본적으로 삭제를 강제 실행합니다 (로컬이 소스에 병합되지 않은 경우에도)

0
Pravin

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

cat .git/refs/remotes/Origin/feature/mybranch \
echo 1edf9668426de67ab764af138a98342787dc87fe \
>> .git/refs/remotes/Origin/feature/mybranch
0
user1106400

실제로 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 = [email protected]: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 = [email protected]:yourname/yourname.github.io.git
    fetch = +refs/heads/*:refs/remotes/Origin/*

당신이 해결할 수있는 것 :

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

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

추신 : 앞으로 zsh 플러그인과 함께 git과 같은 Shell을 사용하여 나중에이 일에 물리지 않을 가치가 있습니다. _deploy가 다른 저장소와 관련이 있음을 즉시 보여줍니다.

0
Anne van Rossum