programing

깃 분기의 태그를 다른 커밋으로 이동하려면 어떻게 해야 합니까?

bestprogram 2023. 5. 17. 23:34

깃 분기의 태그를 다른 커밋으로 이동하려면 어떻게 해야 합니까?

에 마터분기다같태만들다니습었그를라는 .v0.1다음과 같이:

git tag -a v0.1

하지만 0.1 릴리스의 마스터에 병합해야 하는 변경 사항이 아직 남아 있다는 것을 알고 그렇게 했습니다.하지만 이제 나의v0.1태그가 잘못된 커밋에 고착되었습니다(포스트잇 노트 유추를 호출하기 위해).마스터에 대한 가장 최근의 커밋에 고정되기를 원하지만, 대신 마스터에 대한 두 번째 최근 커밋에 고정됩니다.

마스터에 대한 최신 커밋으로 이동하려면 어떻게 해야 합니까?

을 합니다.-f옵션:

-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
    

의 이름이 .origin그리고 당신은 작업 중입니다.master분기:

git tag -d <tagname>                  # delete the old tag locally
git push origin :refs/tags/<tagname>  # delete the old tag remotely
git tag <tagname> <commitId>          # make a new tag locally
git push origin <tagname>             # push the new local tag to the remote 

설명:

  • 1행은 로컬 환경에서 태그를 제거합니다.
  • 라인 2는 원격 환경에서 태그를 제거합니다.
  • 라인 3은 태그를 다른 커밋에 추가합니다.
  • 라인 4는 리모컨으로 변경을 푸시합니다.

또한 4호선을 다음과 같이 변경할 수 있습니다.git push origin --tags모든 로컬 태그 변경/변경사항을 원격 저장소로 푸시합니다.

위 답변은 @eedeep의 질문 내용뿐만 아니라 Stuart Golodetz, Greg Hewgill 및 @ben-hocking의 답변 및 답변 아래의 코멘트, @NateS의 원래 코멘트를 기반으로 합니다.

보다 정확하게는 태그를 강제로 추가한 다음 옵션 --tags 및 -f로 눌러야 합니다.

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

다으로삭과 함께 합니다.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

한 태그를 다른 커밋으로 이동하는 별칭입니다.

샘플에서 해시 e2ea1639로 커밋을 이동하려면 다음을 수행합니다.git tagm v0.1 e2ea1639.

푸시된 태그의 경우 사용git tagmp v0.1 e2ea1639.

두 별칭 모두 원래 날짜와 메시지를 유지합니다.사용하는 경우git tag -d당신은 당신의 원래 메시지를 잃어버렸습니다.

데이터를 저장합니다..gitconfig파일

# 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 #"

다른 방법:

원격 레포에서 태그를 이동합니다.(필요한 경우 HEAD를 다른 HEAD로 교체)

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

변경 내용을 다시 가져옵니다.

$ git fetch --tags

github을 사용하고 릴리스에 대한 변경 커밋을 원하는 경우(예를 들어 릴리스를 만든 후 smth를 커밋하지 않음).사용할 수 있습니다.

git push origin :refs/tags/<tagname>

이 명령 후 github이 태그를 삭제하면 릴리스가 초안이 됩니다.즉, 릴리스를 다시 만들고 커밋을 선택할 수 있습니다.파일과 메시지가 저장됩니다.

로컬로 제거:

git tag -d v0.1  

원격에서 제거:

git push origin --delete v0.1

그런 다음 로컬로 다시 추가하고 v0.1을 최신 커밋에 푸시합니다.

git tag -a v0.1
git push origin --tags

주석이 달린 태그를 이동하려면 대상 커밋만 변경하고 주석 메시지 및 기타 메타데이터는 유지합니다.

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 {}
}

용도: moveTag <tag-to-move> <target>

위의 기능은 teerapap/git-move-annotated-tag.sh 을 참조하여 개발되었습니다.

원하는 최종 결과가 이미 원격에 있는 태그의 내용을 업데이트하는 경우:

  1. git checkout <tag_name>
  2. 변경 내용 커밋
  3. git tag -f <tag_name>
  4. git push -f origin <tag_name>

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