Нахождение вишневых или перебазированных коммитов с использованием хеша оригинального коммита - PullRequest
0 голосов
/ 25 июня 2019

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

При условии, что я знаю хэш исходного коммита, как я могу найти все ветки, которые содержат его напрямую или содержат его либо в выбранной вишне, либо в перебазированной форме?

1 Ответ

1 голос
/ 25 июня 2019

При условии, что я знаю хэш исходного коммита, как я могу найти все ветки, которые содержат его напрямую, или содержат его в выбранной вишне или перебазированной форме?

Хорошей новостью является то, что вы определенно можете сделать все это (в предположении или двух, я опишу через минуту). Вариант «содержит его» * ​​самый простой вариант: 1006 *: git branch --contains <em>hash</em> дает ответ.

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

Существует команда Git, git patch-id, которая принимает git diff вывод (как непосредственно git diff или, что более удобно, git show) и вычисляет ID патча , который по сути является контрольной суммой разницы после удаления номеров строк и пробелов. (Для получения дополнительной информации см. Связанную страницу документации или выполните команду git help patch-id.) Например:

$ git show HEAD | git patch-id
869f23f0e8b4813c88cb853fa2b4d415d25dc32c 8dca754b1e874719a732bc9ab7b0e14b21b1bc10

Второй хэш, если появляется второй, - это идентификатор хеша коммита:

$ git rev-parse HEAD
8dca754b1e874719a732bc9ab7b0e14b21b1bc10

Следовательно, вы можете запустить git show на исходном коммите и получить его идентификатор патча, затем запустить git show на каждом подозрительном коммите и посмотреть, совпадает ли идентификатор патча.

Это сложный способ (но достаточно простой, чтобы сделать его за один коммит). easy способ заставить Git сказать вам о "равных коммитах". Команда git cherry и ее более гибкий, но сложный в использовании компаньон git rev-list --cherry-mark работают при выполнении git show | git patch-id для каждого коммита в некотором наборе коммитов и git show | git patch-id о каждом коммите в другом наборе коммитов и сообщая вам, какие коммиты в первом наборе совпадают с коммитами во втором наборе.

Чтобы использовать git rev-list, вы должны выбрать симметричную разностную операцию, то есть использовать синтаксис A...B с тремя точками. Git будет вычислять идентификаторы патчей всех коммитов, которые доступны из A, но не B, и сравнивать их со всеми идентификаторами патчей всех коммитов, которые достижимы из B, но не A. Команда git cherry делает то же самое но с другим синтаксисом и другим форматом вывода. Обратитесь к двум страницам документации для деталей.

Предостережение довольно очевидно: ID патча основан на разнице в минусе номеров строк и (некоторых) пробелов. Но иногда во время вишневого пика или перебазировки необходимо изменить на 1055 *, чтобы оно подходило. В этом случае идентификаторы исправлений не будут совпадать, и этот тип обнаружения не удастся. Вы ничего не можете с этим поделать.

...