Git 태그는 현재 브랜치에만 적용됩니까?


156

현재 여러 지점이있는 저장소를 사용하고 있습니다.

태그를 만들 때 해당 태그는 당시의 분기를 참조합니까?

즉, 태그를 만들 때마다 해당 지점에서 원하는 지점으로 전환하고 해당 지점에서 태그를 지정하여 해당 지점에서 해당 지점을 참조해야합니까?

답변:


151

예를 들어 태그를 생성하면

git tag v1.0

태그는 현재 사용중인 지점의 가장 최근 커밋을 나타냅니다. 지점을 변경하고 거기에 태그를 만들 수 있습니다.

태그를 지정하는 동안 다른 지점을 참조 할 수도 있습니다.

git tag v1.0 name_of_other_branch

다른 분기의 가장 최근 커밋에 대한 태그를 만듭니다.

또는 어떤 커밋의 SHA1을 직접 참조하여 어느 브랜치에 관계없이 태그를 어디에나 배치 할 수 있습니다

git tag v1.0 <sha1>

201

CharlesB의 답변helmbert의 답변 은 모두 도움이되지만 이해하는 데 시간이 걸렸습니다. 그것을 넣는 또 다른 방법이 있습니다.

  • 태그 A는 커밋에 대한 포인터 , 그리고 커밋은 가지 독립적으로 존재한다 .
    • 이해하는 것이 중요하다 태그에는없는 직접 지점과의 관계를 - 그들은 단지 이제까지 식별 커밋 .
      • 이 커밋은 여러 가지 지점에서 지적 될 수 있습니다. 즉, 아무 것도 포함하지 않고 여러 가지 기록의 일부가 될 수 있습니다.
    • 따라서 git show <tag>태그의 세부 사항을보기 위해 실행 하면 분기에 대한 참조가없고 태그가 가리키는 커밋의 ID 만 포함됩니다.
      • (40 문자열 16 진수로 구성되는) 객체 이름 또는 SHA-1 아이디 일명 ID를 (커밋 내용을 통해 해시가 커밋 숫자, 예를 :. 6f6b5997506d48fc6267b0b60c3f0261b6afe7a2)
  • 지점은 간접적으로 만 작동합니다 .
    • 당시 만드는 태그를 하여 을 의미 커밋 태그가 가리키는 것입니다 :
      • 태그에 대상을 지정하지 않으면 기본값은 현재 분기의 최신 커밋 (일명 HEAD)입니다. 예 :
        • git tag v0.1.0 # tags HEAD of *current* branch
      • 분기 이름을 태그 대상으로 지정하면 해당 분기의 가장 최근의 커밋이 기본값이됩니다. 예 :
        • git tag v0.1.0 develop # tags HEAD of 'develop' branch
      • (다른 사람들이 언급했듯이 커밋 ID를 태그의 대상으로 명시 적으로 지정할 수도 있습니다.)
    • git describe현재 분기를 설명하는 데 사용 하는 경우 :
      • git describe [--tags]이 분기 히스토리에서 가장 최근의 [가벼운] 태그 이후 커밋 측면에서 현재 분기를 설명합니다 .
      • 따라서에 의해 참조 된 태그 git describe는 가장 최근에 생성 된 태그 전체를 반영하지 않을 수 있습니다 .

따라서 특정 태그 (예 : v0.1.0)에 대해 실제 소스 (해당 소스)에있는 실제 소스를 확인하려면 빌드의 기반이 된 분기를 알아야합니다. 즉, 주어진 커밋은 다른 브랜치에서 다른 자손을 가질 수 있습니다.
Hawkeye Parker

2
@HawkeyeParker : 더 이상 이것에 몰두하지 않지만 태그는 특정 커밋 (여러 가지의 일부가 될 수 있음)을 식별하고 거기에서 조사 할 수 있기 때문에 가지를 알 필요가 없습니다.
mklement0

그러나 git show [tagname]을 수행하면 Author 및 Date 위에 분기 이름이 표시되는데, "git show <tag>를 실행하여 태그의 세부 정보가 분기에 대한 참조를 포함하지 않는다"는 것과 상충됩니다.
Brad Thomas

39

태그는 특정 커밋을 참조하고 브랜치는 히스토리의 마지막 커밋에 대한 이동 참조이므로 태그와 브랜치는 완전히 관련이 없습니다. 지점은 가고 태그는 유지됩니다.

따라서 커밋에 태그를 지정할 때 git은 태그하려는 대상의 SHA1을 제공하면 어떤 커밋 또는 분기가 체크 아웃되었는지 상관하지 않습니다.

분기를 참조하여 태그를 지정할 수도 있고 (그러면 분기의 팁에 태그를 지정 함) 나중에 분기의 팁이 다른 곳에 ( git reset --hard예를 들어) 있다고 말 하거나 분기를 삭제할 수 있습니다. 그러나 내가 만든 태그는 움직이지 않습니다.


17
다시 말해, 태그는 못생긴 자식 해시에 대한 좋은 이름입니다. 태그 (및 해시)는 존재하는 브랜치에 관계없이 존재합니다.
C-Otto

8

git tag <TAGNAME>추가 매개 변수없이 호출하면 Git은 현재 HEAD (예 : 현재 지점의 HEAD)에서 새 태그를 만듭니다. 이 분기에 추가 커밋을 추가하면 분기 HEAD가 새 커밋을 유지하지만 태그는 항상 동일한 커밋을 나타냅니다.

호출 git tag <TAGNAME> <COMMIT>할 때 태그 작성에 사용할 커밋을 지정할 수도 있습니다.

그럼에도 불구하고, 태그는 여전히 특정 커밋 (브랜치가 아닌)에 대한 "포인터"입니다.


6

과거 커밋에 대한 태그를 만들 수 있습니다.

git tag [tag_name] [reference_of_commit]

예 :

git tag v1.0 5fcdb03

1

현재 지점에 태그를 지정하려면 다음을 입력하십시오.

git tag <tag>

다음을 사용하여 분기를 푸시하십시오.

git push origin --tags

0

같은 지점에서 태그를 만들려면 release/yourbranch다음과 같은 것을 사용해야합니다

git tag YOUR_TAG_VERSION_OR_NAME origin/release/yourbranch

태그를 원격으로 푸시하려면 적절한 태그를 만든 후 다음 명령을 사용하십시오

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