답변:
태그는 한 순간 특정 지점의 버전을 나타냅니다. 분기 와 동일한 코드베이스에 다른 개발 노력과 동시에 실행할 수 있습니다 개발의 별도의 스레드를 나타냅니다. 지점에 대한 변경 사항은 결국 다른 지점으로 병합되어 통합 될 수 있습니다.
일반적으로 특정 버전에 태그를 지정 하여 다시 만들 수 있습니다. 예를 들어 XYZ Corp에 제공 한 버전 입니다. 지점는 코드의 개발을 계속하면서 특정 버전의 코드에 대한 지속적인 업데이트를 제공하는 전략입니다. 전달 된 버전의 브랜치를 만들고 메인 라인에서 개발을 계속하지만 전달 된 버전을 나타내는 브랜치에 버그를 수정합니다. 결국이 버그 수정을 기본 라인으로 다시 병합합니다. 종종 분기와 태그를 함께 사용합니다. 배달, 버그 진단 등을 위해 다시 만들려는 각 지점을 따라 메인 라인과 특정 버전 (예 : 고객에게 배달 된 버전)을 표시하는 지점에 모두 적용 할 수있는 다양한 태그가 있습니다.
실제로 이보다 더 복잡하거나 원하는만큼 복잡하지만이 예제는 차이점에 대한 아이디어를 제공해야합니다.
git checkout 88c9f229f
할 수있는 것과 같은 것을 할 수 git checkout your_tag
있으며 태그로 별칭이 지정된 커밋을 체크 아웃합니다.
로부터 이론적 관점 :
로부터 기술적 관점 :
refs/tags/
네임 스페이스에 상주하며 태그 객체 (주석이 있거나 선택적으로 GPG 서명 태그)를 가리 키 거나 객체를 직접 커밋 (로컬 이름에 사용되는 경량 태그가 거의 없음)하거나 아주 드물게 트리 객체 또는 BLOB 객체를 가리킬 수도 있습니다 (예 : GPG 서명)를 가리킬 수 있습니다. ).refs/heads/
네임 스페이스에 상주하며 객체 를 커밋하는 것만 가리킬 수 있습니다 . 그만큼HEAD
포인터 분기 (심볼 참조) 또는 직접 커밋 (또는 분리 HEAD 이름 점)을 참조한다.refs/remotes/<remote>/
네임 스페이스에 있으며 원격 저장소에서 일반 분기를 따릅니다 <remote>
.gitglossary 맨 페이지를 참조하십시오 .
분기
"분기"는 활발한 개발 라인입니다. 지점에서 가장 최근의 커밋을 해당 지점의 팁이라고합니다. 브랜치의 팁은 브랜치 헤드에서 참조되며, 브랜치 헤드에서 추가 개발이 완료되면 앞으로 나아갑니다. 단일 자식 저장소는 임의의 수의 분기를 추적 할 수 있지만 작업 트리는 그 중 하나 ( "현재"또는 "체크 아웃 된"분기) 와만 관련되며 HEAD는 해당 분기를 가리 킵니다.
꼬리표
태그 또는 커밋 객체를 가리키는 참조입니다. 헤드와 달리, 커밋에 의해 태그가 변경되지 않습니다. 태그 (태그 객체가 아님)는에 저장됩니다
$GIT_DIR/refs/tags/
. [...]. 태그는 가장 일반적으로 확약 체인에서 특정 지점을 표시하는 데 사용됩니다.태그 객체
커밋 객체처럼 메시지를 포함 할 수있는 다른 객체를 가리키는 참조를 포함하는 객체. 또한 (PGP) 서명을 포함 할 수 있으며이 경우 "서명 된 태그 객체"라고합니다.
git checkout <tag>
"는 익명의 이름없는 분기 ( '분리 된 HEAD')를 생성하고 태그의 상태 를 선택 합니다. 새로운 커밋을 만들면 이름이없는이 브랜치에서 커밋을 수행하며 태그가 가리키는 것을 변경하지 않습니다.
리포지토리를 프로젝트 진행 상황을 기록한 책으로 생각하면 ...
브랜치를 끈적 끈적한 책갈피 중 하나로 생각할 수 있습니다 .
새로운 리포지토리에는 master
최신 페이지로 자동으로 이동하는 저장소 중 하나만 있습니다 ( 커밋 생각) 사용자가 작성한 )로 . 그러나 책에서 다른 관심 지점을 표시하기 위해 더 많은 책갈피를 작성하고 사용할 수 있으므로 책갈피로 빠르게 돌아갈 수 있습니다.
또한 언제든지 특정 북마크를 책의 다른 페이지로 이동할 수 있습니다 ( git-reset
예 :). 관심 지점은 일반적으로 시간이 지남에 따라 다릅니다.
태그를 장 제목 으로 생각할 수 있습니다 .
제목을 포함하거나 ( 주석이있는 태그 생각 ) 포함하지 않을 수 있습니다. 태그는 책에 대한 역사적 관심 지점을 표시한다는 점에서 분기와 유사하지만 다릅니다 . 기록적인 측면을 유지하기 위해 태그를 공유 한 후 (즉, 공유 리모콘으로 푸시 한 경우) 책의 다른 위치 로 이동 해서는 안됩니다 .
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
참조 야쿱 Narębski의 답변을모든 기술에 을 . 그러나 솔직히이 시점에서 모든 세부 사항이 필요하지는 않습니다.
요점은 다음과 같습니다. 태그는 커밋에 대한 간단한 포인터이므로 내용을 수정할 수 없습니다. 지점이 필요합니다.
귀하의 경우 각 개발자는 특정 기능을 수행합니다.
동료의 지점을 직접 추적하는 대신이 특정 기능에 대한 모든 사람의 작업을 통합하고 공유하기 위해 모든 사람이 자신의 작업을 추진하는 하나의 "공식적인"중앙 저장소의 지점 만 추적 할 수 있습니다.
설명하는 가장 좋은 방법은 태그가 읽기 전용 분기로 작동한다는 것입니다. 브랜치를 태그로 사용할 수 있지만 실수로 새로운 커밋으로 업데이트 할 수 있습니다. 태그는 존재하는 한 동일한 커밋을 가리 키도록 보장됩니다.
git tag -f
.
태그는 서명되거나 서명되지 않을 수 있습니다 . 지점은 서명되지 않습니다.
서명 된 태그는 특정 커밋에 대해 서명 방식으로 암호화되어 바인딩되어 있으므로 절대 이동할 수 없습니다. 서명되지 않은 태그는 바인딩되지 않으며 이동할 수 있지만 태그 이동은 일반적인 사용 사례가 아닙니다.
브랜치는 다른 커밋으로 이동할 수있을뿐만 아니라 그렇게 할 것으로 예상 됩니다. 지역 개발 프로젝트에 지점을 사용해야합니다. "태그에있는"Git 저장소에 작업을 커밋하는 것은 의미가 없습니다.
망할 놈의 비유는 제작자가 왜 그랬는지 그들이 무슨 짓을했는지 어떻게 전형적인 DVCS가 생성됩니다 및 설명합니다. 또한, Git for Computer Scientist를 살펴볼 수도 있습니다 . 분기 및 태그를 포함하여 Git의 각 객체 유형에 대해 설명합니다.