Git diff не показывает абсолютные различия между файлами в разных ветках (необработанные различия по всем коммитам) - PullRequest
1 голос
/ 02 марта 2020

У меня есть две ветви. Master и A. Я внес изменения на A, зафиксировал их. Сделал больше изменений на A и зафиксировал их. И сделал это несколько раз. Мне нужно просмотреть все изменения между Master и A. Я использовал git diff, чтобы попытаться проверить это, однако я уверен, что он показывает только самые последние изменения коммита в A. Я вручную проверил файлы и знаю, что есть другие изменения, и когда я использую функцию VCS/git/compare with branch в PyCharm, я вижу все изменения.

Следующие команды, которые я пробовал,

git diff master git diff A..master git diff A...master

Показывает только самые последние изменения.

1 Ответ

1 голос
/ 02 марта 2020

Во-первых, помните, что 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 (Обратный) поменять местами левую и правую стороны, если вам это нужно по какой-то причине.

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