답변:
태그는 히스토리에서 특정 커밋 에 레이블을 지정하고 표시하는 데 사용됩니다 .
일반적으로 릴리스 지점 (예 : v1.0 등)을 표시하는 데 사용됩니다.태그가 브랜치와 유사하게 보일 수 있지만 태그는 변경되지 않습니다 . 그것은 지적 직접 A를 특정 커밋 역사에서.
태그가 리포지토리에 로컬로 있지 않으면 태그를 체크 아웃 할 수 없으므로 먼저 fetch
로컬 리포지토리에 태그를 지정해야합니다.
먼저 태그를 로컬에 존재하는지 확인하십시오
# --all will fetch all the remotes.
# --tags will fetch all tags as well
$ git fetch --all --tags --prune
그런 다음 실행하여 태그를 확인하십시오.
$ git checkout tags/<tag_name> -b <branch_name>
접두사 를 origin
사용하는 대신 tags/
.
이 샘플에는 2 개의 태그 버전 1.0 및 버전 1.1이 있으며 다음 중 하나를 사용하여 확인할 수 있습니다.
$ git checkout A ...
$ git checkout version 1.0 ...
$ git checkout tags/version 1.0 ...
태그는 주어진 커밋에 대한 포인터 일 뿐이므로 위의 모든 작업은 동일합니다.
출처 : https://backlog.com/git-tutorial/img/post/stepup/capture_stepup4_1_1.png
# list all tags
$ git tag
# list all tags with given pattern ex: v-
$ git tag --list 'v-*'
태그를 만드는 방법은 두 가지가 있습니다.
# lightweight tag
$ git tag
# annotated tag
$ git tag -a
2의 차이점은 주석이 달린 태그를 만들 때 git commit에서와 같이 메타 데이터를 추가 할 수 있다는 것입니다 :
이름, 전자 메일, 날짜, 주석 및 서명
# delete any (local) given tag
$ git tag -d <tag name>
# Delete a tag from the server with push tags
$ git push --delete origin <tag name>
주어진 태그의 내용을 파악하기 위해 checkout
명령을 사용할 수 있습니다 . 위에서 설명한 것처럼 태그는 다른 커밋과 비슷하므로 checkout
SHA-1을 사용하는 대신 tag_name으로 간단히 대체 할 수 있습니다.
옵션 1:
# Update the local git repo with the latest tags from all remotes
$ git fetch --all
# checkout the specific tag
$ git checkout tags/<tag> -b <branch>
옵션 2 :
git은 clone 명령 에를 추가하여 얕은 복제 를 지원하므로 --branch
분기 이름 대신 태그 이름을 사용할 수 있습니다. Git은 주어진 SHA-1을 관련 커밋으로 "번역"하는 방법을 알고 있습니다.
# Clone a specific tag name using git clone
$ git clone <url> --branch=<tag_name>
자식 복제본 --branch =
--branch
결과 저장소에서 해당 커밋에서 태그를 가져와 HEAD를 분리 할 수도 있습니다.
git push --tags
모든 태그를 푸시하려면 :
# Push all tags
$ git push --tags
refs/tags
지정하는 대신를 사용하십시오 <tagname>
.왜? - refs/tags
때때로 태그는 브랜치와 동일한 이름을 가질 수 있으며 간단한 git push는 태그 대신 브랜치를 푸시하므로 사용하는 것이 좋습니다.
주석이 달린 태그 및 현재 히스토리 체인 태그를 푸시하려면 다음을 사용하십시오.
git push --follow-tags
이 플래그 --follow-tags
는 커밋 과 둘 다인 태그 만 푸시 합니다.
Git 2.4부터 구성을 사용하여 설정할 수 있습니다
$ git config --global push.followTags true
A
커밋 해시
git checkout tags/<tag_name> -b <branch_name>
을 필요로 않습니다 -b <branch_name>
. git checkout tags/<tag_name>
분리 된 머리를 줬어 분리 된 헤드에 대한 이 기사에 따르면 분기를 임시로 작성하고 삭제하여 분리 된 헤드를 피할 수 있습니다. 이것은 꽤 외계인 작업 흐름입니다. 분명히 자식 사용자로서 재미와 이익을 위해 가지를 만들고 삭제하는 데 익숙해 져야합니다.
(이 답변은 작성하는 데 시간이 걸렸으며 codeWizard의 답변 은 목적과 본질이 정확하지만 완전히 완료되지는 않았으므로 어쨌든 게시 할 것입니다.)
"원격 Git 태그"와 같은 것은 없습니다. "태그"만 있습니다. 나는이 모든 것이 현명하지 않다는 점을 지적 하지만 , 1 일반적인 Git 사용자와 이것에 대해 많은 혼란이 있기 때문에 Git 문서는 그다지 도움이되지 않는다 2 초보자. (문서가 잘못되어 혼동이 발생하는지, 문서가 본질적으로 다소 혼란 스럽기 때문에 문서가 잘못 작성되었는지는 확실하지 않습니다.)
이 있습니다 더 제대로 "원격 추적 브랜치"라는 "원격 지사는"하지만, 그것의 가치는이 실제로 지역 단체 것을 지적. 그러나 (다시 발명하지 않는 한) 원격 태그는 없습니다. 로컬 태그 만 있으므로 태그를 사용하려면 로컬 태그를 가져와야합니다.
Git이 참조 하는 특정 커밋의 이름에 대한 일반적인 형식은로 시작하는 문자열입니다 refs/
. refs/heads/
분기 이름으로 시작하는 문자열 . refs/remotes/
원격 추적 브랜치로 시작하는 문자열 ; refs/tags/
태그로 시작하는 문자열 . 이름 refs/stash
은 숨김 참조입니다.git stash
후행 슬래시가 없음에 유의하십시오).
로 시작하지 않는 어떤 특별한 특수 케이스 이름이있다 refs/
: HEAD
, ORIG_HEAD
, MERGE_HEAD
, 그리고 CHERRY_PICK_HEAD
특히 (하지만 특정 커밋을 참조 할 수 이름도 모두 HEAD
일반적으로 브랜치의 이름, 즉, 포함을 포함하고는 ). 그러나 일반적으로 참조는로 시작합니다 .ref: refs/heads/branch
refs/
Git이이 혼동을 일으키기 위해하는 한 가지는 refs/
, 그리고 종종 뒤에 나오는 단어 를 생략 할 수 있다는 것 refs/
입니다. 예를 들어, 당신은 생략 할 수 있습니다 refs/heads/
또는 refs/tags/
로컬 지점 또는 참조 할 때 태그 사실이 있어야 생략 refs/heads/
로컬 브랜치를 체크 아웃 할 때! 결과가 모호하지 않거나 방금 언급 한대로 (해야 할 때)이 작업을 수행 할 수 있습니다 .git checkout branch
참조는 자신의 저장소뿐만 아니라 원격 저장소에도 존재한다는 것은 사실입니다. 그러나 Git은 매우 특정한 시간, 즉, 작업 중 fetch
및 push
작업 시에만 원격 저장소 참조에 액세스 할 수 있습니다 . 당신은 또한 사용할 수 있습니다 git ls-remote
또는 git remote show
그들을 볼 수 있지만, fetch
및 push
접촉의 더 흥미로운 점이다.
시 fetch
와 push
, 힘내 문자열을 사용이 호출 refspecs을 로컬 및 원격 저장소 사이의 참조를 전송합니다. 따라서이 시점과 참조 사양을 통해 두 개의 Git 리포지토리가 서로 동기화 될 수 있습니다. 이름이 동기화되면 원격 사용자와 동일한 이름을 사용할 수 있습니다. 여기에 특별한 마술이 있습니다fetch
그러나 , 지점 이름과 태그 이름 모두에 영향을 미칩니다.
git fetch
Git이 다른 Git ( "원격")을 불러 오거나 대화를하도록 지시하는 것으로 생각해야 합니다. 이 대화의 초반에 리모콘은 모든 참조 refs/heads/
와 모든 참조 및 refs/tags/
기타 참조를 모두 나열합니다 . Git은이를 통해 스캔하고 (일반적인 페치 참조 스펙에 따라) 브랜치의 이름을 바꿉니다 .
다음과 같은 리모트의 일반적인 참조 스펙을 살펴 보자 origin
:
$ git config --get-all remote.origin.fetch
+refs/heads/*:refs/remotes/origin/*
$
이 참조 스펙은 Git에 모든 이름 일치 ( refs/heads/*
즉, 원격의 모든 분기) 를 가져 와서 이름을로 변경합니다 refs/remotes/origin/*
. 즉, 일치하는 부분을 동일하게 유지하여 분기 이름 ( refs/heads/
)을 원격 추적 분기 이름 ( refs/remotes/
)으로 변경합니다. , refs/remotes/origin/
).
그것은이다 이 refspec을 통해 것을 origin
의 지점 원격에 대한 원격 추적 브랜치된다 origin
. 지점 이름은 원격 추적 지점 이름이되며이 경우 원격 이름이 origin
포함됩니다. +
refspec 앞의 더하기 부호 는 "force"플래그를 설정합니다. 즉, 원격 추적 분기는 일치하게하는 데 관계없이 원격 분기 이름과 일치하도록 업데이트됩니다. (없이는 +
지점 업데이트가 "빨리 감기"변경으로 제한되며, 태그 업데이트는 Git 버전 1.8.2 이후부터 무시됩니다. 그 전에 동일한 빠른 전달 규칙이 적용됩니다.)
그러나 태그는 어떻습니까? 최소한 기본적으로는 아닙니다. 하나를 설정할 수 있으며,이 경우 참조 사양의 형태는 귀하에게 달려 있습니다. 또는 당신은 실행할 수 있습니다 git fetch --tags
. 사용은 --tags
추가의 효과가 refs/tags/*:refs/tags/*
즉 refspec에를, 모든 태그를 통해 제공합니다 ( 그러나 업데이트하지 않습니다 당신의 당신은 이미 그 이름을 가진 태그가있는 경우, 태그 에 관계없이 원격의 태그의 말씀의 편집 월 2017 : 힘내 2.10로 테스트 결과에 따르면 참조 사양을 --tags
읽는 것처럼 리모컨의 태그에서 태그 를 강제로 업데이트 하는 것으로 나타났습니다 +refs/tags/*:refs/tags/*
. 이는 이전 버전의 Git과 동작에 차이가있을 수 있습니다).
원격 경우 : 참고가된다는 여기서 이름을 변경하지 origin
태그가 xyzzy
, 당신은하지 않습니다, 당신은 git fetch origin "refs/tags/*:refs/tags/*"
, 당신은 얻을 refs/tags/xyzzy
(동일 리모컨으로 커밋 가리키는) 저장소에 추가됩니다. +refs/tags/*:refs/tags/*
태그 를 사용하는 경우 태그 xyzzy
가 있으면 의 태그 로 대체 됩니다 origin
. 즉, +
refspec 의 force 플래그는 "내 Git이 Git에서 얻은 값으로 내 참조 값을 대체합니다"를 의미합니다.
역사적인 이유로, 3 당신이 둘 다 사용하는 경우 --tags
옵션이나 --no-tags
옵션을, git fetch
특별한 조치를 취합니다. 위에서 언급했듯이 원격은 로컬 Git이보고 싶어하는지 여부에 관계없이 로컬 Git에 모든 참조 를 표시하여 시작한다는 것을 기억하십시오 . 4 Git은이 시점에서 보이는 모든 태그를 기록합니다. 그런 다음 커밋 객체를 다운로드하기 시작할 때 가져 오는 모든 것을 처리해야합니다. 커밋 중 하나가 해당 태그와 동일한 ID를 갖는 경우 git은 해당 태그 또는 여러 태그에 해당 ID가있는 경우 해당 태그를 추가합니다. 당신의 저장소.
편집 월 2017 : 힘내 2.10의 행동을 지금 보여줍니다 테스트 : 그 망할 놈이라는 태그를 제공하는 경우 T를 , 그리고 당신이라는 태그가없는 T를 , 그리고 커밋과 관련된 ID T는 자신의 가지 중 하나의 조상 당신의 것을 git fetch
조사한다, 당신 힘내 추가 T를 유무에 관계없이 태그에 --tags
. 추가 --tags
하면 Git이 모든 태그 를 가져 오고 강제로 업데이트합니다.
git fetch --tags
태그를 얻기 위해 사용해야 할 수도 있습니다 . 태그 이름이 기존 태그 이름과 충돌하는 경우 (Git 버전에 따라) 일부 태그를 삭제하거나 이름을 바꾼 다음 태그를 가져와야 할 수도 있습니다git fetch --tags
. 원격 지사와 달리 태그의 이름은 자동으로 바뀌지 않으므로 태그 이름이 태그 이름과 일치해야하므로 충돌 문제가 발생할 수 있습니다.
그러나 대부분의 경우 간단한 git fetch
작업으로 커밋과 일치하는 태그를 가져오고 커밋을 게시 할 때 커밋에 태그를 추가하므로 태그를 따라야합니다. 고유 한 태그를 만들지 않거나 여러 리포지토리를 통해 여러 리포지토리와 리포지토리를 혼합하지 않으면 태그 이름 충돌이 발생하지 않으므로 태그를 삭제하거나 이름을 바꾸지 않아도됩니다. 태그를 얻습니다.
나는 당신이 생략 할 수 있음을 위에서 언급 refs/
하고, 거의 항상 refs/heads/
하고 refs/tags/
그래서 대부분의 시간에. 하지만 언제 할 수 없습니까?
전체 (또는 거의 완전한 어쨌든) 대답에 문서 . Git은 링크에 제공된 6 단계 시퀀스를 사용하여 이름을 커밋 ID로 해석합니다. 흥미롭게도 태그는 분기를 재정의합니다. 태그 와 분기 가 있고 다른 커밋을 가리키는 경우 :gitrevisions
xyzzy
xyzzy
git rev-parse xyzzy
태그가 가리키는 ID를 알려줍니다. 그러나-이 무엇에서 실종이다 gitrevisions
- git checkout
, 지점 이름을 선호하므로 git checkout xyzzy
태그를 무시하고, 지점에 넣을 것입니다.
모호한 경우 거의 항상 전체 이름 refs/heads/xyzzy
또는을 사용하여 심판 이름을 철자 할 수 있습니다 refs/tags/xyzzy
. (이 작업 은 작동 git checkout
하지만 예기치 않은 방식으로 작동합니다. git checkout refs/heads/xyzzy
분기 체크 아웃 대신 분리 된 HEAD 체크 아웃이 발생 git checkout
하므로 짧은 이름을 먼저 브랜치 이름으로 사용 한다는 점에 유의해야 합니다. xyzzy
태그 xyzzy
가 있어도 지점 을 확인하십시오. 태그 를 확인하려면을 사용할 수 있습니다 refs/tags/xyzzy
.)
gitrevisions
Git은 ( 노트 로서 ) 시도 하기 때문에 , commit 된 태그를 식별하기 위해 간단히 쓸 수도있다 . (누군가 로 이름이 지정된 유효한 참조를 작성했다면 이는로 해석되지만 일반적으로 다양한 이름 만 있어야합니다 .)refs/name
tags/xyzzy
xyzzy
xyzzy
$GIT_DIR
$GIT_DIR/xyzzy
*HEAD
$GIT_DIR
1 좋아, " 단순한 사람이 아니라 ". :-)
2 어떤 사람들은 "매우 도움이되지 않는다"고 말하고 실제로 동의하는 경향이 있습니다.
3 기본적으로, git fetch
리모컨과 참조 스펙의 전체 개념은 Git 1.5에 약간 늦은 늦은 Git에 추가되었습니다. 그 전에는 특별한 특별 사례가 있었고 태그 가져 오기도 그 중 하나 였으므로 특수 코드를 통해 할아버지가되었습니다.
네 도움이된다면은으로 원격 망할 놈의 생각 노출증 속어의 의미로.
git fetch
주어진 리모콘의 태그 만 가져옵니다 --tags
.
--tags
, --no-tags
및 기본은 사실은 꽤 까다 롭습니다. 기본값은 가지고있는 커밋에없는 태그를 가져 오는 것입니다. (2017 년 1 월 편집 참조) 그러나 여기에도 결함이 있으며 현대 Git에는 --tags / -태그를 처리하는 태그가 다시 수정되지 않아서 더 특별한 경우가 발생할 수 있습니다.
git checkout A
. 무엇A
입니까? 어떻게 만들었A
습니까?