Подтвердить что ты не робот

Git рабочий процесс: throwaway merges и git -rerere - какой смысл?

Как и большинство новых пользователей для Git, у меня была своя путаница, пытаясь расшифровать варианты использования, применимые к git merge и git rebase. Я думаю, что я, наконец, решил, что, поскольку в результате получается рабочее копирование, они дают вам то же самое. Кроме того, они оба приводят к одинаковым конфликтам. Если это неверно, предоставьте пример, чтобы рассказать мне.

С моей точки зрения, основное преимущество использования rebase вместо merge (если ваши изменения не были нажаты или вытащены) заключается в том, чтобы сохранить историю линейной. То, что я действительно не понимаю, является аргументом в пользу разработки git -rerere.

Из команд, git -rerere должен помочь вам в случае, когда вы пытаетесь разрешить конфликт, который вы ранее разрешили. Пример, который я собираюсь найти, находится в http://www.kernel.org/pub/software/scm/git/docs/git-rerere.html.

Если политика вашего проекта состоит в том, чтобы не постоянно объединять изменения с основной линией в вашей ветки темы (например, ядро ​​linux), в приведенном выше примере говорится, что для создания коммандов с "выбросом". По существу, объедините мастера в свою тему, запустите тесты, чтобы убедиться, что все все еще работает, затем выполните "git reset --hard HEAD ^", по сути бросая фиксацию слияния. Позже, когда вы создаете еще одно "сбрасывание" слияния, git -rerere помогает вам в разрешении конфликтов, которые вы уже разрешили в сперва сбрасывании.

Может кто-нибудь объяснить, почему вместо того, чтобы справляться с проблемой создания временного коммита, разработчик вместо этого просто переустанавливает свою тему на мастер? Разве это не та точка git -rebase - получить изменения, но избежать слияния? Разве это не делает то же самое, и если предположить, что никто не изменил ваши изменения в ветке темы, не было бы это намного проще? Является ли процесс throw-away-merge + git -rerere действительным только для случая, когда ваши изменения были нажаты/вытащены?

Один последний вопрос - цитируется Линус: "Но если я увижу много" Линий слияния ветвей "в ваших журналах, я не собираюсь отвлекаться от вас, потому что у вашего дерева, очевидно, было случайное дерьмо, не должно быть там...". У Linus также была бы проблема с постоянными перестановками?

4b9b3361

Ответ 1

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

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

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

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

Итак, конечно, если ветка локальная, и нет оснований для сохранения ее базы, то, как вы говорите, гораздо проще просто переустановить ее и сделать. Но иногда это неправильно делать.

Ваш последний вопрос на самом деле о чем-то совсем другом, не имеет ничего общего с конфликтами слияния. Линус сказал, что в контексте объединений, которые не нужно было делать. Это очень важная проблема философии ветки и объединения. Юнио Хамано написал отличный пост в блоге об этой самой проблеме. Краткая цитата, которая подводит итог обсуждаемой теме:

когда вы объединяете ветвь темы "add-frotz" в свою "ведущую" ветку, вы, очевидно, включаете новую функцию "frotz", но что более важно, вы заявляете, что желательно иметь эту функцию "frotz" в ветке "master"

Linus не хочет видеть, что вы все время объединяете эту нечетную ветвь с именем "linus", потому что, очевидно, вы не объединяете какую-то конкретную тему, которая желательно иметь в вашей ветке. Вы неоднократно объединяете ветвь вверх по течению в ветку темы, которая является совершенно неправильным направлением. Вам не нужны все материалы от мастера (или linus) для разработки вашей темы. Вы должны закончить свою тему, а затем объединить ее по-другому, вверх по течению в мастер! Нежелательно иметь все содержимое мастера в вашей ветке темы. (И один разработчик-разработчик действительно является ветвью темы, насколько это касается интегратора.)

Итак, у Linus нет проблем с частыми слияниями; у него проблемы с целенаправленными и контрпродуктивными слияниями. (И вообще, если вы убедитесь, что ваши слияния сделаны по уважительной причине, они не будут частыми - и они почти никогда не будут сливаться с нисходящим потоком.) Если ваши переделки сделаны по уважительной причине, и они делают историю лучше, тогда они хорошие вещи, однако часто.

Ответ 2

Разве это не делает то же самое, и если предположить, что никто не изменил ваши изменения в ветке темы, не было бы это намного проще? Является ли процесс throw-away-merge + git -rerere действительно только для случая, когда ваши изменения были нажаты/выведены?

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

Будет ли у Linus также проблема с постоянными скидками?

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

Ответ 3

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

Rerere, хотя поможет значительно облегчить повторяющуюся боль при слиянии.