development

git 브랜치의 태그를 다른 커밋으로 이동하려면 어떻게해야합니까?

big-blog 2020. 9. 29. 08:06
반응형

git 브랜치의 태그를 다른 커밋으로 이동하려면 어떻게해야합니까?


다음 v0.1과 같이 마스터 브랜치에 태그를 생성했습니다 .

git tag -a v0.1

하지만 릴리스 0.1을 위해 마스터에 병합해야하는 몇 가지 변경 사항이 있다는 것을 깨달았으므로 그렇게했습니다. 그러나 이제 내 v0.1태그가 잘못된 커밋에 붙어 있습니다 (포스트잇 메모 비유를 호출하기 위해). 나는 그것이 마스터의 가장 최근 커밋에 붙어 있기를 원하지만 대신 마스터의 두 번째 가장 최근 커밋에 붙어 있습니다.

마스터의 가장 최근 커밋으로 어떻게 옮길 수 있습니까?


-f옵션을 사용하여 다음을 수행하십시오 git tag.

-f
--force

    Replace an existing tag with the given name (instead of failing)

주석이없는 태그 대신 주석이 달린 태그를 강제 생성하기 위해 -f와 함께 사용하고 싶을 것입니다 -a.

  1. 푸시하기 전에 리모컨에서 태그를 삭제하십시오.

    git push origin :refs/tags/<tagname>
    
  2. 가장 최근 커밋을 참조하도록 태그 교체

    git tag -fa <tagname>
    
  3. 태그를 원격 원점으로 푸시

    git push origin master --tags
    

보다 정확하게는 태그를 강제로 추가 한 다음 --tags 및 -f 옵션을 사용하여 푸시해야합니다.

git tag -f -a <tagname>
git push -f --tags

리모컨이 호출 origin되고 master지점에서 작업 중인지 요약하면 다음 같습니다.

git tag -d <tagname>
git push origin :refs/tags/<tagname>
git tag <tagname> <commitId>
git push origin <tagname>
  • 라인 1은 로컬 환경에서 태그를 제거합니다.
  • 2 행은 원격 환경에서 태그를 제거합니다.
  • 3 행은 다른 커밋에 태그를 추가합니다.
  • 라인 4는 변경 사항을 리모컨으로 푸시합니다.

라인 4를 git push origin --tags교환 하여 로컬 변경 사항의 태그로 모든 변경 사항을 푸시 할 수도 있습니다 .

@ stuart-golodetz, @ greg-hewgill, @eedeep, @ ben-hocking 답변, 답변 아래의 댓글 및 내 답변 아래의 NateS 댓글을 기반으로합니다.


로 삭제 git tag -d <tagname>한 다음 올바른 커밋에서 다시 만듭니다.


Git을 사용할 때 몇 가지를 피하려고합니다.

  1. 내부 지식 사용 (예 : 참조 / 태그) 문서화 된 Git 명령 만 사용하고 .git 디렉토리의 내부 내용에 대한 지식이 필요한 것은 사용하지 않으려 고합니다. (즉, Git을 Git 개발자가 아닌 Git 사용자로 취급합니다.)

  2. 필요하지 않을 때 힘을 사용합니다.

  3. 과용. (내가 원하는 곳에 하나의 태그를 얻기 위해 분기 및 / 또는 많은 태그를 푸시합니다.)

그래서 여기에 Git 내부에 대한 지식없이 로컬 및 원격으로 태그를 변경하는 비폭력적인 솔루션이 있습니다.

소프트웨어 수정에 궁극적으로 문제가 발생하여 업데이트 / 재 출시해야 할 때 사용합니다.

git tag -d fix123                # delete the old local tag
git push github :fix123          # delete the old remote tag (use for each affected remote)
git tag fix123 790a621265        # create a new local tag
git push github fix123           # push new tag to remote    (use for each affected remote)

github샘플 원격 이름, fix123샘플 태그 이름 및 790a621265샘플 커밋입니다.


여기에 내 필요에 맞는이 명령의 다른 형식 만 남겨 두겠습니다. 움직이고 싶은
태그가있었습니다 v0.0.1.2.

$ git tag -f v0.0.1.2 63eff6a

Updated tag 'v0.0.1.2' (was 8078562)

그리고:

$ git push --tags --force

Alias to move one tag to a different commit.

In your sample, to move commit with hash e2ea1639 do: git tagm v0.1 e2ea1639.

For pushed tags, use git tagmp v0.1 e2ea1639.

Both alias keeps you original date and message. If you use git tag -d you lost your original message.

Save them on your .gitconfig file

# Return date of tag. (To use in another alias)
tag-date = "!git show $1 | awk '{ if ($1 == \"Date:\") { print substr($0, index($0,$3)) }}' | tail -2 | head -1 #"

# Show tag message
tag-message = "!git show $1 | awk -v capture=0 '{ if(capture) message=message\"\\n\"$0}; BEGIN {message=\"\"}; { if ($1 == \"Date:\" && length(message)==0 ) {capture=1}; if ($1 == \"commit\" ) {capture=0}  }; END { print message }' | sed '$ d' | cat -s #"

### Move tag. Use: git tagm <tagname> <newcommit> 
tagm = "!GIT_TAG_MESSAGE=$(git tag-message $1) && GIT_COMMITTER_DATE=$(git tag-date $1) && git tag-message $1 && git tag -d $1 && git tag -a $1 $2 -m \"$GIT_TAG_MESSAGE\" #"

### Move pushed tag. Use: git tagmp <tagname> <newcommit> 
tagmp = "!git tagm $1 $2 && git push --delete origin $1 && git push origin $1 #"

One other way:

Move tag in remote repo.(Replace HEAD with any other if needed.)

$ git push --force origin HEAD:refs/tags/v0.0.1.2

Fetch changes back.

$ git fetch --tags

If you want to move an annotated tag, changing only the targeted commit but preserving the annotation message and other metadata use:

moveTag() {
  local tagName=$1
  # Support passing branch/tag names (not just full commit hashes)
  local newTarget=$(git rev-parse $2^{commit})

  git cat-file -p refs/tags/$tagName | 
    sed "1 s/^object .*$/object $newTarget/g" | 
    git hash-object -w --stdin -t tag | 
    xargs -I {} git update-ref refs/tags/$tagName {}
}

usage: moveTag <tag-to-move> <target>

The above function was developed by referencing teerapap/git-move-annotated-tag.sh.

참고URL : https://stackoverflow.com/questions/8044583/how-can-i-move-a-tag-on-a-git-branch-to-a-different-commit

반응형