Git에서 어떤 커밋을 가리키는 지 어떻게 알 수 있습니까?


410

저장소에 주석이 달린 태그가 많이 있으며 태그를 가리키는 커밋을 해결하고 싶습니다. 태그와 커밋 SHA를 나열하는 명령이 있습니까? 태그를 확인하고 HEAD를 보면 너무 힘들 것 같습니다.

최신 정보

내가 실제로 원하는 것은 태그로 이어지는 역사를 보는 것만 git log <tagname>으로 충분하다는 반응을 겪은 후에 깨달았습니다 .

답변으로 표시된 답변은 태그 및 커밋 목록을 얻는 데 유용합니다. 약간의 셸 해커를 사용하면 SHA + 커밋 메시지로 변환 할 수 있다고 확신합니다.


3
git show-refrepo 개정의 sha가 아니라 태그의 sha 를 나타내는 것을 지적하고 싶습니다 . $ git show-ref test 08b9c774ab20e5bdb638339cf4ea2c124b0dae54 refs / tags / test $ git checkout test HEAD는 이제 c7f8831에 있습니다 ... $ git checkout 08b9c77 HEAD는 이제 c7f8831에 있습니다 ...
Konstantin Pelepelin

태그에 주석이 달렸다면--dereference
Trevor Boyd Smith

답변:


347

이 작업을 수행하는 한 가지 방법은입니다 git rev-list. 다음은 태그가 가리키는 커밋을 출력합니다.

$ git rev-list -n 1 $TAG

~/.gitconfig많이 사용 하면 별칭으로 추가 할 수 있습니다 .

[alias]
  tagcommit = rev-list -n 1

그런 다음 호출하십시오.

$ git tagcommit $TAG

30
왜 사용하지 git rev-parse <tag>않습니까? 아니면 git rev-list -1 <tag>?
Jakub Narębski

51
@ Jakub : git rev-parse $TAG태그 객체가 가리키는 커밋이 아닌 SHA1 객체를 반환합니다. git rev-list -1그래도 작동합니다.
mipadi

11
@mipadi : 주석이없는 태그의 경우 문제가되지 않습니다. 주석이 달린 태그의 경우 주석이 달린 / 서명 된 태그를 사용 git rev-parse $TAG^{commit}하거나 git rev-parse $TAG^{}역 참조 할 수 있습니다.
Jakub Narębski

5
다음을 사용할 수 있습니다.git rev-list $TAG --max-count=1
b73

4
@RobinHsu : 당신이 한 경우 주석 , 태그로 생성되는 git tag -a또는 git tag -s다음, git rev-parse <tag>당신에게의 SHA-1 줄 것 태그 객체 하면서, 자체 git rev-list -1 <tag>의 SHA-1을 줄 것 커밋 (개정)가로, 동일로 가리 킵니다 git rev-parse <tag>^{commit}. HTH.
Jakub Narębski

240
git show-ref --tags

예를 들어 git show-ref --abbrev=7 --tags다음과 같은 내용이 표시됩니다.

f727215 refs/tags/v2.16.0
56072ac refs/tags/v2.17.0
b670805 refs/tags/v2.17.1
250ed01 refs/tags/v2.17.2

고마워요, 이것은 실제로 .git/packed-refs또는 하나를 보는 의미를 숨 깁니다..git/refs/tags/*
Igor Zevaka

3
흠. 내 저장소에서 이상한 동작이 있습니다 : git tag -a v0.1.1-alpha a9dcc1f24cacde535523bddc22f4c69467428550; git show-ref --tags-> b784145a9a71478337f5ceae30aaac4e1b955ee5 refs / tags / v0.1.1-alpha; Jakub Narebski의 답변보기
NickSoft

6
git tag --verbose이것들도 보여주지 않는 것이 당연하지만 궁금 합니다.
nonopolarity 4

34
이것은 태그가 가리키는 커밋이 아니라 태그 자체의 참조를 보여줍니다. -d참조 된 커밋 (두 번째 줄)을 얻으려면 플래그 를 추가해야합니다 .
Old Pro

4
@CharlesBailey는 충분히 공평하지만 질문과 답변은 주석이 달린 태그를 포함하도록 변형되었으며 git show-ref두 가지 다른 유형의 태그에서 다르게 작동 한다는 사실 은 명백하거나 일반적인 지식이 아닙니다.
Old Pro

104

그냥 사용 git show <tag>

그러나 커밋 차이도 덤프합니다. 해당 diff를 생략하려면을 사용하십시오 git log -1 <tag>. (@DolphinDream 및 @demisx 감사합니다!)


7
따라서 질문에 여러 가지 가능한 답변이있는 경우 먼저 게시 된 답변이 먼저 올라가서 목록의 맨 위에 오게되어 나중에 더 많은 투표를받습니다. 응답 품질에 대한 응답 속도를 기반으로하는 바이어 싱 피드백 루프입니다. 충분한 상상력 으로이 문제를 해결할 수 있습니다.
samthebest

6
무엇에 대한 "최상의 솔루션"? 커밋의 SHA를 찾는 데 관심이 있다면 "git show <mytag>"를 가리키는 것이 최선의 해결책이 아닙니다. 이 명령은 커밋이 도입 한 전체 diff를 보여줍니다. 커밋의 SHA 만 나열하려면 태그가 "git rev-list <mytag> -n 1"을 가리키는 것이 올바른 해결책입니다.
DolphinDream 12

이것은 OP의 질문에 대한 답변이 아닙니다. git show <tag>태그가 가리키는 커밋이 아닌 diff를 보여줍니다.
demisx

@demisx 무슨 소리 야? 커밋 해시와 태거, 날짜 및 기타 정보를 확실히 보여줍니다. 시도 해봐.
Hlung

4
@Hlung @DolphinDream이 지적했듯이 git show화면에있을 필요가없는 훨씬 더 많은 것들을 화면에 덤프합니다. 찾고있는 실제 커밋 해시를 모호하게합니다. 더 나은 명령은 원 라이너를 원한다면 git log -1 [tag-name]또는 git log -1 --pretty=oneline [tag-name]입니다.
demisx

40

내 저장소 git show-ref TAG에서 태그의 해시가 아닌 커밋의 해시가 아닌 태그의 해시를 보여줍니다.

git show-ref --dereference TAG 또한 커밋이 가리키는 것을 보여줍니다.


34

에서 이고르 Zevaka :

요약

거의 똑같이 수용 가능하지만 다른 답변은 약 4 가지이므로 태그를 스키닝하는 모든 다른 방법을 요약합니다.

  1. git rev-list -1 $TAG( 답변 ). git rev-list출력까지 이어질 커밋 $TAG유사하기 git log만 커밋의 SHA1을 도시. 이 -1(가)이를 가리키는 커밋에 출력을 제한합니다.

  2. git show-ref --tags( answer )는 모든 태그 (로컬 및 원격에서 가져온) 및 해당 SHA1을 표시합니다.

  3. git show-ref $TAG( answer )은 SHA1과 함께 태그 및 경로를 표시합니다.

  4. git rev-parse $TAG( answer )는 주석이없는 태그의 SHA1을 표시합니다.

  5. git rev-parse --verify $TAG^{commit}( answer )는 주석이 달린 태그와 주석이없는 태그의 SHA1을 표시합니다. Windows에서는 git rev-parse --verify %TAG%^^^^{commit}(모자 4 개)를 사용하십시오.

  6. cat .git/refs/tags/*또는 태그가 로컬인지 또는 원격에서 가져 왔는지 여부에 따라 cat .git/packed-refs( answer ).


33

사용하다

git rev-parse --verify <tag>^{commit}

주석이 달린 태그의 경우에도 커밋의 SHA-1을 반환합니다.


git show-ref <tag><tag>주석을 달지 않으면 작동합니다 . 그리고 항상 있습니다 git for-each-ref(자세한 내용은 설명서를 참조하십시오).


11
나는 git rev-parse <tag>~0또한 어느 것이 작동 하는 것을 선호 하며 Windows에서 특별한 이스케이프가 필요하지 않습니다 (하나 대신 4 개의 모자 (^)가 필요합니다). 접미사 ~<number>는 <번호> 번째 부모 커밋을 제공하므로 ~0커밋 자체를 생성합니다. Btw ^0는 또한 ^{commit}개정 접미사 의 올바른 속기입니다 .
Attila

15

이건 어때요:

git log -1 $TAGNAME

또는

git log -1 origin/$TAGNAME

10

태그가 참조하는 커밋의 샤 / 해시를 얻으려면 (태그의 샤가 아님) :

git rev-list -1 <tag>


8

또한 "올바른"방법을 알고 싶지만 그 동안에는 다음을 수행 할 수 있습니다.

git show mytag | head -1    

커밋 제목git show --oneline mytag | head -1
Stphane

7

이것은 꽤 오래되었지만 커밋으로 태그를 나열하기 위해 방금 찾은 멋진 기능을 지적 할 것이라고 생각했습니다.

git log --decorate=full

커밋에서 종료 / 시작되는 브랜치와 커밋에 대한 태그가 표시됩니다.


4

태그가 사용하는 위치를보다 이해하기 쉽게 이해할 수 있습니다.

git log --graph |git name-rev --stdin --tags |less

를 통해 원하는 태그로 스크롤합니다 /.

더 컴팩트 한보기 ( --pretty=oneline)와 모든 헤드 ( -a)도 도움이 될 수 있습니다.

git log -a --pretty=oneline --graph |git name-rev --stdin --tags |less

약간 무섭게 보이지만 ~/.gitconfig필요한 경우 별칭을 지정할 수도 있습니다 .

~/.gitconfig

[alias]
ls-tags = !git log -a --pretty=oneline --graph |git name-rev --stdin --tags |less

4

짧은 Git-2 답변

나는이 질문이 꽤 오랫동안 여기에 있음을 알고 있습니다. CB Bailey의 답변은 100 % 정확합니다.git show-ref --tags --abbrev

나는 이것을 사용하기 때문에 이것을 좋아합니다 git tag.

git tag --list --format '%(refname:short) %(objectname:short)'

단순한. 짧은.

추신 git taglist:이 명령 으로 별칭을 지정하십시오 .

git config --global alias.taglist "tag --list --format '%(refname:short) %(objectname:short)'"

3

에서 자식 메일 링리스트 , 여기에 주석 태그 자동 역 참조와 태그를 해시를 커밋의 목록을 얻을 수있는 방법입니다 :

git for-each-ref --format='%(if)%(*objectname)%(then)%(*objectname)%(else)%(objectname)%(end) %(refname)' refs/tags

2

이것은 파일 이름을 표시하지 않지만 적어도 저장소의 느낌을 얻습니다.

cat .git/refs/tags/*

해당 디렉토리의 각 파일에는 커밋을 가리키는 커밋 SHA가 포함되어 있습니다.


리모콘에서 태그를 가져 왔을 때 작동하지 않았습니다. .git/packed-refs그래도 작동했습니다.
Igor Zevaka 2009

2

나는 또한 올바른 방법 을 알고 싶습니다 .하지만 항상 들여다 볼 수 있습니다.

$ cat .git/packed-refs 

또는:

$ cat .git/refs/tags/*

맞습니다. 따라서 압축 참조 및 참조 / 태그의 동작은 약간 다릅니다. 압축 참조는 태그 및 SHA를 포함하는 텍스트 파일이고, refs / tags /는 SHA를 포함하는 태그의 이름을 딴 텍스트 파일이있는 디렉토리입니다. 실제로이 작업을 수행 하는 올바른 방법은입니다 git rev-list.
Igor Zevaka 2009

2

이것은 당신에게 현재 SHA1 해시를 얻을 것입니다

약식 커밋 해시

git show <tag> --format="%h" --> 42e646e

커밋 해시

git show <tag> --format="%H" --> 42e646ea3483e156c58cf68925545fffaf4fb280

1
내가 가지고있는 버전에서 제대로 작동하지 않지만 것은 git log <tag> -n 1 --pretty=%H않습니다
앤디

2

SOMETAG 태그 (태그, 날짜 등)의 세부 정보를 보려면 커밋의 해시와 커밋에 대한 약간의 정보가 있지만 전체 차이점은 없습니다.

git show --name-status SOMETAG

출력 예 :

tag SOMETAG
Tagger: ....
Date:   Thu Jan 26 17:40:53 2017 +0100

 .... tag message .......

commit 9f00ce27c924c7e972e96be7392918b826a3fad9
Author: .............
Date:   Thu Jan 26 17:38:35 2017 +0100

 .... commit message .......

..... list of changed files with their change-status (like git log --name-status) .....

0

따라서 릴리스 폴더가 많이 있습니다.이 폴더는 몇 가지 다른 저장소 중 하나에서 체크 아웃 될 수 있으며 dev, qa 또는 master 브랜치이거나 프로덕션 릴리스, 태그에서 체크 아웃 될 수 있으며 태그는 주석이 달린 것인지 아닌지. 대상 폴더를보고--형식으로 답을 얻는 스크립트가 있습니다. 문제는 태그 체크 아웃에 대해 다른 버전의 git return different status '입니다.

그래서 git show-ref --tags주석이 달린 태그를 제외하고 처음에는 효과가있었습니다. 그러나 -d를 추가하면 태그 목록에 별도의 항목이 추가되었습니다. 하나는 태그이고 다른 하나는 주석입니다 (주석 커밋은 sed로 제거 된 ^ {}으로 식별되었습니다).

그래서 이것은 내 스크립트의 핵심입니다.

REPO=`git --git-dir=${TARGET} remote show origin -n | \
         grep "Fetch URL:" | \
         sed -E "s/^.*\/(.*)$/\1/" | \
         sed "s/.git$//"`

TAG=`git --git-dir=${TARGET} show-ref -d --tags | \
         grep \`git --git-dir=${TARGET} show --quiet --format=format:%H HEAD\` | \
         cut -d\  -f2 | \
         cut -d/ -f3 | \
         sed "s/\^{}$//"`

if [ "${TAG}" == "" ] ; then 
  BRANCH=`git --git-dir=${TARGET} show-ref --heads | \
         grep \`git --git-dir=${TARGET} show --quiet --format=format:%H HEAD\` | \
         cut -d\  -f2 | \
         cut -d/ -f3`
  TAG=${BRANCH}
fi

0

아래에서 사용할 수 있으며 커밋 해시를 제공합니다.
git show -s --format=%H <tag>^{commit}

약식 커밋 해시가 필요한 경우 git show -s --format=%h <tag>^{commit}

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