2012-02-21 3 views
2

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

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

ответ

2

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

-f, --force

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

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

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

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

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

+0

Так предположительно можно перезаписать каждую фиксацию во всей истории с использованием этого метода. Разве это не нарушает один из принципов контроля версий? –

+2

@SteveBennett: да, вы можете технически перезаписать всю историю. Это * технически * нарушает контроль источника, но вы никогда не столкнетесь с какими-либо проблемами на практике, потому что любой, кто клонирует репозиторий, может восстановить историю, используя свой клон. Кроме того, предпочтительный способ использования Git - использовать запросы pull/merge, чтобы разрешить просмотр коммитов, и поэтому только один человек имеет доступ к любому репозиторию. –

+0

Оба очень разумных момента. –

1

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

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

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

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

+0

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

+0

Технически в вашем сценарии у вас есть 2 репозитория, один из которых на Github плюс тот, из которого вы нажимаете. Но факт заключается в том, что ваш локальный репозиторий не может включать состояние ветки, как в репозитории Github. Так что да, вы потеряете фиксации в этом очень странном (но возможном) состоянии. –

1

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

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

+0

Да, интересно. В отличие от сценариев, предложенных Фредом и Андреем, это могло произойти по ошибке. Вам рекомендуется переписать историю, вам предлагается поделиться изменениями - вам почему-то нужно избегать объединения этих двух вещей. –

+0

@SteveBennett: Даже если это происходит «по ошибке» (больше похоже на то, что кто-то неправильно понимал, что происходит на самом деле), удаленный конец откажется принять нажатие, если он не может выполнить ускоренное слияние. Существует множество способов уничтожить/перезаписать фиксации. Поскольку все операции выполняются * локально *, все безопасно. Это «git push», который, вероятно, фактически что-то стирает. Вам все равно нужно «git push -f», чтобы фактически потерять историю. –