используя git для сравнения одного файла из двух коммитов - PullRequest
10 голосов
/ 05 апреля 2011

У меня есть файл, который где-то сломался, и я нашел последнюю точку, в которой он все еще был исправлен.

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

Ответы [ 2 ]

14 голосов
/ 05 апреля 2011

Чтобы напрямую ответить на ваш вопрос, предположим, что вы хотите сравнить файл 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
3 голосов
/ 05 апреля 2011
$ git diff $start_commit..$end_commit -- path/to/file

Например, вы видите разницу для файла "file.c" между сейчас и двумя коммитами назад

$ git diff HEAD^^..HEAD -- file.c

Я надеюсь, это поможет вам

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...