Как зафиксировать отсутствие изменений и новое сообщение?


137

Как я могу создать новое commitи создать новое сообщение, если в файлы не вносятся изменения?

Разве это невозможно, поскольку код коммита (SHA?) Будет таким же?

Ответы:


168

Для этого редко есть веская причина, но параметр предназначен --allow-emptyдля пустых коммитов (файлы не изменяются), в отличие от --allow-empty-messageпустых сообщений о фиксации. Вы также можете узнать больше, набрав git help commitили посетив онлайн-документацию .

Хотя объект дерева (имеющий собственный хэш) будет идентичным, фиксация фактически будет иметь другой хеш, потому что предположительно будет иметь другую метку времени и сообщение, и определенно будет иметь другую родительскую фиксацию. Все три фактора интегрированы в gitалгоритм хеширования объектов.


Там являются несколько причин , вы можете совершить пустой ( с учетом некоторых замечаний):

  • В качестве «декларативной фиксации» для добавления повествования или документации (через Дэвида Нейсса ), включая постфактум о прохождении тестов или линте (через Роберта Балики ).
  • Для тестирования gitкоманд без генерации произвольных изменений (через Vaelus ).
  • Чтобы воссоздать удаленный голый репозиторий, используя gitolite(через Tatsh ).
  • Произвольно создать новую фиксацию, например, для повторного запуска инструментария сборки (через mattLummus ) или для личного ведения журнала или показателей (через DynamiteReed ). Однако подумайте дважды: в зависимости от вашей структуры веток / слияния коммиты могут существовать очень долго, поэтому стратегия «просто ничего не фиксировать» может непреднамеренно загрязнить репозиторий вашей команды временными артефактами рабочего процесса и затруднить отделение ревизий кода от эфемерный хлам.

Другие стратегии добавления метаданных в дерево фиксации включают:

  • Отдельные ветки или облегченные теги, которые всегда указывают на фиксацию определенного статуса (например, «последняя принятая фиксация» или «текущая промежуточная фиксация»).
  • Аннотированные теги для способа записи отметки времени, коммиттера и сообщения, указывающих на существующую фиксацию, без добавления записи в самом дереве фиксации.
  • git notes чтобы связать изменяемую заметку поверх существующей неизменной фиксации.

2
Я начал следовать модели ветвления потока git . Когда вы создаете devформу ветки, masterа затем featсразу же ветвь dev, featветвь выглядит как исходящая из masterветки, так как нет отличительной фиксации в devветке, из которой featпроисходит ветка. Пустая фиксация при первом создании devветки помогает установить devветвь как собственную бессрочно существующую ветвь, независимую от master. Обычно это полезно, когда вы используете ветки как слои и создаете два слоя из одного коммита
Novice C

2
Другая причина: если вы пропустите что-то важное в сообщении о фиксации перед отправкой, вы не сможете этого сделать, commit --amendесли удаленный компьютер не разрешает принудительное нажатие. Таким образом, вы можете позволить разработчикам увидеть важное сообщение, связанное с предыдущей фиксацией.
Энди Дж

1
Я хочу сделать это, потому что я нажал фиксацию, но забыл упомянуть что-то в сообщении фиксации. Наши сообщения о фиксации интегрированы с программным обеспечением для отслеживания проблем и непрерывной интеграции, и содержимое сообщения о фиксации влияет на эти приложения. Есть ли способ лучше? В моем случае это лучшее решение. Единственное, что я могу себе представить, это как-то вернуть предыдущую фиксацию.
sytech

1
Я просто использовал это, чтобы активировать наш хук предварительной фиксации, который выполняет скрипт для базы данных. Итак, изменения были, просто git не мог их видеть, пока не запустился скрипт. Конечно, можно было бы запустить его вручную, но тогда скрипт будет запущен дважды.
yoyodyn

1
Очень полезно при взаимодействии с отслеживанием проблем, встроенным в серверы git, такие как github и gogs.
SimonF

37

Если я вас правильно понял, вы хотите сделать пустой коммит. В таком случае вам понадобятся:

git commit --allow-empty

35

Пустая фиксация с сообщением

git commit --allow-empty -m "Empty test commit"

Пустая фиксация с пустым сообщением

git commit --allow-empty --allow-empty-message

3

Если вы используете такую ​​систему, как gitversion, имеет смысл делать такого рода фиксацию. У вас может быть коммит, специально предназначенный для изменения основной версии с помощью комментария + semver: major.


3

Возможно, в качестве более разумной альтернативы вы могли бы создать аннотированный тег (именованный коммит с сообщением). Смотрите git tag -aвариант.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.