Необратимый толчок мерзавца - PullRequest
2 голосов
/ 21 февраля 2012

Я все еще пытаюсь понять последствия перебазирования и переписывания истории Git.Представьте себе репозиторий R на github с годовой историей ценного исходного кода.Допустим, это единственная копия на планете.

Могут ли коммиттер сделать клонирование хранилища, внести некоторые изменения и отодвинуть их назад, что приведет к необратимым потерям в этом хранилище?Я не знаю, какая-то странная последовательность ребаз, удаляет, толкает?И если так, есть ли такие последовательности, которые были бы необратимыми сразу (а не через месяц или около того, после сбора мусора)?

Ответы [ 3 ]

2 голосов
/ 21 февраля 2012

По умолчанию запросы без ускоренной пересылки отклоняются сервером.Однако на странице руководства git-push вы можете найти способ заставить сервер принять потенциально деструктивную операцию push:

-f, -force

Обычно команда отказывается обновлять удаленную ссылку, которая не является предком локальной ссылки, используемой для ее перезаписи.Этот флаг отключает проверку. Это может привести к потере коммитов удаленным репозиторием;используйте его с осторожностью.

Как сказано в предупреждении, это может привести к потере пульта дистанционного управления одного или нескольких коммитов.В частности, это может произойти, если коммит целевой ветви недоступен из заголовка другой ветки.

Например, следующий сценарий может привести к потере коммитом сервера:

git clone ...
edit ...
git add .
git commit --amend -m "These changes overwrite origin/master's HEAD."
git push -f origin master

Однакоесли коммит, который вы только что пытались перезаписать, оказался помеченным или доступным из заголовка другого филиала, коммит не будет потерян.

1 голос
/ 22 февраля 2012

Да, некоторые операции навсегда уничтожат вашу историю, например:

git push repo-name +master 

перезапишет ваше главное репо (имя репо) локальной веткой, потерявшей основную историю.

Но самый распространенный способ уничтожить вашу историю - это интерактивный ребазинг:

git rebase -i 6bd80e12

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

Я рекомендую прочитать больше:

http://gitready.com/advanced/2009/02/10/squashing-commits-with-rebase.html

http://progit.org/book/ch6-4.html

http://book.git -scm.com / 4_interactive_rebasing.html

1 голос
/ 21 февраля 2012

Если вы принудительно отправите репозиторий, некоторые коммиты могут быть недоступны, как объяснил Андре Кэрон.

Github не позволяет вам получить доступ к репозиторию (потому что это не совсем стандартный репозиторий git и потому что это не ваше дело в любом случае). Так что в этом случае вы фактически потеряете информацию.

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

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

...