Чтобы напрямую ответить на ваш вопрос, предположим, что вы хотите сравнить файл src/toaster.c
между вашим текущим master
и старым коммитом f4l4f3l
, вы можете просто сделать:
git diff master f4l4f3l -- src/toaster.c
В качестве альтернативы вы можете просто просмотреть все изменения в этом файле с помощью:
git log -p -- src/toaster.c
В более общем смысле, однако, если вы пытаетесь найти коммит, в котором была введена конкретная ошибка, у git есть замечательный инструмент для этого, называемый git bisect . Если вы сообщите этому инструменту работающий и нерабочий коммит, он даст вам серию коммитов для тестирования между ними с использованием стратегии двоичного поиска.
Вы начнете делить пополам с помощью команды:
git bisect start
Тогда, если ваш текущий коммит содержит ошибку, вы просто делаете:
git bisect bad
Далее вам нужно найти более старый коммит, в котором точно не было ошибки. Это может быть определенный тег, или, возможно, вы просто выберете коммит, который был несколько месяцев назад. Предположим, что один из них называется a12b3d
, тогда вы бы сделали:
git checkout a12b3d
git bisect good
В этот момент git отработает следующий коммит, который вам нужно протестировать, и сделает git checkout
, чтобы переместить вас в этот коммит. (Все эти извлечения будут с «отсоединенным HEAD», поэтому ваш исходный указатель ветви не изменяется.) Затем вы проверяете этот коммит и запускаете git bisect good
или git bisect bad
в зависимости от того, есть ли у него ошибка или нет. Этот бинарный поиск между ревизиями быстро сузит до первого плохого коммита и сообщит, какой он есть. Затем, чтобы вернуться к тому, что вы делали, вы можете сделать:
git bisect reset