Как сравнить рабочее дерево с коммитом? - PullRequest
30 голосов
/ 10 декабря 2011

Я использую

git diff mycommit

для сравнения моего рабочего дерева с mycommit, но, похоже, игнорируются файлы, отсутствующие в текущем индексе. Вы можете воспроизвести его следующим образом:

git init
echo A > A.txt; git add .; git commit -m A; git branch A
echo B > B.txt; git add .; git commit -m B; git branch B
git reset --hard A
echo BB > B.txt
git diff B

Вывод (по состоянию на git версии 1.7.3.3) пуст. Использование --diff-filter=ACDMRTUXB показывает «удаленный файл», что также неверно, поскольку файл B.txt существует как в рабочем дереве, так и в коммите B. ИМХО, файл должен быть показан как измененный. Удивительно, но он работает после добавления файла в индекс, хотя сравнивается не индекс. Как я могу получить правильный дифференциал без него?

Ответы [ 4 ]

69 голосов
/ 10 декабря 2011

Может пригодиться простая графика:

enter image description here

Итак, вы можете запросить три типа различий:

  1. git diff --cached В этом разница между индексом и последним коммитом. Он показывает вам изменения, которые будут в следующем коммите.

  2. git diff Это показывает разницу между индексом и рабочим деревом. Это изменения, которые вы внесли в файлы с момента их последнего добавления в индекс. Вот почему я не получил никаких результатов. У меня не было изменений между индексом и рабочим деревом.

  3. git diff HEAD Это показывает разницу между файлами в рабочем дереве и последним коммитом. Здесь есть один нюанс: если вы внесли изменения, добавили их в индекс, а затем откатили эти изменения в рабочем дереве, вы не получите результатов для git diff HEAD (поскольку разницы нет), но вы получите получить вывод для git diff --cached, поскольку в индексе все еще есть изменения.

А если вы хотите сравнить его с предыдущими коммитами:

enter image description here

Это просто сравнивает с предыдущими коммитами, но вы можете заменить HEAD~ любой другой ссылкой на коммит.

7 голосов
/ 10 декабря 2011

Вопрос в том, что я добавил в мое рабочее дерево файл, который существует в другом коммите.Почему git diff <commit> не показывает мне разницу между содержимым файла, существующим в моем рабочем дереве, и содержимым файла, содержащегося в другом коммите.

Это потому, что добавленный вами новый файл не отслежени, следовательно, Git не отслеживает это.

Попробуйте git diff HEAD, вы не увидите, что добавили B.txt в свое рабочее дерево.

По сути, diff не учитывает неотслеживаемые файлы.Вот почему вы видите, что файл удален, потому что diff такой же, как git diff B A

Теперь, если вы добавите файл, вы увидите ожидаемый результат, потому что git отслеживает его сейчас.

Скажем, вы зафиксировали файл и затем изменили содержимое в рабочем дереве:

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

3 голосов
/ 21 августа 2012

manojlds написал в своем ответе

По сути, diff не учитывает неотслеживаемые файлы.Вот почему вы видите, что файл удален, потому что diff такой же, как git diff BA

Это правда и стоит проголосовать, но меня это не удовлетворило, так как не говорит "как"Могу ли я сравнить это "не дал ему более глубокую причину позади.Я все еще думал, что это ошибка, поэтому я спросил на форуме git и получил длинный ответ от кого-то, кто наверняка знает.Для меня важными частями являются:

Определение путей в рабочем дереве в этих предложениях - это не «все файлы в файловой системе» или «все файлы в файловой системе, отфильтрованные с помощью механизма игнорирования».».Это «все файлы в файловой системе, которые находятся в индексе» ...

и

..., что даст чистую семантику для "git diff HEAD": какое изменение я бы записал, если бы сказал" git commit -a "на этом этапе?

0 голосов
/ 13 декабря 2018

Если все, что вам нужно, это отменить изменения в рабочем дереве для перехода / фиксации B , вы можете сделать:

git diff B | git apply -R

Это создаст разницу между B и рабочим деревом и применит его в обратном порядке.

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