2016-12-06 2 views
4

Я прочитал this о том, как изменить сообщения фиксации. В принятом ответе говорится:Зачем мне принудительно нажимать после изменения сообщения фиксации?

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

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

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

+2

не нажимайте силу, если вы не знаете, что делаете с git. – Stargateur

+2

@ Начальник Да, я еще не пробовал по этой причине. –

+2

'-force' больше не должен использоваться. Предпочитаете «--force-with-lease». Позор, что дольше писать ... – Philippe

ответ

6

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

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

Force толкая может быть опасно, как он forces other collaborators to reset their own local history к новому (вынужденному толкаемому).

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

+1

Похоже на плохой дизайн для меня. Модификация сообщений фиксации должна быть чем-то, что можно сделать безопасно, независимо от мнения о практике. – ccarton

+4

@ccarton он находится на самом * ядре * дизайна Git, что касается целостности данных * (что я упоминаю здесь: http://stackoverflow.com/a/27440678/6309). Это достигается благодаря проверке согласованности: http : //stackoverflow.com/a/28792805/6309. Ничто не может измениться без изменения SHA1 всего репо. – VonC

+2

Да, это моя точка зрения. Тот факт, что вы не можете безопасно модифицировать сообщение фиксации без угрозы целостности данных, кажется мне близоруким. Я согласен с тем, что git, поскольку он сегодня, вероятно, не может быть изменен для поддержки этого, но это не относится к делу. – ccarton

0

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

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

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

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

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

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

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

Смежные вопросы