2009-09-29 8 views
22

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

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

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

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

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

+0

Вы работаете среди команды других людей, и вы не перебазите ?! Как вы обеспечиваете, чтобы все происходило в правильном порядке ?! – Goober

+0

@Goober: Наивный ответ от меня здесь, это проблема? Мы тестируем тест, поэтому я считаю, что мы его поймаем. – krosenvold

ответ

14

Обязательное чтение: Problems with rewriting history в Руководстве пользователя Git.

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

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

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

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

Я пропустил что-то важное здесь?

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

+0

Я действительно прочитал эту часть руководства, мне кажется, что я прочитал все руководства RSN;) У перезаписываемых ветвей всегда появляются новые личности? Это действительно объясняет, почему это никогда не должно быть сделано ... – krosenvold

+0

Из-за того, как Git идентифицирует фиксацию по их контенту * и все предыдущие коммиты *, любое изменение (как бы незначительное) для фиксации будет выглядеть как совершенно новая ветвь разработки для Git. Невозможно сделать переписанную историю истории «почти той же». –

+0

Спасибо, странно, как просто отсутствует крошечная информация в git, может иметь значение. – krosenvold

5

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

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

Это приводит нас к a couple good reasons to rewrite history:

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

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

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

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

+1

Обратите внимание, что в главе «История перезаписи» есть новое (второе) издание. https://git-scm.com/book/en/v2/Git-Tools-Rewriting-History – Randall

+1

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

+0

@ XavierAriasBotargues, возможно, это действительно самое неотложное ежедневное использование для перезаписи: на практике гораздо проще просто очищать вещи и удалять много бесполезного беспорядка при выполнении сольного развития. и очень мало, чтобы не получить лишнюю милю, чтобы сохранить эту историю в любом случае. все еще ... я надеюсь, что ваша компания не отключит те, которые вернутся. ;П – cregox