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

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

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

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

8 ответов


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

git diff mybranch master -- myfile.cs

или, что то же самое:

git diff mybranch..master -- myfile.cs

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

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

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

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


во всех случаях!--16--> разделитель перед именем файла указывает конец флагов командной строки. Это необязательно, если Git не запутается, если аргумент ссылается на фиксацию или файл, но в том числе это не плохо привычка. См.https://stackoverflow.com/a/13321491/54249 для нескольких примеров.


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


Вы можете сделать это: git diff branch1:file branch2:file

Если у вас настроен difftool, вы также можете: git difftool branch1:file branch2:file

вопрос: как просмотреть вывод git diff с помощью программы visual diff


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

git diff ..master path/to/file

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

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

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

  • Вариант 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
    

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


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

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

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


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

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

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

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


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

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

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