Como posso mover uma etiqueta em um branch git para um commit diferente?

criei uma etiqueta no ramo principal chamada v0.1 Assim:

git tag -a v0.1
Mas depois apercebi-me que ainda havia algumas mudanças que precisava de me fundir no master para o lançamento 0.1, por isso fiz isso. Mas agora a minha marca v0.1 está presa (para invocar a analogia da nota post-it) no commit errado. Eu quero que ele seja preso no mais recente commit on master, mas em vez disso ele está preso no segundo commit mais recente sobre master.

Como posso transferi-lo para o compromisso mais recente sobre o mestre?

 621
Author: Steven Vascellaro, 2011-11-08

9 answers

Use a opção -f para git tag:

-f
--force

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

Você provavelmente quer usar -f em conjunto com -a para forçar-criar uma marca anotada em vez de uma não anotada.

Exemplo

  1. Apague a etiqueta em qualquer comando antes de empurrar

    git push origin :refs/tags/<tagname>
    
  2. Substitua a etiqueta por referência à persistência mais recente

    git tag -fa <tagname>
    
  3. Empurra a etiqueta para a origem remota

    git push origin master --tags
    
 863
Author: Greg Hewgill, 2015-06-03 02:30:28

Mais precisamente, você tem que forçar a adição da etiqueta, em seguida, empurrar com a opção --tags e-f:

git tag -f -a <tagname>
git push -f --tags
 214
Author: Daniel, 2014-01-15 00:40:15

Para resumir se o seu comando se chama origin e está a trabalhar no ramo master:

git tag -d <tagname>
git push origin :refs/tags/<tagname>
git tag <tagname> <commitId>
git push origin <tagname>
  • a linha 1 remove a marca em ambiente local.
  • A Linha 2 remove a marca em ambiente remoto.
  • A Linha 3 adiciona a marca a um commit diferente
  • A Linha 4 empurra a mudança para o remoto

Também pode trocar as linhas 4 a git push origin --tags para empurrar todas as alterações com as marcas das suas alterações locais.

Baseando-me em @ stuart-golodetz, @greg-hewgill, @eedeep, @ben-hocking answers, comentários abaixo de suas respostas e NateS comentários abaixo de minha resposta.
 98
Author: Vive, 2016-12-09 09:53:59

Apaga - o com {[[0]} e depois recria-o na persistência correcta.

 80
Author: Stuart Golodetz, 2011-11-08 00:34:11

Nome alternativo para mover uma etiqueta para um commit diferente.

Na sua amostra, para mover commit com hash e2ea1639 Faça: git tagm v0.1 e2ea1639.

Para as etiquetas empurradas, use git tagmp v0.1 e2ea1639.

Ambos os pseudónimos mantêm a data e a mensagem originais. Se utilizar {[3] } perdeu a sua mensagem original.

Guarda-os no teu ficheiro .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 #"
 5
Author: Juan Antonio Tubío, 2015-05-21 20:02:38
Vou deixar aqui apenas outra forma deste comando que se adequa às minhas necessidades.
Havia uma etiqueta que eu queria mudar.
$ git tag -f v0.0.1.2 63eff6a

Updated tag 'v0.0.1.2' (was 8078562)

E depois:

$ git push --tags --force
 5
Author: Nakilon, 2017-09-19 00:14:29
Tento evitar algumas coisas ao usar o Git.
  1. Utilizando o conhecimento dos internos, por exemplo, as referências/marcas. Eu tento usar apenas os comandos git documentados e evitar usar coisas que requerem conhecimento do conteúdo interno do .directório git. (Ou seja, eu trato o Git como um usuário do Git e não como um desenvolvedor do Git.)

  2. Evitar o uso da força quando não for necessário.

Então aqui está a minha solução não violenta para mudar uma etiqueta. local e remotamente, sem conhecimento dos Git internals.

Uso - o quando uma correcção de software tem um problema e precisa de ser actualizada/relançada.

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

github is a sample remote name, fix123 is a sample tag name, and 790a621265 a sample commit.

 3
Author: user3070485, 2018-08-28 16:26:29

Outra Maneira:

Mover a marca num repo remoto.(Substituir a cabeça por qualquer outra, se necessário.)

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

Obter as alterações de volta.

$ git fetch --tags
 2
Author: Алексей Югов, 2018-03-15 09:51:02

Se quiser mover uma marca anotada, alterando apenas a persistência alvo, mas preservando a mensagem de anotação e outros meta-dados 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 {}
}

Utilização: moveTag

A função acima foi desenvolvida por referência teerapap/git-move-annotated-tag.sh.

 0
Author: vossad01, 2018-05-08 13:18:56