Git의 태그와 다른 점은 무엇입니까? 여기서 어느 것을 사용해야합니까?


615

태그분기 를 사용하는 방법을 이해하는 데 어려움이 있습니다 ..

방금 코드의 현재 버전을 이제 특정 기능을 위해 해당 코드의 하위 집합을 작업 할 것입니다. 다른 개발자들도이 작업을 수행 할 것입니다. 그러나 우리 그룹의 모든 개발자가이 기능에 관심을 갖지는 않습니다. 지점이나 태그를 만들어야합니까? 어떤 상황에서 하나를 사용해야합니까?


4
git 태그를 사용하는 방법에 대한 웹 검색이 먼저 해당 링크로 연결
되었으므로

답변:


519

태그는 한 순간 특정 지점의 버전을 나타냅니다. 분기 와 동일한 코드베이스에 다른 개발 노력과 동시에 실행할 수 있습니다 개발의 별도의 스레드를 나타냅니다. 지점에 대한 변경 사항은 결국 다른 지점으로 병합되어 통합 될 수 있습니다.

일반적으로 특정 버전에 태그를 지정 하여 다시 만들 수 있습니다. 예를 들어 XYZ Corp에 제공 한 버전 입니다. 지점는 코드의 개발을 계속하면서 특정 버전의 코드에 대한 지속적인 업데이트를 제공하는 전략입니다. 전달 된 버전의 브랜치를 만들고 메인 라인에서 개발을 계속하지만 전달 된 버전을 나타내는 브랜치에 버그를 수정합니다. 결국이 버그 수정을 기본 라인으로 다시 병합합니다. 종종 분기와 태그를 함께 사용합니다. 배달, 버그 진단 등을 위해 다시 만들려는 각 지점을 따라 메인 라인과 특정 버전 (예 : 고객에게 배달 된 버전)을 표시하는 지점에 모두 적용 할 수있는 다양한 태그가 있습니다.

실제로 이보다 더 복잡하거나 원하는만큼 복잡하지만이 예제는 차이점에 대한 아이디어를 제공해야합니다.


40
그의 경우에 그는 가지를 사용하고 싶을 것입니다. 아마도 당신의 대답에서도 이것을 주목해야합니다;)
knittl

13
AFAIK, 태그는 지점마다 고유하지 않습니다. 따라서 별도의 분기에서 다른 커밋에 동일한 이름을 지정할 수 없습니다.
MY

5
@MY 확실히 나쁜 것은 아닙니다. IMHO. 특히 tvanfosson이 설명한 방식으로 서로 다른 브랜치에서 동일한 이름을 가진 태그가 두 개 이상 있으면 유지 관리가 어려워 질 수 있습니다. 예를 들어 다른 브랜치에서 같은 이름의 태그를 가질 있다면 나쁜 습관으로 빠르게 설정 될 것이라고 생각합니다. 그래도 할 수 없다는 것을 알고 반갑습니다. 고마워요!
스위블

28
태그는 커밋 해시의 별칭 일뿐입니다. 커밋을 체크 아웃 git checkout 88c9f229f할 수있는 것과 같은 것을 할 수 git checkout your_tag있으며 태그로 별칭이 지정된 커밋을 체크 아웃합니다.
jterm

6
@jterm, 브랜치 별칭도 아닌가요? 유일한 차이점은 브랜치 별칭이 자동으로 체인에서 가장 최근의 커밋을 재 지정한다는 것입니다.
Viktor Molokostov

529

로부터 이론적 관점 :

  • 태그 는 주어진 개정에 대한 상징적 인 이름입니다 . 그것들은 항상 같은 객체를 가리킨다 (보통 : 동일한 개정판을 가리킨다). 그들은 변하지 않습니다.
  • 브랜치개발 라인의 상징적 이름입니다 . 브랜치 위에 새로운 커밋이 생성됩니다. 분기 포인터는 자연스럽게 진행되어 새로운 커밋을 나타냅니다.

로부터 기술적 관점 :

  • 태그refs/tags/네임 스페이스에 상주하며 태그 객체 (주석이 있거나 선택적으로 GPG 서명 태그)를 가리 키 거나 객체를 직접 커밋 (로컬 이름에 사용되는 경량 태그가 거의 없음)하거나 아주 드물게 트리 객체 또는 BLOB 객체를 가리킬 수도 있습니다 (예 : GPG 서명)를 가리킬 수 있습니다. ).
  • 브랜치refs/heads/네임 스페이스에 상주하며 객체커밋하는 것만 가리킬 수 있습니다 . 그만큼HEAD포인터 분기 (심볼 참조) 또는 직접 커밋 (또는 분리 HEAD 이름 점)을 참조한다.
  • 원격 추적 분기refs/remotes/<remote>/네임 스페이스에 있으며 원격 저장소에서 일반 분기를 따릅니다 <remote>.

gitglossary 맨 페이지를 참조하십시오 .

분기

"분기"는 활발한 개발 라인입니다. 지점에서 가장 최근의 커밋을 해당 지점의 팁이라고합니다. 브랜치의 팁은 브랜치 헤드에서 참조되며, 브랜치 헤드에서 추가 개발이 완료되면 앞으로 나아갑니다. 단일 자식 저장소는 임의의 수의 분기를 추적 할 수 있지만 작업 트리는 그 중 하나 ( "현재"또는 "체크 아웃 된"분기) 와만 관련되며 HEAD는 해당 분기를 가리 킵니다.

꼬리표

태그 또는 커밋 객체를 가리키는 참조입니다. 헤드와 달리, 커밋에 의해 태그가 변경되지 않습니다. 태그 (태그 객체가 아님)는에 저장됩니다 $GIT_DIR/refs/tags/. [...]. 태그는 가장 일반적으로 확약 체인에서 특정 지점을 표시하는 데 사용됩니다.

태그 객체

커밋 객체처럼 메시지를 포함 할 수있는 다른 객체를 가리키는 참조를 포함하는 객체. 또한 (PGP) 서명을 포함 할 수 있으며이 경우 "서명 된 태그 객체"라고합니다.


36
질문 : 브랜치를 태그처럼 취급하는 경우 (즉, 생성 한 다음 업데이트하지 않음) 실제 차이가 있습니까?
Steve Bennett

30
@SteveBennett 절대적으로. 다른 정보가 있습니다 (태그에 서명하고 분기에 설명을 추가 할 수 있음). 브랜치를 이동할 수 있습니다 (따라서 업데이트하지 않아도 리베이스를 계속할 수 있습니다). 태그를 이동할 수 없습니다 (특정 커밋에 연결되어 있음). 분기를 푸시하도록 선택할 수 있습니다. 태그는 기본적으로 푸시되지 않습니다. SVN 마인드에 있지 않다면 git으로 계속 진행하고 싶다면 빠르게 "배우지 않아야"한다.
VonC 2019

19
@SteveBennett : Git이 브랜치를 처리하는 방법과 태그를 처리하는 방법에는 차이가 있습니다. VonC가 말한 것 외에도 실수로 태그를 진행할 수 없습니다. " git checkout <tag>"는 익명의 이름없는 분기 ( '분리 된 HEAD')를 생성하고 태그의 상태 를 선택 합니다. 새로운 커밋을 만들면 이름이없는이 브랜치에서 커밋을 수행하며 태그가 가리키는 것을 변경하지 않습니다.
Jakub Narębski

60
IMO, 브랜치는 분리 된 타임 라인 (병렬 세계)이며 태그는 타임 라인에서 특정 순간입니다.
Eonil

25
여기에서는 아직 언급 한 사람이 없지만 지점을 시작하는 지점으로 태그를 사용할 수 있습니다.git checkout -b <branch name> <tag name>

143

리포지토리를 프로젝트 진행 상황을 기록한 책으로 생각하면 ...

지점

브랜치를 끈적 끈적한 책갈피 중 하나로 생각할 수 있습니다 .

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

새로운 리포지토리에는 master최신 페이지로 자동으로 이동하는 저장소 중 하나만 있습니다 ( 커밋 생각) 사용자가 작성한 )로 . 그러나 책에서 다른 관심 지점을 표시하기 위해 더 많은 책갈피를 작성하고 사용할 수 있으므로 책갈피로 빠르게 돌아갈 수 있습니다.

또한 언제든지 특정 북마크를 책의 다른 페이지로 이동할 수 있습니다 ( git-reset 예 :). 관심 지점은 일반적으로 시간이 지남에 따라 다릅니다.

태그

태그를 장 제목 으로 생각할 수 있습니다 .

북마크

제목을 포함하거나 ( 주석이있는 태그 생각 ) 포함하지 않을 수 있습니다. 태그는 책에 대한 역사적 관심 지점을 표시한다는 점에서 분기와 유사하지만 다릅니다 . 기록적인 측면을 유지하기 위해 태그를 공유 한 후 (즉, 공유 리모콘으로 푸시 한 경우) 책의 다른 위치 이동 해서는 안됩니다 .


16
브랜치가 책이고 북마크는 태그라고 이미지화합니다. 책을 계속 쓸 수는 있지만 편집 할 수는 없습니다. 태그는 책에서 고정 된 순간입니다.
Mārtiņš Briedis 2013

5
@ Jubobs 나는 개발 라인으로 분기 설명을 좋아했습니다. 책은 가지가 될 것입니다. 본점을 떠난 장소를 기준으로 새 책을 시작할 수 있습니다. 당신은 그것들을 병렬로 쓴 다음 하나의 책 / 지점으로 합치기를 시도 할 수 있습니다.
Mārtiņš Briedis

2
@ MārtiņšBriedis 나는 당신이 가지에 대해 생각하는 방식을 이해하지만 Git에서는 실제로 오도하는 것을 알았습니다. 참조 stackoverflow.com/questions/25068543/...
jub0bs에게

2
이것은 실제로 시간 절약 답변입니다
Ali Foroughi

2
책을 쓰기 시작하고 처음 50 페이지를 가지고 있다면, 그 책을 복사하고 (새로운 책을 만들 수 있습니다) 동시에 두 권의 책을 계속 쓰거나 (또는 ​​다른 작가에게 개발자에게 책을 주거나) 마지막으로 다른 책에서 책으로 변경됩니다.
barell

42

CVS에서 오는 것은 브랜치를 설정할 때 더 이상 디렉토리를 만들지 않는다는 것 입니다.
더 이상 "sticky tag"(하나의 파일에만 적용 할 수 있음) 또는 "branch tag"가 없습니다.
Git에서 브랜치와 태그는 서로 다른 두 객체이며 항상 모든 리포지토리에 적용됩니다 .

더 이상 (이번 SVN으로) 저장소를 명시 적으로 구성하지 않아도됩니다.

branches
   myFirstBranch
     myProject
       mySubDirs
   mySecondBranch
     ...
tags
   myFirstTag
     myProject
       mySubDirs
   mySecondTag
   ...

이 구조는 CVS가 버전 시스템 이 아니라 개정 시스템 이라는 사실에서 비롯 됩니다 ( 소스 제어와 개정 제어? 참조 ).
이는 브랜치가 SVN의 디렉토리 사본 인 CVS의 태그를 통해 에뮬레이트됨을 의미합니다.

태그를 체크 아웃하고 작업을 시작하는 데 익숙하다면 질문이 의미가 있습니다 .
;)
태그는 불변 을 나타내는 것으로 간주됩니다. 컨텐츠 매번 동일한 컨텐츠를 얻을 수 있도록 보장하여 액세스하는 데만 사용됩니다.

Git에서 수정 내역은 일련의 커밋으로 그래프를 형성합니다.
분기는 해당 그래프의 한 경로입니다

x--x--x--x--x # one branch
    \ 
     --y----y # another branch
       1.1
        ^
        |
        # a tag pointing to a commit
  • 태그를 체크 아웃하면 지점을 생성하여 작업을 시작해야합니다.
  • 지점을 체크 아웃하면 해당 지점의 최신 커밋 지점 ( 'HEAD')이 바로 표시됩니다.

참조 야쿱 Narębski의 답변을모든 기술에 을 . 그러나 솔직히이 시점에서 모든 세부 사항이 필요하지는 않습니다.

요점은 다음과 같습니다. 태그는 커밋에 대한 간단한 포인터이므로 내용을 수정할 수 없습니다. 지점이 필요합니다.


귀하의 경우 각 개발자는 특정 기능을 수행합니다.

  • 각각의 저장소에 자신의 지점을 만들어야합니다
  • 동료의 저장소 (같은 기능을 수행하는 저장소)에서 분기를 추적합니다.
  • 동료와 작업을 공유하기 위해 당기기 / 밀기.

동료의 지점을 직접 추적하는 대신이 특정 기능에 대한 모든 사람의 작업을 통합하고 공유하기 위해 모든 사람이 자신의 작업을 추진하는 하나의 "공식적인"중앙 저장소의 지점 만 추적 할 수 있습니다.


1
분기와 태그의 작동 방식을 분명히 해 주셔서 감사합니다. :) 귀하의 예가 없으면 완전히 이해할 수 없습니다.
ufk

3
@VonC : 답은 "CVS"가 아니라 "SVN"을 의미한다고 생각합니다. CVS에는 디렉토리 구조가 없습니다. SVN은 않습니다. 실제로 git 태그를 지정하면 SVN (tag == degenerate branch)의 태그 지정보다 RCS / CVS 태그 지정이 훨씬 더 중요합니다.
Chris Cleeland 16:16에

1
@ChrisCleeland 좋은 지적. 나는 (편집 된) 답변에서 조금 더 많은 CVS와 SVN 포인트를 분리하려고했습니다.
VonC

37

가지는 나무로 만들어지며 나무 줄기에서 자랍니다. 태그는 종이로 만들어졌으며 나무의 여러 곳에서 온 크리스마스 장식품처럼 매달립니다.

프로젝트는 트리이며 프로젝트에 추가 될 기능은 분기에서 커집니다. 답은 지사입니다.


3
비유에 대한 사랑
doz87

16

설명하는 가장 좋은 방법은 태그가 읽기 전용 분기로 작동한다는 것입니다. 브랜치를 태그로 사용할 수 있지만 실수로 새로운 커밋으로 업데이트 할 수 있습니다. 태그는 존재하는 한 동일한 커밋을 가리 키도록 보장됩니다.


11
태그는 존재하는 한 동일한 커밋을 가리 키도록 보장됩니다. 완전히 사실이 아닙니다. 로 태그를 실제로 이동할 수 있습니다 git tag -f.
jub0bs

14

태그는 서명되거나 서명되지 않을 수 있습니다 . 지점은 서명되지 않습니다.

서명 된 태그는 특정 커밋에 대해 서명 방식으로 암호화되어 바인딩되어 있으므로 절대 이동할 수 없습니다. 서명되지 않은 태그는 바인딩되지 않으며 이동할 수 있지만 태그 이동은 일반적인 사용 사례가 아닙니다.

브랜치는 다른 커밋으로 이동할 수있을뿐만 아니라 그렇게 할 것으로 예상 됩니다. 지역 개발 프로젝트에 지점을 사용해야합니다. "태그에있는"Git 저장소에 작업을 커밋하는 것은 의미가 없습니다.


12

나는 가지당신이가는 곳 으로 생각 하고 태그당신이 있었던 곳 으로 생각하고 싶습니다 .

태그는 과거 버전 릴리스와 같은 특정 중요 지점의 책갈피처럼 느껴집니다.

지점이 특정 경로 인 반면 프로젝트는 진행 중이므로 지점 마커가 진행됩니다. 완료되면 분기 (예 : 마커)를 병합 / 삭제합니다. 물론 그 시점에서 해당 커밋에 태그를 지정할 수 있습니다.


10

망할 놈의 비유는 제작자가 왜 그랬는지 그들이 무슨 짓을했는지 어떻게 전형적인 DVCS가 생성됩니다 및 설명합니다. 또한, Git for Computer Scientist를 살펴볼 수도 있습니다 . 분기 및 태그를 포함하여 Git의 각 객체 유형에 대해 설명합니다.


6

태그는 버전을 표시하는 데 사용되며,보다 구체적으로는 지점의 특정 시점을 참조합니다. 브랜치는 일반적으로 프로젝트에 기능을 추가하는 데 사용됩니다.


4

단순한:

태그는 항상 같은 버전의 프로젝트를 가리킬 것으로 예상되는 반면, 개발이 진행됨에 따라 헤드는 발전 할 것으로 예상됩니다.

Git 사용자 매뉴얼


4

간단한 대답은 다음과 같습니다.

branch : 현재 분기 포인터는 모든 커밋과 함께 저장소로 이동합니다.

그러나

태그 : 태그가 가리키는 커밋은 변경되지 않습니다. 실제로 태그는 해당 커밋의 스냅 샷입니다.

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