자식 태그 란 무엇입니까, 태그를 만드는 방법 및 자식 원격 태그를 체크 아웃하는 방법


523

원격 git 태그 사용 명령을 다음과 같이 체크 아웃 할 때 :

git checkout -b local_branch_name origin/remote_tag_name

다음과 같은 오류가 발생했습니다.

error: pathspec `origin/remote_tag_name` did not match any file(s) known to git.

git tag 명령을 사용할 때 remote_tag_name을 찾을 수 있습니다.

답변:


1154

git의 태그가 무엇인지 설명하면서 시작합시다.

여기에 이미지 설명을 입력하십시오

태그는 히스토리에서 특정 커밋 에 레이블을 지정하고 표시하는 데 사용됩니다 .
일반적으로 릴리스 지점 (예 : 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명령을 사용할 수 있습니다 . 위에서 설명한 것처럼 태그는 다른 커밋과 비슷하므로 checkoutSHA-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 :

clone 명령 사용

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

컨닝 지: 여기에 이미지 설명을 입력하십시오



3
좋은. git checkout A. 무엇 A입니까? 어떻게 만들었 A습니까?
Honey

3
@CodeWizard 멋진 순서도! 어떤 소프트웨어를 사용하여 제작 했습니까?
Giovanni Lovato

4
@Honey는 A커밋 해시
알렉스 Baklanov

2
@GiovanniLovato 순서도는 타사입니다. 이미지에 대한 링크는 backlog.com/git-tutorial/img/post/stepup/…이며이 페이지에서 Git Beginner 's Guide for Dummies (backlog) 웹 사이트의 backlog.com/git-tutorial/stepup/stepup4_1.html .com).
조지

2
그것의 가치는 그 지적 git checkout tags/<tag_name> -b <branch_name>을 필요로 않습니다 -b <branch_name>. git checkout tags/<tag_name>분리 된 머리를 줬어 분리 된 헤드에 대한기사에 따르면 분기를 임시로 작성하고 삭제하여 분리 된 헤드를 피할 수 있습니다. 이것은 꽤 외계인 작업 흐름입니다. 분명히 자식 사용자로서 재미와 이익을 위해 가지를 만들고 삭제하는 데 익숙해 져야합니다.
icc97

194

(이 답변은 작성하는 데 시간이 걸렸으며 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/branchrefs/

Git이이 혼동을 일으키기 위해하는 한 가지는 refs/, 그리고 종종 뒤에 나오는 단어 를 생략 할 수 있다는 것 refs/입니다. 예를 들어, 당신은 생략 할 수 있습니다 refs/heads/또는 refs/tags/로컬 지점 또는 참조 할 때 태그 사실이 있어야 생략 refs/heads/로컬 브랜치를 체크 아웃 할 때! 결과가 모호하지 않거나 방금 언급 한대로 (해야 할 때)이 작업을 수행 할 수 있습니다 .git checkout branch

참조는 자신의 저장소뿐만 아니라 원격 저장소에도 존재한다는 것은 사실입니다. 그러나 Git은 매우 특정한 시간, 즉, 작업 중 fetchpush작업 시에만 원격 저장소 참조에 액세스 할 수 있습니다 . 당신은 또한 사용할 수 있습니다 git ls-remote또는 git remote show그들을 볼 수 있지만, fetchpush접촉의 더 흥미로운 점이다.

참조 사양

fetchpush, 힘내 문자열을 사용이 호출 refspecs을 로컬 및 원격 저장소 사이의 참조를 전송합니다. 따라서이 시점과 참조 사양을 통해 두 개의 Git 리포지토리가 서로 동기화 될 수 있습니다. 이름이 동기화되면 원격 사용자와 동일한 이름을 사용할 수 있습니다. 여기에 특별한 마술이 있습니다fetch그러나 , 지점 이름과 태그 이름 모두에 영향을 미칩니다.

git fetchGit이 다른 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로 해석합니다. 흥미롭게도 태그는 분기를 재정의합니다. 태그 와 분기 가 있고 다른 커밋을 가리키는 경우 :gitrevisionsxyzzyxyzzy

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.)

gitrevisionsGit은 ( 노트 로서 ) 시도 하기 때문에 , commit 된 태그를 식별하기 위해 간단히 쓸 수도있다 . (누군가 로 이름이 지정된 유효한 참조를 작성했다면 이는로 해석되지만 일반적으로 다양한 이름 만 있어야합니다 .)refs/nametags/xyzzyxyzzyxyzzy$GIT_DIR$GIT_DIR/xyzzy*HEAD$GIT_DIR


1 좋아, " 단순한 사람이 아니라 ". :-)

2 어떤 사람들은 "매우 도움이되지 않는다"고 말하고 실제로 동의하는 경향이 있습니다.

3 기본적으로, git fetch리모컨과 참조 스펙의 전체 개념은 Git 1.5에 약간 늦은 늦은 Git에 추가되었습니다. 그 전에는 특별한 특별 사례가 있었고 태그 가져 오기도 그 중 하나 였으므로 특수 코드를 통해 할아버지가되었습니다.

도움이된다면은으로 원격 망할 놈의 생각 노출증 속어의 의미로.


훌륭한 글쓰기. 하나의 작은 니트 : arg가 git fetch주어진 리모콘의 태그 만 가져옵니다 --tags.
cweekly

@cweekly :의 동작 --tags, --no-tags및 기본은 사실은 꽤 까다 롭습니다. 기본값은 가지고있는 커밋에없는 태그를 가져 오는 것입니다. (2017 년 1 월 편집 참조) 그러나 여기에도 결함이 있으며 현대 Git에는 --tags / -태그를 처리하는 태그가 다시 수정되지 않아서 더 특별한 경우가 발생할 수 있습니다.
torek

1

git 태그를 체크 아웃하려면 다음 명령을 실행하십시오.

git checkout tags/tag-name -b branch-name

예를 들어 아래에 언급 된 바와 같이.

 git checkout tags/v1.0 -b v1.0-branch

모든 태그를 가져 오려면 다음 명령을 사용하십시오.

git fetch --all --tags

0

특정 태그 코드를 얻으려면 새 분기를 작성하여 태그 코드를 얻으십시오. 나는 명령으로 그것을했다 :$git checkout -b newBranchName tagName

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