"git status"에 내가 마스터 브랜치에 있고 "git 브랜치"가 새로 생성 된 리포지토리에없는 이유는 무엇입니까?


83

프로세스를 자동화하고 git branch명령을 실행하여 내가 속한 지점을 찾으려고합니다. git branch아무것도 반환하지 않는 새로 초기화 된 저장소를 제외하고는 모든 것이 잘 작동합니다 . 리포지토리에 대해 아무것도하지 않았고 초기 커밋조차도하지 않았으므로 대답을 받아 들일 수 있습니다. 그러나 내가 실행하면 여기에서 볼 수 있듯이 git status내가 master지점 에 있다고 알려줍니다 .

$ mkdir todelete
$ cd todelete
$ git init
Initialized empty Git repository in /u/u70021a/todelete/.git
$ git status
On branch master

No commits yet

nothing to commit (create/copy files and use "git add" to track)
$ git branch
$

내가 뭘 잘못하고 있니? 제대로 설정하지 않은 설정이 있습니까?

나는 또한 Git에 새로운 사람들이 많이 있는데, 그들이 속한 브랜치를 보여주는 명령이 아무것도 표시하지 않는 이유를 설명 할 수 없지만 status 명령은 수행합니다.

답변:


94

나는 다른 두 가지 답변을 찬성했지만 이것을 생각하는 방법은 간단하다고 생각 합니다. 존재하지 않는 지점에있을 수 있습니다. 그건 정상 분기 이름이 존재하는 그 지점 이름이 있기 때문에, 너무 비어있는 새 저장소에 있어야 기존의 유효한 커밋의 해시 ID를 식별합니다. 비어있는 새 저장소에는 커밋이 없으므로 아직 브랜치 이름이 존재할 수 없습니다.

그럼에도 불구하고 당신은 처음에 어떤 지점에 있습니다. 현재 지점은 이름이 특수 이름에 저장된 지점 HEAD입니다. 비어있는 새 저장소에서 Git은 이름 master(더 정확하게는 refs/heads/master-브랜치의 전체 이름)을 HEAD에 저장하므로 존재하지 않는 master동안에있는 상태 master입니다.

사용중인 존재하지 않는 분기를 변경할 수 있습니다 git checkout -b.

$ git init
Initialized empty Git repository in [path]
$ git checkout -b asdf
Switched to a new branch 'asdf'
$ git checkout -b hello
Switched to a new branch 'hello'

존재하지 않는 분기에있을 때마다 다음 커밋이 분기를 만듭니다 . 이것은 또한 git checkout --orphan작동 방식입니다.


6
감사. 나는 git이 표시하는 것에 동의하지 않지만. 적어도 나는 이유를 이해합니다. 귀하의 결제 예가 흥미 롭습니다. "git checkout"에 대한 문서에 따르면 -b는 다음을 의미 합니다. 엄격하게 사실이 아닌 <new_branch>라는 새 분기를 만듭니다 . 귀하의 예에서는 분기 asdf 또는 hello가 실제로 생성되지 않습니다. 그러나 커밋이 수행되면 그렇게 될 것입니다. 내 개인적인 의견은 커밋이 수행 될 때까지 마스터 브랜치가 존재하지 않기 때문에 "On branch master"메시지를 "Next Commit to branch master"로 변경해야한다는 것입니다.
GOVarney

2
이것이 귀하의 경우와 관련이 있는지 여부는 확실하지 않지만 Git의 경우 분기에 전혀 속하지 않을 수 있음을 지적하고 싶습니다.
sklott

힘내는 내부적으로 사용하는 cat .git/HEAD지점의 파악, 그것은에 어떤 지점 볼의 아마 왜 그것을하지 않았다 때문에, 더 많은 CPU와 디스크 시간을 소비하는 것이다 존재
Ferrybig

imo를 언급해야하는 것은 git branch자동화 된 프로세스에서 사용하지 말아야한다는 것입니다. 이는 해당 사용 사례에 맞게 설계되지 않았기 때문입니다. 도자기가 아닌 명령이 여기에 표시되는 것을 보는 것은 흥미로울 것입니다 git symbolic-ref --short HEAD.
Voo

@Voo : 분리되지 않은 경우에 git symbolic-ref포함 된 이름 HEAD(따라서 고아 / 태어나지 않은 분기 참조)을 표시합니다 HEAD. 새 빈 저장소에서는 분리 된 HEAD에 기존의 유효한 커밋의 해시 ID가 포함되어야하므로 분리 HEAD 할 수 없습니다 . (비어 있지 않은 저장소에서 분리 된 HEAD와 함께 git symbolic-ref오류가 발생합니다.)
torek

23

git branch가지가 없기 때문에 아무것도 표시하지 않습니다. 그러나 다음에서 읽을 수 있습니다 man git init.

이 명령은 빈 Git 저장소를 만듭니다. 기본적으로 객체, refs / heads, refs / tags 및 템플릿 파일에 대한 하위 디렉터리가있는 .git 디렉터리입니다. 마스터 브랜치의 HEAD를 참조하는 초기 HEAD 파일도 생성됩니다.

관련성이 있다고 생각되는 부분을 굵게 표시했습니다. 아직 마스터 브랜치가 없지만 참조가 이미 존재하는 것처럼 보이므로에 표시됩니다 git status. 커밋하면 적절한 분기가 생성됩니다.


3
그것은 "자식 상태"단지에서 볼 수 있듯이 "지점 이름"표시처럼 보이는 그래서 .git를 / HEAD (참조 : 심판 / 헤드 / 마스터) 만 조사하여 일관성 검사를하지 않습니다 .git / 심판 / 헤드 그것을 있는지 실제로 존재합니다.
GOVarney

나는 git의 코드를 검사하지 않았기 때문에 확실하게 말할 수는 없지만 당신이 작성한 것은 나에게 의미가 있습니다. 그러나 여전히 나는 내 것보다 torek의 대답을 선호합니다 :).
Stanowczo

17

기존 답변은 출력이 왜 그것이 무엇인지에 대한 문자적인 질문을 다루고 있지만 실제 문제에 대해 다소 광택이 있다고 생각합니다 ...

당신은 무언가를 자동화하고 있다고 말 했으므로 스크립팅 컨텍스트에서 최고의 도구 git status도 아니라고 제안합니다 git branch.

이 토론에서 몇 가지 대안을 찾을 수 있습니다 . 현재 체크 아웃 된 Git 브랜치를 프로그래밍 방식으로 결정하는 방법

당신의 요구 사항 (또는 당신이 태어나지 않은 브랜치가 어떻게 행동하기를 원하는지)를 모르고 나는 반드시 추천을 할 수는 없지만, 내가 얻고있는 요점은, 일부 명령은 인간 상호 작용 (도자기)을위한 것이고 다른 명령은 스크립트를위한 것이다 ( 배관)


15

가지가 아직 태어나지 않았습니다. 따라서 git branch표시하지 않습니다 ( git symbolic-ref HEADHEAD가 기본 브랜치 마스터를 가리키고 있으며 git branch표시되지 않은 상태로 태어나지 않았 음을 나타냅니다. 즉, 아직 존재하지 않는 브랜치에있을 수 있음). 그러나 무언가를 커밋하면 분기가 생성됩니다.

orphan지점 을 결제하는 경우에도 마찬가지 입니다.

git status이것이 생성 될 브랜치이므로 브랜치 이름을 표시 한다고 가정 합니다.

스크립팅은 현재 체크 아웃 된 Git 분기를 프로그래밍 방식으로 확인하는 방법을 참조하세요.


2

git에서 기본 분기는 master. 커밋하면 git은 현재 사용중인 브랜치를 "사용"합니다. 새 저장소를 초기화 했으므로 "기본"브랜치에 있고 이것이 브랜치 목록에 표시되지 않는 이유입니다. 변경 사항을 커밋하면 표시됩니다.

여기에 이미지 설명 입력

여기에 이미지 설명 입력


2
분기를 이해합니다. "git status"가 존재하지 않는 분기에 있다고 말하는 이유를 이해할 수 없습니다.
GOVarney
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.