Как сравнить файлы из двух разных ветвей?

У меня есть script, который отлично работает в одной ветке и разбивается на другую. Я хочу посмотреть на две версии бок о бок и посмотреть, что другое. Есть ли способы сделать это?

Чтобы быть ясным Я не ищу инструмент сравнения (я использую Beyond Compare). Я ищу команду git diff, которая позволит мне сравнить главную версию с моей текущей версией ветки, чтобы увидеть, что изменилось. Я не в середине слияния или чего-то еще. Я просто хочу сказать что-то вроде

git diff mybranch/myfile.cs master/myfile.cs

Ответ 1

git diff может показать разницу между двумя коммитами:

git diff mybranch master -- myfile.cs

Или, что эквивалентно:

git diff mybranch..master -- myfile.cs

Используя последний синтаксис, если обе стороны HEAD, его можно опустить (например, master.. сравнивает master с HEAD).

Вы также можете быть заинтересованы в mybranch...master (от git diff docs):

Эта форма предназначена для просмотра изменений на ветке, содержащей и до второго <commit>, начиная с общего предка обоих <commit>. git diff A...B эквивалентно git diff $(git-merge-base A B) B.

Другими словами, это даст diff изменений в master, так как оно отклонилось от mybranch (но без новых изменений с тех пор в mybranch).

Во всех случаях разделитель -- перед именем файла указывает конец флагов командной строки. Это необязательно, если только Git не запутается, если аргумент ссылается на фиксацию или файл, но в том числе и не плохая привычка. См. fooobar.com/questions/11383/... для нескольких примеров.


Те же аргументы могут быть переданы в git difftool, если у вас есть один.

Ответ 3

Более современный синтаксис:

git diff ..master path/to/file

Префикс с двумя точками означает "от текущего рабочего каталога до". Вы также можете сказать:

  • master.., т.е. обратное выше. Это то же самое, что и master.
  • mybranch..master, явно ссылаясь на состояние, отличное от текущего рабочего дерева.
  • v2.0.1..master, т.е. ссылаясь на тег.
  • [refspec]..[refspec], в основном что-либо идентифицируемое как состояние кода для git.

Ответ 4

Есть много способов сравнить файлы из двух разных веток:

  • Вариант 1. Если вы хотите сравнить файл из n определенной ветки с другой конкретной веткой:

    git diff branch1name branch2name path/to/file
    

    Пример:

    git diff mybranch/myfile.cs mysecondbranch/myfile.cs
    

    В этом примере вы сравниваете файл в ветке "mybranch" с файлом в ветке "mysecondbranch".

  • Вариант 2: Простой способ:

     git diff branch1:file branch2:file
    

    Пример:

     git diff mybranch:myfile.cs mysecondbranch:myfile.cs
    

    Этот пример похож на вариант 1.

  • Вариант 3: Если вы хотите сравнить ваш текущий рабочий каталог с какой-то веткой:

    git diff ..someBranch path/to/file
    

    Пример:

    git diff ..master myfile.cs
    

    В этом примере вы сравниваете файл из вашей фактической ветки с файлом в главной ветки.

Ответ 5

Я просто делаю git diff branch1 branch2 path/to/file

Это проверяет различия между файлами. Изменения в branch1 будут красными. Изменения в branch2 будут зелеными.

Предполагалось, что branch1 - это прошлое, а branch2 - будущее. Вы можете отменить это, изменив порядок ветвей в diff: git diff branch2 branch1

Ответ 6

Соглашаясь с ответом, предложенным @dahlbyk. Если вы хотите, чтобы diff был записан в файл diff для просмотра кода, используйте следующую команду.

git diff branch master -- filepath/filename.extension > filename.diff --cached

Ответ 7

Если вы хотите сделать сравнение с текущей веткой, вы можете пропустить его и использовать:

git diff BRANCH -- path/to/file

таким образом, он будет отличаться от текущей ветки к указанной ветки (BRANCH).

Ответ 8

В моем случае я использую следующую команду:

git diff <branch name> -- <path + file name>

Эта команда может помочь вам сравнить один и тот же файл в двух разных ветках

Ответ 9

Используйте хеши коммитов так:

git diff <hash1> <hash2> <filename>

где hash1 может быть любым коммитом из любой ветки, то же самое для hash2.

Ответ 10

Чтобы сравнить два файла в git bash, вам нужно использовать команду:

git diff <Branch name>..master -- Filename.extension   

Эта команда покажет разницу между двумя файлами в самом bash.

Ответ 11

Лучший способ сделать это - использовать git diff следующим образом: git diff <source_branch> <target_branch> -- file_path

Он проверит разницу между файлами в этих ветках. Посмотрите эту статью для получения дополнительной информации о командах git и о том, как они работают.

Ответ 12

Существует два сценария сравнения файлов:

Сценарий 1: Сравнение файлов в удаленных ветвях (обе ветки должны существовать в удаленном хранилище)

Сценарий 2. Сравните локальные файлы (в локальной копии рабочей области) с файлами в удаленном хранилище.

Логика проста. Если вы предоставите для diff два имени ветки, он всегда будет сравнивать удаленные ветки, а если вы предоставите только одно имя ветки, он всегда будет сравнивать вашу локальную рабочую копию с удаленным репо (который вы указали). Вы можете использовать диапазон для предоставления удаленных репозиториев.

например Оформить заказ в филиале

git checkout branch1
git diff branch2 [filename]

в этом случае, если вы укажете имя файла, оно будет сравнивать вашу локальную копию имени файла с удаленной веткой с именем "branch2".

git diff branch1 branch2 [filename]

в этом случае он будет сравнивать имя файла из удаленных веток с именем "branch1" vs "branch2"

git diff ..branch2 [filename]

в этом случае он также сравнивает имя файла из удаленных веток с именем "branch1" и "branch2". Итак, как и выше. Однако, если вы только что создали ветку из другой ветки, скажем "master", а ваша текущая ветвь не существует в удаленном хранилище, она будет сравнивать удаленную "master" и удаленную "branch2".

Надеюсь, что это полезно.