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.