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?
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
-
Apague a etiqueta em qualquer comando antes de empurrar
git push origin :refs/tags/<tagname>
-
Substitua a etiqueta por referência à persistência mais recente
git tag -fa <tagname>
-
Empurra a etiqueta para a origem remota
git push origin master --tags
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
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.
Apaga - o com {[[0]} e depois recria-o na persistência correcta.
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 #"
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
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.)
Evitar o uso da força quando não for necessário.
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.
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
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.