Каковы практические последствия перезаписи истории GIT?
Наш проект использует git в течение недели или около того сейчас, и нам все это очень нравится (использование его в совместной совместной группе оказывается совсем другим опытом git). Чтобы все было как можно проще, мы не делаем никаких изменений или изменений в истории. Но за первую неделю мы допустили несколько ошибок. Было сделано несколько коммитов, которые не должны были быть выполнены, и нам удалось объединить ветвь функции в неправильную ветку интеграции (1.1 вместо 1.0). И мы не узнали об этих вещах, пока они не вошли в нашу историю.
Теперь я вижу много предупреждений о переписывании истории, но я не совсем уверен, что понимаю опасения. Мы используем общий открытый репозиторий, и все ветки нажимаются туда для резервного копирования.
Я бы ожидал, что, если вы перепишете историю (например, удалите фиксацию), полный список последующих коммитов будет "потерять", который совершает (а может и не компилируется/работает). Я также ожидал бы, что если это произойдет, я действительно смогу исправить это в верхней части истории (и просто оставим эту часть истории не компиляцией).
- Если я переписываю историю (и все компилируется/работает во всех затронутых ветвях), мои коллеги должны делать какие-либо специальные команды)? (Другими словами, будут ли они "знать, что я это сделал", если бы я сделал это хорошо?)
- Будут ли какие-либо пользователи с локальными изменениями, о которых я не знаю, могут иметь право на слияние сбоев на git pull?
- Я пропустил что-то важное здесь?
Любые ссылки на статьи/учебные пособия по этому вопросу также будут очень приятными.
Ответы
Ответ 1
Требуемое чтение Проблемы с историей перезаписи в руководстве пользователя Git.
Если я переписываю историю (и все компилируется/работает во всех затронутых ветвях), мои сотрудники должны делать какие-либо специальные команды (т.е. будут ли они "знать, что я это сделал", если бы я сделал это хорошо?)?
Они будут знать, и Git расскажет им в недвусмысленных выражениях, что что-то не так. Они получат неожиданные сообщения об ошибках и могут пытаться разрешить возникающие конфликты слияния, непреднамеренно возвращают предыдущие коммиты. Эта проблема создает реальное сообщение, и если вам интересно узнать, что происходит, вы всегда можете попробовать его на временной копии своих репозиториев.
Будут ли какие-либо пользователи с локальными изменениями, о которых я не знаю, могут иметь право на слияние ошибок на Git pull?
Абсолютно, см. выше.
Я пропустил что-то важное здесь?
Избегайте переписывания истории (почти) всех затрат!
Ответ 2
Как упоминалось в других комментариях к ответам, на практике каждая фиксация уникальна, и переписывание истории приведет к новым коммитам.
Вы можете думать об этом, как обрезать ветки дерева, а затем мгновенно выращивать новые. Они могут даже выглядеть одинаково, но нет. Да, магия вуду. В этой аналогии возврат был бы почти таким же, как поддержка падающей ветки с логом, поэтому он будет расти без падения.
Это приводит нас к нескольким веским причинам переписать историю:
- Перед тем, как открыть публикацию, удалите приватный репозиторий: например, создайте новую локальную частную ветвь, протестируйте, протестируйте, перепишите, нажмите.
- Перед публикацией удалите конфиденциальные данные из частного репо.
Те уже показывают, что Грег уже сказал: переписывание истории потенциально может испортить всех, если репозиторий публично (push-commits). Причина, почему я также выступаю за то, чтобы избегать ее вообще любой ценой даже в частных репозиториях, просто чтобы сохранить хорошую привычку: и поэтому переписывать историю следует избегать любой ценой (это означает просто дать достаточно внимания перед тем, как сделать это: весить плюсы и минусы!)
И есть, по крайней мере, еще одна философская и пропущенная причина: переписанная история - потеря данных. Правда, история git с revert
может выглядеть более беспорядочной, чем reset
. Но если правильно написано, все, что "беспорядок" может быть скрыто в отдельных ветвях, и все же мы можем точно видеть, в какой момент был сделан возврат. И даже с указанием причин или доказательств того, почему это было сделано.
Вернемся к аналогии дерева, даже если вы удалите вспомогательный журнал, вернувшаяся ветвь покажет извилистые растущие кривые, и это красиво!