Programming

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

procodes 2020. 2. 18. 22:54
반응형

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


원격 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을 찾을 수 있습니다.


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 given tag
git tag -d <tag name>

# Don't forget to remove the deleted tag form the server with push tags

특정 태그를 복제하는 방법?

주어진 태그의 내용을 잡기 위해 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

모든 태그를 푸시하려면 :

git push --tags 

주석이 달린 태그 및 현재 히스토리 체인 태그를 푸시하려면 다음을 사용하십시오.

git push --follow-tags

이 플래그 --follow-tags는 커밋 및 둘 다인 태그 만 푸시 합니다.

  • 주석이 달린 태그 (로컬 / 임시 빌드 태그를 건너 뛸 수 있음)
  • 현재 분기 (히스토리에 있음)에서 도달 가능한 태그 (조상)

Git 2.4에서 구성을 사용하여 설정할 수 있습니다

git config --global push.followTags true


(이 답변은 작성하는 데 시간이 걸렸으며 codeWizard의 답변 은 목적과 본질이 정확하지만 완전히 완료되지는 않았으므로 어쨌든 게시 할 것입니다.)


"원격 Git 태그"와 같은 것은 없습니다. "태그"만 있습니다. 나는 학자,로 모든이 밖으로 포인트 1을 하지만, 거기에 캐주얼 힘내 사용자와 혼동의 큰 거래이며, 때문에 망할 놈의 문서는 매우 도움이되지 않습니다 2 초보자. (문서가 잘못되어 혼동이 발생하는지, 문서가 본질적으로 다소 혼란 스럽기 때문에 문서가 잘못 작성되었는지는 확실하지 않습니다.)

이 있습니다 더 제대로 "원격 추적 브랜치"라는 "원격 지사는"하지만, 그것의 가치는이 실제로 지역 단체 것을 지적. 그러나 (다시 발명하지 않는 한) 원격 태그는 없습니다. 로컬 태그 만 있으므로 태그를 사용하려면 로컬 태그를 가져와야합니다.

Git이 참조 하는 특정 커밋 이름의 일반적인 형식은로 시작하는 문자열입니다 refs/refs/heads/분기 이름으로 시작하는 문자열 refs/remotes/이름이 원격 추적 분기로 시작하는 문자열 refs/tags/태그로 시작하는 문자열 이름 refs/stash은 숨김 참조입니다 ( git stash후행 슬래시 부족에주의하십시오).

로 시작하지 않는 어떤 특별한 특수 케이스 이름이있다 refs/HEADORIG_HEADMERGE_HEAD, 그리고 CHERRY_PICK_HEAD특히 (하지만 특정 커밋을 참조 할 수 이름도 모두 HEAD일반적으로 브랜치의 이름, 즉, 포함을 포함하고는 ). 그러나 일반적으로 참조는로 시작합니다 .ref: refs/heads/branchrefs/

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 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에서 가져온 값으로 대체"를 의미합니다.

가져 오는 동안 Automagic 태그

역사적인 이유로, 3 당신이 둘 다 사용하는 경우 --tags옵션이나 --no-tags옵션을, git fetch특별한 조치를 취합니다. 위에서 말했듯이 원격은 로컬 Git이보고 싶어하는지 여부에 관계없이 모든 참조를 로컬 Git에 표시하는 것으로 시작됩니다 4 Git은이 시점에서 보는 모든 태그를 기록합니다. 그런 다음 가져 오는 모든 것을 처리하는 데 필요한 커밋 객체를 다운로드하기 시작할 때 해당 커밋 중 하나가 해당 태그와 동일한 ID를 가지고 있으면 git은 해당 태그 또는 여러 태그에 해당 ID가있는 경우 해당 태그를 추가합니다. 당신의 저장소.

편집 월 2017 : 힘내 2.10의 행동을 지금 보여줍니다 테스트 : 그 망할 놈이라는 태그를 제공하는 경우 T를 , 그리고 당신이라는 태그가없는 T를 , 그리고 커밋과 관련된 ID T는 자신의 가지 중 하나의 조상 당신 git fetch이 검사하고 있다는 것을 Git 은 태그에 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를 제공합니다. 그러나-그리고 이것이 누락 된 것입니다 gitrevisionsgit 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은을 시도 하기 때문에 태그가 지정된 커밋을 식별하기 위해 간단히 작성할 수도 있습니다 (사람이 이름이 유효한 참조 쓰고 관리하는 경우 에를 , 그러나,이 같은 해결됩니다 . 그러나 일반적으로 단지 다양한 이름으로해야한다 .)refs/nametags/xyzzyxyzzyxyzzy$GIT_DIR$GIT_DIR/xyzzy*HEAD$GIT_DIR


1 좋아, 좋아, "하지  학자 연하는 방법"을 참조하십시오. :-)

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

3 기본적으로, git fetch원격 및 참조 사양의 전체 개념은 Git 1.5 즈음에 발생하는 Git에 대한 약간의 늦은 추가였습니다. 그 전에는 임시 특수한 경우가 있었고 태그 가져 오기도 그중 하나 였기 때문에 특수 코드를 통해 시작되었습니다.

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


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

참고 URL : https://stackoverflow.com/questions/35979642/what-is-git-tag-how-to-create-tags-how-to-checkout-git-remote-tags


반응형