Como marcar um commit mais antigo no Git?

949

Nós somos novos no git e quero definir uma tag no início do nosso repositório. Nosso código de produção é o mesmo do repositório inicial, mas fizemos confirmações desde então. Uma tag no início nos permitiria "reverter" a produção para um estado conhecido e estável.

Então, como adicionar uma tag a um commit arbitrário e antigo?

hogsolo
fonte
Eu vim aqui à procura de ajuda a exclusão de um tag velho localmente e em um remoto e finalmente encontrado este útil, talvez ele vai ajudar alguém também: gist.github.com/mobilemind/7883996
Aleksander Lidtke
1
E não esqueça Como enviar uma tag para um repositório remoto usando o Git? porque o Git não envia uma tag sem fazer algo especial.
JWW

Respostas:

1511

Exemplo:

git tag -a v1.2 9fceb02 -m "Message here"

Onde 9fceb02é a parte inicial do ID de confirmação.

Você pode pressionar a etiqueta usando git push origin v1.2.

Você pode fazer git logpara mostrar todos os IDs de confirmação em sua ramificação atual.

Há também um bom capítulo sobre marcação no livro Pro Git.

Aviso: Isso cria tags com a data atual (e esse valor é o que será exibido em uma página de lançamentos do GitHub, por exemplo). Se você deseja que a tag seja datada com a data de confirmação, consulte outra resposta .

dkinzer
fonte
45
Você também pode fazer isso no menu do botão direito do mouse no gitk - conveniente se é assim que você encontra o SHA1 de qualquer maneira.
Cascabel
62
Omitir o -ae as -m "Message here"partes se você não quiser adicionar uma mensagem:git tag v1.2 9fceb02
Devius
3
Você também pode usar o ID de confirmação completo.
precisa saber é o seguinte
1
@ devius Qual é a diferença entre usar -ae -m. A página de manual parece dizer que -aestá implícita quando -musada.
John Strood
7
git push --tags origin masterenviaria todas as tags da filial local para remotas. Prefira git push origin <tag_name>pressionar apenas a tag criada. Consulte: stackoverflow.com/a/5195913/452708 , git-scm.com/book/en/v2/Git-Basics-Tagging
Abhijeet
144

Apenas o código

# Set the HEAD to the old commit that we want to tag
git checkout 9fceb02

# temporarily set the date to the date of the HEAD commit, and add the tag
GIT_COMMITTER_DATE="$(git show --format=%aD | head -1)" \
git tag -a v1.2 -m"v1.2"

# set HEAD back to whatever you want it to be
git checkout master

Detalhes

A resposta de @dkinzer cria tags cuja data é a data atual (quando você executou o git tagcomando), não a data do commit. A ajuda do Git tagpossui uma seção "Em tags de backdating", que diz:

Se você importou algumas alterações de outro VCS e gostaria de adicionar tags para as principais versões do seu trabalho, é útil poder especificar a data a ser incorporada no objeto tag; esses dados no objeto tag afetam, por exemplo, a ordem das tags na interface gitweb.

Para definir a data usada em futuros objetos de marca, defina a variável de ambiente GIT_COMMITTER_DATE(consulte a discussão posterior sobre valores possíveis; a forma mais comum é "AAAA-MM-DD HH: MM").

Por exemplo:

$ GIT_COMMITTER_DATE="2006-10-02 10:31" git tag -s v1.0.1

A página "Como marcar no Git" nos mostra que podemos extrair o tempo do commit HEAD via:

git show --format=%aD  | head -1
#=> Wed, 12 Feb 2014 12:36:47 -0700

Podemos extrair a data de um commit específico via:

GIT_COMMITTER_DATE="$(git show 9fceb02 --format=%aD | head -1)" \
git tag -a v1.2 9fceb02 -m "v1.2"

No entanto, em vez de repetir o commit duas vezes, parece mais fácil alterar o HEAD para esse commit e usá-lo implicitamente nos dois comandos:

git checkout 9fceb02 

GIT_COMMITTER_DATE="$(git show --format=%aD | head -1)" git tag -a v1.2 -m "v1.2"
Phrogz
fonte
4
@ColonelPanic, seu desejo é meu comando! github.com/lucasrangit/git-custom-commands/blob/master/…
Lucas
Se você usa o Github para gerenciar lançamentos e se preocupa com a data mostrada na página / tags do seu projeto, definir GIT_COMMITTER_DATE é particularmente importante!
Lesley
2
@ColonelPanic Eu te dei um voto positivo pelo trocadilho, e gostaria de poder dar um segundo para o código, mas uma estrela do github terá que fazer.
precisa saber é o seguinte
96

A maneira mais simples de fazer isso é:

git tag v1.0.0 f4ba1fc

com f4ba1fcsendo o início do hash do commit você quiser tag e v1.0.0sendo a versão que você deseja marcar.

PatrickNLT
fonte
Perfeito obrigado :).
Saleh Enam Shohag
36

OK , você pode simplesmente fazer:

git tag -a <tag> <commit-hash>

Portanto, se você deseja adicionar a tag: 1.0.2 a confirmar e50f795, basta:

git tag -a 1.0.2 e50f795

Além disso, você adiciona uma mensagem no final, usando -malgo como isto:

git tag -a 1.0.2 e50f795 -m "my message"

Afinal, você precisa empurrá-lo para o remote, para fazer isso, basta fazer:

git push origin 1.0.2 

Se você possui muitas tags que não deseja mencioná-las uma a uma, basta:

git push origin --tags

para juntar todas as tags ...

Além disso, criei as etapas na imagem abaixo, para obter mais esclarecimentos sobre as etapas: criando tag em um hash de confirmação

Você também pode copiar a tag no Hub ou usar ferramentas como o SourceTree . Para evitar as etapas anteriores, entrei no meu Bitbucket nesse caso e fiz isso a partir daí:

  1. Vá para o seu ramo e encontre o commit ao qual você deseja adicionar a tag e clique nela:

encontre seu commit no bitbucket

  1. Na página de confirmação , à direita, encontre o local indicado No tagse clique no +ícone:

encontre onde está escrito Sem tags

  1. Na caixa nome da tag, adicione sua tag:

adicionar nome da tag

  1. Agora você vê que a tag foi criada com sucesso:

insira a descrição da imagem aqui

Alireza
fonte
11

Esta é uma pergunta antiga, e as respostas já dão todo o trabalho, mas também há uma nova opção que pode ser considerada.

Se você estiver usando o SourceTree para gerenciar seus repositórios git, poderá clicar com o botão direito do mouse em qualquer confirmação e adicionar uma tag a ele. Com outro clique do mouse, você também pode enviar a tag diretamente para a ramificação na origem.

Stephan Bijzitter
fonte
6

Com base nas respostas dos outros, aqui está uma solução de uma linha que define a data da tag para quando ela realmente aconteceu, usa tag anotada e não requer git checkout:

tag="v0.1.3" commit="8f33a878" bash -c 'GIT_COMMITTER_DATE="$(git show --format=%aD $commit)" git tag -a $tag -m $tag $commit'
git push --tags origin master

onde tagé definido como a string de tag desejada e commitcom o hash de confirmação.

Stason
fonte
3

A resposta do @Phrogz é ótima, mas não funciona no Windows. Veja como marcar um commit antigo com a data original do commit usando o Powershell:

git checkout 9fceb02
$env:GIT_COMMITTER_DATE = git show --format=%aD | Select -First 1
git tag v1.2
git checkout master
ccoxtn
fonte