Как такой-то коммит попал ко мне?

Цель (X): я просматриваю определенную строку в файле в своем git checkout. git blame сообщает мне, что эта строка (в ее нынешнем виде) впервые была зафиксирована в коммите 1234abcd, который один из моих коллег сделал локально в своем собственном репо несколько месяцев назад. Через какое-то время он был объединен с нашей главной веткой. Я хочу найти этот коммит слияния.

Y0: пока лучший метод, который я придумал, – запустить

 git blame master~42 path/to/file/in/question | grep ^1234abcd

для различных значений 42, а затем выполните двоичный поиск, чтобы найти самого старого прямого предка master, который содержит рассматриваемый код. На практике это работает (поскольку наша ветка master следует строгой политике "никаких толчков, только PR"), но громоздко.

Y1: я думаю, что смог бы быстро найти слияние, если бы только мог заставить git log показывать мне все коммиты, которые

  • коммиты слияния, и
  • являются предками HEAD и
  • иметь 1234abcd в качестве предка

К сожалению, кажется, что нотация Git для указания диапазонов ревизий не может выразить третье условие. Синтаксис 1234abcd..HEAD (который, как и следовало ожидать, делает это интуитивно) вместо этого дает мне «предка HEAD, но не предка 1234abcd» и, следовательно, отображает все виды других действий, которые произошли с основной ветвью после того, как мой коллега отделил рабочую ветвь, которая была позже объединились. Эта семантика, возможно, полезна, когда отправной точкой была «точка защемления» в графе коммитов, но не настолько, чтобы проследить судьбу случайного рабочего коммита.

Вопрос. Есть ли способ сделать Y1? (Если не считать написания моей собственной программы для анализа графа коммитов и вычисления отношения достижимости). Или есть лучший способ достичь X?

(Один наивный подход не является стартовым: если бы я знал, какое имя мой коллега использовал для своей рабочей ветки, когда он вносил изменения, я мог бы искать комментарии коммита, чтобы найти тот, который говорит, что он объединил эту конкретную ветку с мастером. Однако прошлая ветка имена не записываются нигде в репозитории, и на самом деле этот комментарий к коммиту, вероятно, является единственным местом, где это имя ветки вообще существует).


person hmakholm left over Monica    schedule 26.11.2018    source источник
comment
Соответствующие? stackoverflow.com/ вопросы/8475448/   -  person Oliver Charlesworth    schedule 27.11.2018
comment
См. github.com/mhagger/git-when-merged (думаю, Майкл Хаггерти уже написал свой инструмент...).   -  person torek    schedule 27.11.2018
comment
@OliverCharlesworth: Очень актуально, спасибо! На самом деле я бы сказал, что это дубликат (который мои попытки поиска до запроса не обнаружили). Для справки, решение, которое я искал, — это вариант --ancestry-path для git log.   -  person hmakholm left over Monica    schedule 27.11.2018