Как переместить тег в ветке git в другую фиксацию?

Я создал тег на главной ветви под названием v0.1 такой:

git tag -a v0.1

но потом я понял, что есть еще некоторые изменения, которые мне нужно объединить в master для выпуска 0.1, поэтому я сделал это. Но теперь мой v0.1 тег застрял на (для вызова аналогии с заметкой post-it) неправильной фиксации. Я хочу, чтобы он застрял на последнем коммите на master, но вместо этого он застрял на втором последнем коммите на master.

как я могу переместить его на самую последнюю фиксацию хозяин?

9 ответов


использовать до git tag:

-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
    

точнее, вы должны принудительно добавить тег, а затем нажать с опцией --tags и-f:

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

суммировать, если ваш пульт называется origin и вы работаете над master отрасли:

git tag -d <tagname>
git push origin :refs/tags/<tagname>
git tag <tagname> <commitId>
git push origin <tagname>
  • строка 1 удаляет тег в локальном env.
  • строка 2 удаляет тег в удаленном env.
  • строка 3 добавляет тег к другому commit
  • строка 4 нажимает изменение на пульт

вы также можете обменять на линии 4 git push origin --tags чтобы нажать все изменения с тегами из ваших локальных изменений.

основываясь на @stuart-golodetz, @greg-hewgill, @eedeep, @ben-hocking ответы, комментарии ниже их ответов и комментарии Нейтса ниже моего ответа.


удалить git tag -d <tagname> а затем воссоздать его на правильной фиксации.


псевдоним для перемещения одного тега в другую фиксацию.

в вашем примере, чтобы переместить фиксацию с хэшем e2ea1639, сделайте:git tagm v0.1 e2ea1639.

для нажатых тегов используйте git tagmp v0.1 e2ea1639.

оба псевдонима сохраняют исходную дату и сообщение. Если вы используете git tag -d вы потеряли исходное сообщение.

сохранить их на вашем

# Return date of tag. (To use in another alias)
tag-date = "!git show  | awk '{ if ( == \"Date:\") { print substr(, index(,)) }}' | tail -2 | head -1 #"

# Show tag message
tag-message = "!git show  | awk -v capture=0 '{ if(capture) message=message\"\n\"}; BEGIN {message=\"\"}; { if ( == \"Date:\" && length(message)==0 ) {capture=1}; if ( == \"commit\" ) {capture=0}  }; END { print message }' | sed '$ d' | cat -s #"

### Move tag. Use: git tagm <tagname> <newcommit> 
tagm = "!GIT_TAG_MESSAGE=$(git tag-message ) && GIT_COMMITTER_DATE=$(git tag-date ) && git tag-message  && git tag -d  && git tag -a   -m \"$GIT_TAG_MESSAGE\" #"

### Move pushed tag. Use: git tagmp <tagname> <newcommit> 
tagmp = "!git tagm   && git push --delete origin  && git push origin  #"

Я оставлю здесь еще одну форму этой команды, которая соответствовала моим потребностям.
Там была бирка v0.0.1.2 что я хотел двигаться.

$ git tag -f v0.0.1.2 63eff6a

Updated tag 'v0.0.1.2' (was 8078562)

и затем:

$ git push --tags --force

Я стараюсь избегать нескольких вещей при использовании Git.

  1. используя знание внутренних элементов, например refs / tags. Я стараюсь использовать только документированные команды Git и избегать использования вещей, которые требуют знания внутреннего содержимого .каталог git. (То есть я рассматриваю Git как пользователя Git, а не разработчика Git.)

  2. избегайте применения силы, когда это не требуется.

Итак, вот мой ненасильственный решение для изменения тега, как локально, так и удаленно, без знания внутренних элементов Git.

Я использую его, когда исправление программного обеспечения в конечном итоге имеет проблему и должно быть обновлено/переиздано.

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 пример удаленного имя, fix123 - это пример имени тега и 790a621265 образец совершить.


еще один способ:

переместить тег в удаленном РЕПО.(При необходимости замените головку на любую другую.)

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

принести изменения.

$ git fetch --tags

Если вы хотите переместить аннотированный тег, изменив только целевую фиксацию, но сохранив сообщение аннотации и другие метаданные, используйте:

moveTag() {
  local tagName=
  # Support passing branch/tag names (not just full commit hashes)
  local newTarget=$(git rev-parse ^{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

вышеуказанные функции разработан ссылок teerapap/git-move-annotated-tag.sh.