При условии, что я знаю хэш исходного коммита, как я могу найти все ветки, которые содержат его напрямую, или содержат его в выбранной вишне или перебазированной форме?
Хорошей новостью является то, что вы определенно можете сделать все это (в предположении или двух, я опишу через минуту). Вариант «содержит его» * самый простой вариант: 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 *, чтобы оно подходило. В этом случае идентификаторы исправлений не будут совпадать, и этот тип обнаружения не удастся. Вы ничего не можете с этим поделать.