Является ли git pull --rebase безопасным, если вы используете централизованную модель и никогда не применяете силу?

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

Однако есть один ответ, который заставляет меня задуматься:

https://stackoverflow.com/a/2597107/1339987

Зарегистрируйтесь в ветке. Толкать. Слияние с другой веткой (скажем, вы поддерживаете две базовые версии, ветку патча и ветку новой разработки). Осознайте, что другие коммиты были отправлены в серверную ветку, которую вы отслеживаете. pull --rebase. Внезапно вы переделали каждую фиксацию против нового хэша - и уничтожили фиксацию слияния.

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


person djechlin    schedule 08.03.2013    source источник


Ответы (3)


Рассматриваемый сценарий на самом деле возможен, но его последствия не так серьезны, как вы могли предположить. После того, как что-то зафиксировано в git, вы не можете потерять эту работу в течение как минимум 30 дней (по умолчанию, настраивается git config gc.reflogexpireunreachable).

Если описанный выше сценарий произошел и вы его обнаружили, вы всегда можете вернуться к предыдущей подсказке этой ветки до перебазирования. Вы можете найти этот совет, просмотрев git reflog или указав время в кассе, например: git checkout 'HEAD@{5 minutes ago}'.

За годы использования git я никогда не использовал git pull --rebase, потому что команда pull в целом работает на более высоком уровне, чем я предпочитаю думать. Я предпочитаю делать аналог:

git fetch origin
git rebase -i origin/branch

Явное имя ветки и интерактивная опция на git rebase означают, что я всегда в курсе, что перебазируется. Иногда, когда я делаю что-то не так, я удивляюсь и обнаруживаю гигантский список коммитов в моем редакторе rebase.

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

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

Также обратите внимание: git rebase имеет возможность попытаться сохранить слияния. Не похоже, что есть простой способ указать это с помощью git pull --rebase.

person djs    schedule 08.03.2013

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

Если вы что-то изменили, а git pull - это не просто перемотка вперед, вы получите слияние и, следовательно, несколько более беспорядочную историю. Если ваши изменения еще не внесены, я бы предпочел использовать git pull --rebase, чтобы сохранить историю в чистоте (и включить изменения из восходящей ветки).

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

person vonbrand    schedule 09.03.2013

По сути, так работает gerrit. Только авторизованные пользователи нажимают на фактическое репо; большинство просто отправляет на сервер обзора gerrit и позволяет gerrit выполнить слияние. В конце концов, когда вы вытягиваете, вы получаете «централизованную» версию репозитория, и связанный с ней инструмент repo позаботится о том, чтобы всегда выполнять перебазирование ваших веток вместо слияния.

В этой модели пользователи всегда тянут с перебазированием. Пока что для Android это работает хорошо.

person nneonneo    schedule 08.03.2013