어떤 git 태그를 보여주고 있습니까?


216

현재 체크 아웃 된 태그를 찾는 데 문제가 있습니다.

내가 할 때 :

git checkout tag1
git branch

어떤 태그를 사용 중인지 알 수 없습니다. 그것은 단지 기록합니다 :

* (no branch)
master

체크 아웃 된 태그를 찾을 수 있습니까? 위의 예에서 이것은입니다 tag1.

답변:


326

편집 : Jakub Narębski에는 더 많은 자식이 있습니다. 다음과 같은 훨씬 간단한 명령이 완벽하게 작동합니다.

git describe --tags

(또는 --tags주석이 달린 태그를 체크 아웃 한 경우 태그가 없으면 내 태그가 가벼워서 --tags가 필요합니다.)

원래 답변은 다음과 같습니다.

git describe --exact-match --tags $(git log -n1 --pretty='%h')

더 많은 깃 푸를 가진 사람은 더 우아한 해결책을 가질 수 있습니다 ...

이는 git-log체크 아웃 한 것부터 로그 를 보고 한다는 사실을 활용합니다 . %h약식 해시를 인쇄합니다. 그런 다음 git describe --exact-match --tags해당 커밋과 정확히 일치하는 태그 (경량 또는 주석)를 찾습니다.

$()위 의 구문은 bash 또는 이와 유사한 것을 사용한다고 가정합니다.


22
그냥 사용 git describe하면 (주석) 태그를 정확히 경우, 또는 태그 이름을 표시 할 <tag>-<n>-g<shortened sha-1>경우하지, 어디 <n>커밋 수 있기 때문에입니다 <tag>.
Jakub Narębski

1
@Jakub-감사합니다. --exact-match귀하의 의견에 앞서 답변 초에 추가 했습니다. 그것을 제거하고 여전히 fuzzier 입력에서 좋은 정보를 얻을 수 있다는 것을 알고 반갑습니다.
bstpierre

고마워, 이것은 내가 찾던 것입니다. Btw, 심지어 git-describe --exact-match (--tags 제외)도 효과적입니다.
grm

3
사용 git rev-parse HEAD하는 것이 더 나은 해결책입니다 git log -n1 --pretty='%h'...하지만 왜 간단하게 쓸 수 없습니다 HEAD(또는 git describe기본값으로 HEAD)?
Jakub Narębski

오직 Guybrush는 도자기를 싫어합니다
vdegenne

71

이것은 나를 위해 일했다 git describe --tags --abbrev=0


2
예. 해당 태그에 정확하게 있지 않아도 작동합니다! :)
Martin Muzatko

13
어. ... 태그 다음에 3 개의 커밋을 체크 아웃하면 "해당 태그에 있지 않은"것입니다. 체크 아웃 된 커밋 전 또는 커밋의 마지막 태그를 알려줍니다. 따라서 이것은 잘못된 것입니다.
ingyhere

Windows에서도 작동 :)
cowlinator

50

현재 HEAD (또는 커밋)의 모든 태그 표시

git tag --points-at HEAD

1
이 명령은 결과가 비어 있어도 명령 행에서 오류를보고하지 않습니다. 곤충? 또한 해당 위치에 여러 개의 태그가있는 경우 목록을 반환합니다. 가장 좋은 대답이지만 스크립터는 이러한 경고를 염두에두고주의를 기울여야합니다.
ingyhere

@ingyhere 님의 댓글에 따라. 예, 오류가 없다는 것은 좋은 정보이며 사람들은 그에 따라 결과를 처리해야합니다. 그러나 나는 그것을 버그라고 부르지 않을 것이다. 제 경우에는 "태그가 없으면 비어 있습니다"가 유효합니다. 다른 경우에는 누군가 변수에 변수를 저장 한 다음 비어 있는지 확인할 수 있습니다 (bash 명령어 링크)
driftcatcher

23

git describeA는 도자기 당신이 피해야 명령은 :

http://git-blame.blogspot.com/2013/06/checking-current-branch-programatically.html

대신에 나는 다음을 사용했다.

git name-rev --tags --name-only $(git rev-parse HEAD)

11
"정의되지 않음"을 반환합니다
낯선 사람

4
이것은 ^0태그에 해당하는 커밋에 대한 후행 을 출력 합니다 (예 : 태그 1.0가 출력하는 경우 1.0^0). Git 출력 만 가능한 방법 1.0이 있습니까, 아니면 이것을 위해 sed를 사용해야합니까?
Daniel Serodio

13
개념적인 nitpicking : 단지 당신이 도자기와 배관의 의미를 뒤집은 것 같습니다. 도자기를 사용하는 것이 좋습니다 . 높은 수준이며 정상적인 사용을 의미 합니다 . 배관은 내부적으로 (이름에서 알 수 있듯이) git 개발자가 경고없이 인수 및 출력을 변경할 수있는 권한을 보유하기 때문에 권장되지 않습니다. 따라서 첫 번째 제안은 실제로 약간 더 적절한 제안입니다.
레오 Antunes

5
링크 된 기사는이 사용 사례에서 작동하지 않기 때문에 "git branch"를 사용하지 말라고 말합니다. git describe를 사용하지 않는 좋은 이유는 생각할 수 없습니다. Leo가 말했듯이 "Porcelain"명령은 일반적으로 사용해야하는 명령입니다. 자신이하고있는 일을 정말로 모른다면 배관 명령을 피하십시오. "git describe"는 훌륭하게 작동합니다.
Danny

4
"Porcelain"명령은 사용하지 말고 피해야하는 명령입니다. 이 명령은 출력을 기계로 읽을 수 있고 이후 버전에서는 변경되지 않는 명령이므로 스크립트 등에서 신뢰할 수 있습니다. 비 도자기 명령은보다 사람이 읽을 수있는 출력을 생성하는 경향이 있지만 향후 버전에서는 더 많은 것을 만들기 위해 변경 될 수 있습니다. 중요한 것이 실제로 변경 되었기 때문에 읽을 수 없습니다.
rjmunro 2016 년

22

태그를 체크 아웃하면 "분리 된 헤드"가 있습니다. 일반적으로 Git의 HEAD 커밋은 현재 체크 아웃 한 지점에 대한 포인터입니다. 그러나 로컬 브랜치 (예 : 태그 또는 원격 브랜치) 이외의 것을 체크 아웃하면 "분리 된 헤드"가 있습니다. 실제로는 브랜치에 있지 않습니다. 머리가 분리 된 상태에서는 커밋하지 마십시오.

수정하지 않으려면 태그를 확인하십시오. 파일의 내용을 검사 중이거나 태그에서 프로젝트를 빌드하려는 경우 커밋하지 않는git checkout my_tag 한 파일 을 사용 하고 작업하는 것이 좋습니다 . 파일 수정을 시작하려면 태그를 기반으로 분기를 작성해야합니다.

$ git checkout -b my_tag_branch my_tag

my_tag_branch에서 시작하는 이라는 새 분기를 만듭니다 my_tag. 이 지점에서 변경 사항을 커밋하는 것이 안전합니다.


1
환상적인 답변.
Panos Filianos

9

git log --decorate

현재 체크 아웃 된 커밋을 가리키는 참조가 무엇인지 알려줍니다.

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