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