Поиск отобранных или перебазированных коммитов с использованием хэша исходной фиксации

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

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


person Vladimir Reshetnikov    schedule 24.06.2019    source источник
comment
Подобно этому вопросу stackoverflow.com / questions / 11605703 /. Вы, наверное, найдете там то, что вам нужно.   -  person Calum Halpin    schedule 25.06.2019


Ответы (1)


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

Хорошая новость в том, что вы определенно можете сделать все это (с некоторыми предположениями, которые я опишу через мгновение). Вариант "содержать напрямую" является самым простым: git branch --contains hash дает ответ.

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

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

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

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

$ git rev-parse HEAD
8dca754b1e874719a732bc9ab7b0e14b21b1bc10

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

Это сложный способ (но достаточно простой для одной фиксации). Простой способ - заставить Git сообщать вам о «равных коммитах». Команда git cherry и ее более гибкая, но более сложная в использовании сопутствующая команда _ 12_, работайте, запустив git show | git patch-id для каждого коммита в одном наборе коммитов и git show | git patch-id для каждого коммита в другом наборе коммитов, и сообщая вам, какие коммиты в первом наборе совпадают с какими во втором наборе.

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

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

person torek    schedule 24.06.2019