자식에서 삭제 된 분기와 이름이 같은 태그를 만드는 것은 나쁜 생각입니까?


20

nvie의 git-flow 모델을 따르는 git branching 모델이있는 프로젝트가 있습니다.

릴리스 브랜치는 SemVer 형식으로 명명 됩니다. 예 :v1.5.2

릴리스 분기에 생산을위한 녹색 표시등이 제공되면 분기를 마스터로 병합하고 태그를 적용한 후 분기를 삭제하여 분기를 닫습니다.

릴리스 브랜치를 즉시 삭제함에 따라 브랜치에 태그를 지정할 때 동일한 식별자를 사용했습니다. 예 : v1.5.2

릴리스 브랜치를 닫는 데 사용하는 명령은 다음과 같습니다.

$ git checkout master
$ git merge v1.5.2
$ git tag -a v1.5.2 -m "Version 1.5.2 - foo bar, baz, etc"
$ git branch -d v1.5.2
$ git branch -dr origin/v1.5.2
$ git push origin :v1.5.2
$ git push
$ git push --tags

이것은 대부분의 경우 작동하는 것으로 보이지만 git repo의 다른 인스턴스 (예 : 다른 dev 시스템 또는 스테이징 환경)에서 v1.5.2 분기의 로컬 체크 아웃이있는 시나리오에서 문제가 발생합니다.

git push origin :v1.5.2명령은 원격에서 분기를 삭제하지만 모든 저장소에서 분기의 로컬 버전 (있는 경우)은 삭제하지 않습니다.

이는 v1.5.2해당 리포지토리에서 체크 아웃 을 시도 할 때 모호한 참조로 이어집니다 .

$ git checkout v1.5.2
warning: refname 'v1.5.2' is ambiguous.

이것은 가지에 대해 다른 구문을 사용하여, 예를 들면 않고 피할 수있다 release-v1.5.2, 또는 v1.5.2-rc?

아니면 피할 수 없어서 삭제 된 브랜치와 동일한 이름의 태그를 만드는 것이 근본적으로 나쁜 생각입니까?

답변:


19

이 이름 지정 체계를 유지하려면 다음을 수행하십시오.

이 경고에 신경 쓰지 않기로 결정하십시오.

즉, 다음과 같은 사실에 만족한다면 :

  • git checkout <ref>체크 아웃 refs/heads/<ref>합니다 refs/tags/<ref>( git-checkout 참조 )
  • 다른 명령은 refs/tags/<ref>over 를 사용 합니다 refs/heads/<ref>( gitrevisions 참조 ).

예를 들어이 테스트 리포지토리에서 v1.5.2분기는 B를 커밋하지만 v1.5.2태그는 A를 커밋합니다.

% git log --oneline --decorate
8060f6f (HEAD, v1.5.2, master) commit B
0e69483 (tag: v1.5.2) commit A

git checkout 지점 이름을 선호합니다 :

% git checkout v1.5.2
warning: refname 'v1.5.2' is ambiguous.
Switched to branch 'v1.5.2'
% git log --decorate --oneline -1
8060f6f (HEAD, v1.5.2, master) commit B

하지만 git log태그 이름을 사용합니다 :

% git log --decorate --oneline -1 v1.5.2
warning: refname 'v1.5.2' is ambiguous.
0e69483 (tag: v1.5.2) commit A

혼란 스러울 수 있습니다.

사람들이 새 태그를 볼 때 현지 지점을 삭제하도록 교육

조직의 규모에 따라 어려울 수 있습니다.

"git pull"및 "git fetch"주위에 래퍼 작성

즉, 분기 이름을 가리는 태그가 있는지 확인하고 해당 분기에 대해 경고 (또는 삭제)하는 래퍼를 작성하십시오. 이것은 고통스럽게 들리며, 음영 처리 된 분기가 현재 체크 아웃되어 있으면 바람직하지 않을 수 있습니다.

불행히도이 문제를 해결하는 가장 쉬운 방법은 지점 이름을 바꾸는 것입니다. 게시 한 링크는 태그 및 분기에 대해 다른 이름 지정 체계를 사용합니다. 이미 해당 방법을 따르고있는 경우 이름 지정 체계를 채택하는 것이 가장 쉬운 솔루션 일 수 있습니다.


답변 주셔서 감사합니다. 매우 도움이됩니다. 첫 번째 글 머리 기호 git checkout는 모호한 참조가있을 때 분기를 통해 태그를 체크 아웃 한다고 표시하지만 gist.github.com/tommarshall/9376724 참조 하십시오 . 이것은 최신 버전의 git에서 변경된 것입니까? gitconfig이 동작을 얻기 위해 설정할 수있는 플래그가 있습니까?
tommarshall

당신 말이 맞아요, 이건 완전히 틀렸어요 죄송합니다! 내 대답을 수정하고 예를 추가했습니다.
benj

10

전체 이름을 사용하여 분기 또는 태그를 원하는지 여부를 명시 적으로 지정할 수 있습니다.

 git checkout refs/heads/v1.5.2

또는

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