Каковы практические последствия переписывания истории GIT?

Наш проект использует git в течение недели или около того, и мы все наслаждаемся этим (использование в тесной совместной группе оказывается совершенно другим опытом работы с git). Чтобы все было как можно проще, мы не делаем никаких перебазировок или изменений в истории. Но мы сделали несколько ошибок в первую неделю. Было сделано несколько коммитов, которые не должны были быть сделаны, и нам удалось объединить функциональную ветвь с неправильной интеграционной ветвью (1.1 вместо 1.0). И мы не узнали об этих вещах, пока они не вошли в нашу историю.

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

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

  • Если я переписываю историю (и все компилируется / работает во всех затронутых ветвях), мои коллеги должны будут выполнять какие-либо специальные команды)? (Другими словами, они "знают, что я сделал это", если я сделал это хорошо?)
  • Будут ли пользователи с локальными изменениями, о которых я не знаю, иметь право на ошибки слияния в git pull?
  • Я что-то упустил здесь?

Любые ссылки на статьи / учебники на эту тему также были бы очень хорошими.

2 ответа

Решение

Требуемое чтение - Проблемы с переписыванием истории в Руководстве пользователя Git.

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

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

Будут ли пользователи с локальными изменениями, о которых я не знаю, иметь право на ошибки слияния в git pull?

Абсолютно, см. Выше.

Я что-то упустил здесь?

Избегайте переписывания истории (почти) любой ценой!

Как упомянуто в других комментариях к ответам, на практике каждый коммит уникален, и переписывание истории сделает новые коммиты.

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

Это приводит нас к нескольким веским причинам переписать историю:

  • Перед открытием общедоступного хранилища уменьшите размер: например, создайте новую локальную частную ветку, протестируйте, протестируйте, переписайте, отправьте.
  • Удалите конфиденциальные данные из частного репо, прежде чем публиковать.

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

И есть, по крайней мере, еще одна философская и упускаемая из виду причина: переписанная история - это потеря данных. Правда, история с мерзавцем revert может выглядеть грязнее, чем reset один. Но если правильно написать, весь этот "беспорядок" можно спрятать в отдельных ветвях, и все же мы можем точно увидеть, в какой момент был сделан возврат. И даже с причинами или доказательствами того, почему это было сделано.

Возвращаясь к аналогии с деревом, даже если вы удалите поддерживающее бревно, перевернутая ветвь покажет извилистые кривые роста, и это прекрасно!

Другие вопросы по тегам