DEATH2298
@DEATH2298

Чем опасен force push?

Чем так опасен git push -f ?
Некоторые говорят что никогда не делайте force push если работаете в команде. Хотя почему нет, никто не говорит.

Вот и задумался, возникла такая ситуация сделал git commit --ammed что бы изменить автора коммита и пришлось сделать git push --force, так как простой push не сработал.

Безопасно ли такую ветку обьединить с основным?
То есть от mastera создана ветка test в этой ветке последний коммит изменен с помошью ammed и сделан push -f.
  • Вопрос задан
  • 339 просмотров
Пригласить эксперта
Ответы на вопрос 2
l3ftoverz
@l3ftoverz
Люблю front-end
не делайте force push если работаете в команде. Хотя почему нет, никто не говорит.

Стало бы сразу ясно что это, если бы открыли документацию. Когда выполняете пуш с -f вы затираете всё своими изменения (включая те, которые кто-то другой уже мог запушить, т.е. есть риск потереть чужие изменения).

В вашем случае, если эта ветка конкретно для вас (например у вас фича-бренч) ничего страшного нет.

Есть более безопасный вариант:
git push --force-with-lease origin <имя_ветки>

Если кто-то что-то закомитил (Я так понимаю HEAD будет отличаться?) - форс не пройдет, выдаст ошибку, после чего вы сможете сперва запулить изменения, а уже после снова попробовать форс.
Ответ написан
Lobotomist
@Lobotomist
Software Developer
BD_ l3ftoverZ! ответил в принципе верно - можно затереть чужие изменения, но это не единственная опасность.

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

История из жизни.

Вот реальная ситуация, которая произошла у меня на работе. К сожалению, за давностью лет конкретные детали я помню смутно, но в целом все было примерно так. В какой-то момент появилась ошибка. Причем код, в котором она была был очень "говнокод", человек его написавший уже уволился и понять в каком месте этот говнокод написан неправильно, не понимая "логики" автора было очень сложно. С помощью git-bisect я нашел проблемный коммит и стал дальше раскручивать клубок. В итоге выяснилось, что было нарушено по крайней мере три важных правила работы с гитом (описанные во внутренней вики и обязательные к исполнению) и если бы хотя бы одно из них нарушено не было - все было бы ок.
1. Я сделал пуш в мастер и оперативно осознав, что что-то там не так быстренько поправил и залил форсед пушем исправления. Это было важно сделать именно так. Я решил, что во-первых, маловероятно, что кто-то успел сделать пулл, а во-вторых, даже если он и сделал - когда у него возникнут конфликты он либо сам все поймет, либо обратится ко мне. Первое нарушение. Мне следовало уведомить всех разработчиков об этом и объяснить как нужно правильно действовать.
2. Естественно, один разработчик успел сделать пулл и отребэйзил на старый мастер ветку этого уволившегося и стал доделывать таск. Когда спустя продолжительное время он стал ребэйзить эту ветку на мастер у него полезли конфликты. Он не понял из-за чего эти конфликты возникли. Но храбро все их решил. Етественно, не правльно, уже хотя-бы потому, что он вообще не должен был их решать. Нарушение второго правила - "решай конфликты только тогда, когда ты понимаешь почему они возникли". Обратись он ко мне - все было бы в порядке.
3. Когда он стал пушить свои изменения он нарушил третье правило: "Всегда проверяй список коммитов, которые ты пушишь". Он не заметил, что кроме "своих" коммитов, он так же пушит чужие, старые версии коммитов мастера, которые он отребэйзил на новые. Он должен был это заметить и забить тревогу - что такое, откуда эти коммиты, я их не делал. Опять же, обратись он ко мне - я бы на месте бы разобрался в чем дело, и исправил ситуацию.

Так что не надейтесь на авось (как я в данном случае).


В целом, получается так - если ты понимаешь, что обе проблемы - 1) перезатирание чужих изменений и 2) наличие у кого-то старых версий коммитов не актуальны - смело делай форсед пуш. Например:
  • Это ветка по задаче, в которой работаешь только ты и согласно workflow никто не должен без твоего ведома брать из нее какие-то коммиты.
  • Ты точно знаешь кто имеет доступ к ветке и уверен, что эти люди с ситуацией справятся корректно. Ты их предупредил и они знают что в таких ситуациях делать.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы