Как обновить тег в Git: возможно ли это и стоит ли делать?

Теги в Git — это ваши «якоря» в истории коммитов. Они отмечают важные моменты: релизы, версии, стабильные сборки. Но что, если вы ошиблись и нужно исправить тег? Можно ли его просто обновить? Давайте разберёмся!

Почему теги «неизменяемы»?

По задумке Git, теги — неизменяемые ссылки. Они создаются для того, чтобы зафиксировать конкретный коммит. Если бы теги можно было легко менять, версионность потеряла бы смысл: сегодня v1.0 указывает на один коммит, завтра — на другой. Хаос!

Когда может понадобиться обновить тег?

  • Вы случайно поставили тег не на тот коммит
  • Опечатка в сообщении аннотированного тега
  • Тег ссылается на сломанную сборку

Как «перезаписать» тег: пошаговая инструкция

 Локальная перезапись (если тег ещё не опубликован)

# Удаляем старый тег локально
git tag -d v1.0.1

# Создаём новый с тем же именем на нужном коммите
git tag -a v1.0.1 -m "Исправленная версия 1.0.1" a1b2c3d

# Проверяем
git show v1.0.1

 Если тег уже отправлен в удалённый репозиторий

Важно: предупредите команду! Это критическое изменение.

# Удаляем тег из удалённого репозитория
git push origin --delete v1.0.1

# Удаляем локально
git tag -d v1.0.1

# Создаём новый тег
git tag -a v1.0.1 -m "Правильный релиз 1.0.1" e4f5g6h

# Пушим новый тег
git push origin v1.0.1

Быстрый способ (с принудительной перезаписью)

# Перемещаем тег на другой коммит
git tag -a -f v1.0.1 a1b2c3d -m "Обновлённое сообщение"

# Принудительно отправляем изменения
git push origin -f --tags
# Или для одного тега: git push origin -f v1.0.1

 Опасности и подводные камни

  1. Рассинхронизация: Если другие разработчики уже скачали старый тег, у них останется некорректная ссылка
  2. Сломанные зависимости: Системы сборки могут зависеть от конкретных тегов
  3. Путаница в истории: Может усложнить поиск багов («а на каком коммите был тег вчера?»)

Выводы

Технически обновить тег можно, но семантически — почти никогда не нужно.

Git предоставляет инструменты для перезаписи тегов, но они похожи на «аварийный молоток»: используйте только в крайних случаях и с полным пониманием последствий.

Для релизов придерживайтесь философии «тег — это веха в истории». Ошибся? Создай новый тег. Так ваша история изменений останется чистой и предсказуемой.

Конфигурирование глобального игнорирования в Git

За глобальное игнорирование файлов в Git отвечает файл, путь к которому указан в настройке core.excludesfile. Обычно его называют .gitignore_global.Вот краткая шпаргалка, как это работает:

Зачем это нужно?

В каждом проекте есть локальный .gitignore, но в него неудобно записывать настройки вашей ОС или IDE (например, файлы .DS_Store, папки .vscode или .idea). Чтобы не прописывать их в каждом новом репозитории, проще создать один глобальный список.

Как настроить за 3 шага:

  1. Создайте файл (обычно в домашней папке пользователя):
    • Windows: %USERPROFILE%\.gitignore_global
    • macOS / Linux: ~/.gitignore_global
  2. Укажите Git, где лежит этот файл, выполнив команду в терминале:
git config --global core.excludesfile ~/.gitignore_global

3. Добавьте в него мусор, который вы не хотите видеть в своих репозиториях:

.DS_Store
Thumbs.db
.vscode/
.idea/
*.log

Как проверить?

Чтобы узнать, какой файл сейчас используется как глобальный, введите:
git config --get core.excludesfileБолее подробную информацию о правилах исключения можно найти в справочнике Git по игнорированию файлов.

Как подключиться ко встроенной БД gitlab и посмотреть активные коннекты

cd /root
docker-compose exec web /bin/bash
su - gitlab-psql
psql -h /var/opt/gitlab/postgresql/ gitlabhq_production
SELECT current_setting('max_connections');
SELECT * FROM pg_stat_activity;

GIT fatal: inflateInit: out of memory

На одном из серверов при попытке пушнуть взятый под git код возникла ошибка
Delta compression using up to 24 threads.
fatal: inflateInit: out of memory (no message)

Помогло сокращение трэдов упаковки

git config --global pack.threads 1

Как правильно перемещать новую ветку на удаленный git репозитиорий и с него

Чтобы закинуть новую ветку на удаленный репозиторий:

git push origin newbranch

Чтобы забрать ветку, не забываем сделать 

git pull

а затем

git checkout -b newbranch origin/newbranch