나는 프로젝트에 늦게 왔고 이전 git 태그 이름과 메시지를 수정하고 싶었으므로 여기 stackoverflow에 대한 몇 가지 답변에 따라 업데이트했습니다.
git tag newname oldname
git tag -d oldname
git push origin :refs/tags/oldname
git push --tags
이름이 변경되었지만 해당 메시지도 수정하고 싶었으므로 다음과 같이했습니다.
git tag newname newname -f -m "new message for renamed tag"
다음을 통해 볼 때 작동하는 것처럼 보였습니다.
git tag -n1
그러나 지금 시도 git push --tags
하면 다음 오류가 발생합니다.
error: failed to push some refs to 'https://blah@blah/blah/repo-name.git'
hint: Updates were rejected because the tag already exists in the remote.
지금 무엇을 해야할지 모르겠습니다 ...
1) 새 이름 / 메시지를 유지하고 실패없이 태그를 푸시 할 수 있도록 어떻게 수정합니까?
2) 처음에이를 수행하는 더 나은 방법은 무엇 이었을까요?
감사합니다
리모컨에서 태그를 삭제 한 다음 다시 밀어서 다시 생성합니다 (또는을 사용 --force
하여 한 번에 둘 다 수행).
아이디어 태그 뒤에은 (레이블로, 분기 이름의 생각과 반대로 절대 변경 레이블 점이다 않는 변경). 결과적으로 Git은 일반적으로 기존 태그를 가져 와서 새롭고 다른 위치를 가리키는 것을 꺼립니다.
이것이 -f
태그를 변경할 때 (force) 플래그 를 사용해야하는 이유입니다 .
git tag newname newname -f -m "new message for renamed tag"
가 없으면 -f
Git은 태그가 이미 존재한다고 불평하고 아무것도하지 않습니다.
을 사용하고 있기 때문에 주석-m
이 달린 태그 를 받게 됩니다. 그렇지 않으면 어떤 식 으로든 태그를 변경하지 않고 문제가 없기 때문에 이것은 중요합니다.
위에서 언급 한 브랜치 (좀 더 구체적으로는 브랜치 이름 )와 태그는 모두 레이블입니다.
master
일반적으로 같은 브랜치 이름 은 commit-ID로 일부 커밋을 직접 가리 킵니다. 따라서 master
커밋 ID로 읽고 변환 할 수 있습니다. git rev-parse
명령은 정확히 수행합니다
$ git rev-parse master
3ad15fd5e17bbb73fb1161ff4e9c3ed254d5b243
그러나 태그 이름은 커밋을 직접 가리킬 수 있습니다.
$ git tag temp-tag master
$ git rev-parse temp-tag
3ad15fd5e17bbb73fb1161ff4e9c3ed254d5b243
$ git tag -d temp-tag
이를 경량 태그 라고합니다 .
또는 태그를 나타내는 새로 생성 된 git 객체 를 가리킬 수 있습니다 (호출 을 수행하는 사람과 원하는 정도에 따라 태그 객체 또는 주석이 달린 태그 객체 라고 함). 메시지를 포함하거나로 -a
만든 태그 는 다음 주석 태그 중 하나를 만듭니다 .
$ git tag -m foo temp-tag master
$ git rev-parse temp-tag
04565b0274c13ac49a70b8e34cdb9c912e02f0ab
이 주석이 달린 태그는와 다른 ID를 가지고 master
있습니다. 실제로는 한 쌍의 항목으로 구성됩니다. 가벼운 스타일 태그는 저장소의 주석이 달린 태그 객체를 가리 킵니다. 커밋을 가리키는 주석이 달린 태그 객체 :
$ git cat-file -p temp-tag | sed 's/@/ /'
object 3ad15fd5e17bbb73fb1161ff4e9c3ed254d5b243
type commit
tag temp-tag
tagger Chris Torek <chris.torek gmail.com> 1461965004 -0700
foo
$ git tag -d temp-tag
메모 object
커밋의 ID를 포함하는 라인을.
(Aside : git cat-file -p
커밋 ID를 포함하여 원시 ID를 시도 하십시오. ID가있는 것을 볼 수 있습니다. 파이프를 통해 tree
시도 하거나 상당히 길 수 있기 때문에 시도하십시오. 또한 해시 값, 사물 에 대해 실행 해보십시오. 예를 들어 . 이들 모두는 매우 유익합니다.)git cat-file -p
less
more
git rev-parse
3ad15fd5e17bbb73fb1161ff4e9c3ed254d5b243
git rev-parse 3ad15
일단 생성 된 객체는 단일 비트가 아닌 비트가 아닌 변경할 수 없습니다. 그들은 완전히 제거 할 수 있습니다 1 만 변경되지 않습니다. 따라서 주석이 달린 태그를 이동하려면 이전 태그를 삭제 한 다음 새 해시 ID를 가져 오는 새 태그를 만들어야합니다. --force
플래그 차종은 한 단계에서이 작업을 수행 GIT.
태그는 이동 하지 않아야 하므로 Git (현재 2 ) 은 태그가 이동 하지 않는지 확인하고 확인합니다. 기존 경량 또는 주석 태그를 이동하려면 사용해야 --force
하거나 -f
. 경량 태그의 경우 최소한 실제로는 태그를 삭제 한 다음 (커밋은 아님) 동일한 이름의 새 태그를 새 개체에 연결합니다. 주석이 달린 태그의 경우 경량 태그와 기본 주석 태그 객체를 모두 삭제 한 다음 새 기본 주석 태그 객체를 생성하고 새 경량 태그를 새 주석 태그 객체에 첨부합니다.
물론 이것을 두 단계로 나눌 수 있습니다.
에도 동일한 규칙이 적용됩니다 git push
. / git push
가 있으므로 두 단계를 하나로 숨기고 최적화 할 수 있지만 실제로는 삭제 및 다시 생성입니다.--force
-f
1 개체를 제거하는 것은 실제로 상당히 복잡합니다. Git은 객체를 제거하는 것이 아니라 추가하는 것을 중심으로 구축되었습니다. 가비지 컬렉터 , git gc
실행할 수있는 모두 내부적으로 별도의 폐품 단계의 무리로 구성 - 어떤 정말 결국 물건을 삭제하는 것을 수동이다.
2 1.8.2 이전의 Git 버전에서는 git push
분기 규칙을 태그에 적용하여 작업이 빨리 감기 인 경우 태그를 푸시 할 수 있습니다. 1.8.2 릴리스 정보는 다음으로 시작됩니다.
"git push $ there tag v1.2.3"은 저장소에 이미 존재하는 v1.2.3 태그를 교체하는 데 사용됩니다. $ there 재 작성된 태그가 이전 태그 인 커밋의 자손 인 커밋을 가리키는 경우 v1.2.3 포인트. 이는 오류가 발생하기 쉬운 것으로 확인되었으며 이번 릴리스부터 refs / tags / 계층 구조 아래의 기존 참조를 업데이트하려는 모든 시도는 "--force"없이 실패합니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다