Во-первых, помните, что git diff
только когда-либо действительно сравнивает два указанных c коммитов , 1 или один коммит с вашим текущим индексом или рабочим деревом. Поэтому, когда вы запускаете git diff A..master
или git diff A...master
, вы выбираете два коммита.
Вы также можете использовать git diff A master
. Это делает то же самое, что и git diff A..master
. Он выбирает коммит, на который указывает имя ветви A
, для хранения с левой стороны, и коммит, на который указывает имя ветви master
, для хранения на правой стороне. Затем он сравнивает левую и правую стороны.
Помните, что каждый коммит представляет собой полный снимок всех ваших файлов . Предположим на минуту, что ваши коммиты содержат main.py
и README.py
. Независимо от того, изменили вы или нет main.py
или README.md
или нет, new a git commit
run прямо сейчас сделает снимок версий main.py
и README.md
, которые в индекс прямо сейчас. (Git также называет это областью подготовки , поэтому термины index и области подготовки означают то же самое.) Git делает коммиты из содержимое индексной / промежуточной области, а не из содержимого рабочего дерева, поэтому Git заставляет вас постоянно запускать git add
: это копирует обновленные файлы обратно в индексную / промежуточную область.
Это означает, что если вы измените main.py
и git add
и зафиксируете его, затем измените его снова, чтобы изменить назад и измените README.md
, добавьте все это и выполните коммит снова, сравнивая коммит из два шага от go до настоящего момента покажут нет разницы с main.py
- версия, которую вы только что подтвердили, совпадает с версией, сделанной двумя шагами назад - и одно изменение на README.md
.
Используйте git log --all --decorate --oneline --graph
, чтобы получить git log
, чтобы нарисовать грубую ASCII-диаграмму ваших коммитов с аннотациями к имени ветви, показывающими, какой конкретный коммит идентифицирует каждое имя ветви. Это скажет вам, какие два коммита сравниваются при запуске git diff A master
или git diff A..master
.
Обратите внимание, что трехточечная запись означает совсем другое: A...master
означает найдите базовый коммит слияния для A
и master
, затем diff, который фиксирует против того, который обозначен master
. То есть это то же самое, что и git diff $(git merge-base A master) master
.
В списке только одного коммита, как в git diff master
, указывается Git для сравнения этого коммита с вашим текущим рабочим деревом. В этом случае рабочее дерево всегда находится справа от различий. 2
1 Технически, в некоторых ситуациях, вы можете получить git diff
для запуска нескольких diff-файлов, двух коммитов за раз, а затем объединяет их в комбинированный diff , но это действительно работает только с коммитами слияния и их несколькими родителями. Объединенная разница вычитает файлы, которые соответствуют любому одному из родителей, и в основном показывает, где произошло или могло произойти слияние.
2 В этом случае, так как вы не называете два коммитов, нет простого способа поменять местами два операнда. К счастью, git diff
позволяет опции -R
(Обратный) поменять местами левую и правую стороны, если вам это нужно по какой-то причине.