Как пометить старый коммит в Git?

949

Мы новички в git, и я хочу установить тег в начале нашего репозитория. Наш производственный код такой же, как и в начале репозитория, но с тех пор мы сделали коммиты. Тег в начале позволил бы нам «откатить» производство до известного стабильного состояния.

Итак, как добавить тег в произвольный, более старый коммит?

hogsolo
источник
Я пришел сюда в поисках помощи по удалению старого тега локально и на удаленном компьютере и в итоге нашел это полезным, может быть, это поможет кому-то еще: gist.github.com/mobilemind/7883996
Александр Лидтке
1
И не забудьте Как вставить тег в удаленный репозиторий с помощью Git? потому что Git не будет выдвигать тег, не делая ничего особенного.
18:18

Ответы:

1511

Пример:

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

Где 9fceb02находится начальная часть идентификатора коммита.

Затем вы можете нажать тег с помощью git push origin v1.2.

Вы можете сделать, git logчтобы показать все идентификаторы коммитов в вашей текущей ветке.

В книге Pro Git также есть хорошая глава о тегах .

Предупреждение. При этом создаются теги с текущей датой (например, это значение будет отображаться на странице релизов GitHub). Если вы хотите, чтобы тег был датирован датой фиксации, посмотрите другой ответ .

dkinzer
источник
45
Вы также можете сделать это в меню правого клика в gitk - это удобно, если вы так или иначе находите SHA1.
Каскабель
62
Опустите -aи -m "Message here"части, если вы не хотите добавлять сообщение:git tag v1.2 9fceb02
devius
3
Вы также можете использовать полный идентификатор фиксации.
J08Llue
1
@devius Какая разница между использованием -aи -m. Похоже, что на странице руководства -aподразумевается, когда -mона используется.
Джон Строуд
7
git push --tags origin masterподтолкнул бы все теги на локальном филиале к удаленному. Предпочитаю git push origin <tag_name>просто нажать созданный тег. См: stackoverflow.com/a/5195913/452708 , git-scm.com/book/en/v2/Git-Basics-Tagging
Abhijeet
144

Просто код

# 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

подробности

Ответ @dkinzer создает теги, дата которых является текущей датой (когда вы выполнили git tagкоманду), а не датой фиксации. В справке Git tagесть раздел «О тегах задним числом», который гласит:

Если вы импортировали некоторые изменения из другой VCS и хотели бы добавить теги для основных выпусков своей работы, полезно иметь возможность указать дату для вставки внутрь объекта тега; такие данные в объекте tag влияют, например, на порядок тегов в интерфейсе gitweb.

Чтобы установить дату, используемую в будущих объектах тегов, установите переменную среды GIT_COMMITTER_DATE(см. Последующее обсуждение возможных значений; наиболее распространенная форма - «ГГГГ-ММ-ДД ЧЧ: ММ»).

Например:

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

Страница «Как пометить в Git» показывает нам, что мы можем извлечь время фиксации HEAD через:

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

Мы могли бы извлечь дату конкретного коммита через:

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

Однако вместо того, чтобы повторять коммит дважды, кажется, проще просто изменить HEAD на этот коммит и неявно использовать его в обеих командах:

git checkout 9fceb02 

GIT_COMMITTER_DATE="$(git show --format=%aD | head -1)" git tag -a v1.2 -m "v1.2"
Phrogz
источник
4
@ColonelPanic, твое желание - моя команда! github.com/lucasrangit/git-custom-commands/blob/master/…
Лукас
Если вы используете Github для управления выпусками и заботитесь о дате, показанной на странице / тегах вашего проекта, настройка GIT_COMMITTER_DATE особенно важна!
Лесли
2
@ColonelPanic Я дал вам голос за каламбур и хотел бы дать вам второй голос за код, но звезда github должна будет это сделать.
andyhasit
96

Самый простой способ сделать это:

git tag v1.0.0 f4ba1fc

с f4ba1fcначалом хэша коммита, который вы хотите пометить, и v1.0.0версией, которую вы хотите пометить.

PatrickNLT
источник
1
Прекрасное спасибо :).
Салех Энам Шохаг
36

ОК , вы можете просто сделать:

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

Поэтому, если вы хотите добавить тег: 1.0.2 для фиксации e50f795, просто выполните:

git tag -a 1.0.2 e50f795

Также вы добавляете сообщение в конце, используя -mчто-то вроде этого:

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

В конце концов, вам нужно подтолкнуть его к тому remote, чтобы сделать это, просто сделайте:

git push origin 1.0.2 

Если у вас есть много тегов, которые вы не хотите упоминать по одному, просто сделайте:

git push origin --tags

собрать все теги вместе ...

Кроме того, я создал шаги на изображении ниже, для более ясного объяснения шагов: создание тега для хеша коммита

Вы также можете добавить тег в Hub или использовать такие инструменты, как SourceTree , чтобы избежать предыдущих шагов, я вошел в свой Bitbucket в этом случае и сделал это оттуда:

  1. Перейдите в свою ветку и найдите коммит, в который вы хотите добавить тег, и нажмите на него:

найти свой коммит в bitbucket

  1. На странице фиксации справа найдите место, где оно написано, No tagsи щелкните +значок:

найти где написано нет тегов

  1. В поле имени тега добавьте свой тег:

добавить имя тега

  1. Теперь вы видите, что тег успешно создан:

введите описание изображения здесь

Алиреза
источник
11

Это старый вопрос, и ответы уже даны для всей работы, но есть и новый вариант, который можно рассмотреть.

Если вы используете SourceTree для управления своими git-репозиториями, вы можете щелкнуть правой кнопкой мыши на любом коммите и добавить к нему тег. Еще одним щелчком мыши вы также можете отправить метку прямо в ветку в начале координат.

Стефан Бийзиттер
источник
6

Основываясь на ответах других, вот решение с одной строкой, которое устанавливает дату тега, когда оно действительно произошло, использует аннотированный тег и не требует 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

где tagзадается желаемая строка тега и commitхеш коммита.

Stason
источник
3

Ответ на @Phrogz велик, но не работает на Windows. Вот как можно пометить старый коммит исходной датой коммита с помощью Powershell:

git checkout 9fceb02
$env:GIT_COMMITTER_DATE = git show --format=%aD | Select -First 1
git tag v1.2
git checkout master
ccoxtn
источник