Почему я должен принудительно нажимать после изменения сообщения фиксации?

Я прочитал этот о том, как изменить сообщения о фиксации. В принятом ответе говорится:

Если вы уже нажали свою фиксацию до удаленной ветки, вам нужно будет принудительно нажать фиксацию с помощью git git push <remote> <branch> --force.

Это мое понимание (также из принятого ответа), что git push --force будет перезаписывать все данные в удаленной ветки локальным.

Почему принудительное нажатие после изменения сообщения фиксации необходимо? Что произойдет, если я изменю сообщение фиксации и попытаюсь нажать без -f или --force?

Ответ 1

Изменяя фиксации, вы меняете свой SHA1, что означает, что локальная и удаленная история уже не совпадают.

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

Силовое нажатие может быть опасным, поскольку заставляет других соавторов reset их собственную локальную историю использовать новый (принудительно нажатый).

Как прокомментировано, --force-with-lease безопаснее (если удаленная ветка, которую вы меняете, сама изменилась с момента вашего последнего притяжения, то есть другие активно ее использовали и нажали назад, то принудительное нажатие будет отклонено).
Объедините это с разумной политикой вытягивания (где вы всегда перегружаете то, что еще не нажали), а принудительное нажатие становится менее необходимым.

Ответ 2

Я понимаю (также из принятого ответа), что git push -force будет перезаписывать все данные в удаленной ветки локальным.

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

Что произойдет, если я изменю сообщение фиксации и попытаюсь нажать без -f или -force?

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

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

Почему принудительное нажатие после изменения сообщения фиксации необходимо?

Как я уже упоминал выше, git не позволит нажать на удаленную ветку. Вы можете прочитать этот question. У этого есть много возможных обходных путей к этой проблеме.