Как сравнить файлы из двух разных ветвей?
У меня есть 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
, если у вас есть один.
Ответ 2
Вы можете сделать это: git diff branch1:path/to/file branch2:path/to/file
Если у вас настроен difftool, вы также можете: git difftool branch1:path/to/file branch2:path/to/file
Смежный вопрос: Как просмотреть вывод git diff с помощью программы diff
Ответ 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".
Надеюсь, что это полезно.