Как сравнить локальную ветку git с ее удаленной веткой?

1055

Как я могу увидеть diffмежду локальной веткой и удаленной веткой?

mrblah
источник
5
Этот вопрос был задан снова позже. У него есть хороший ответ: stackoverflow.com/questions/11935633/…
rustybeanstalk
3
пример: git diff master origin / master (где master - локальная ветвь master, а origin / master - удаленная основная ветвь).
навоз
@klyngbaek, этот ответ, в частности ;-)
Первоначально я пытался, git diff HEAD origin/HEADкоторый, кажется, указывает на другую удаленную ветку, чем та, которую я намеревался. Использование полного имени ветки работает как положено.
Дина

Ответы:

595

Чтобы обновить ветки удаленного отслеживания, git fetchсначала нужно набрать, а затем:

git diff <masterbranch_path> <remotebranch_path>

Вы можете git branch -aперечислить все ветви (локальные и удаленные), затем выбрать имя ветви из списка (просто удалить remotes/из имени удаленной ветви).

Пример: git diff master origin/master(где "master" - это локальная ветвь master, а "origin / master" - удаленная, а именно, источник и ветвь master.)

медер омуралиев
источник
23
Ему может потребоваться git fetch
доставка
Это показывает скрытность изменений в bash. Есть ли способ открыть все изменения в IDE, например, в коде VS?
Суровый Phoujdar
@Harsh Phoujdar Добавьте приведенный ниже код в свой файл .git / .gitconfig. [diff] tool = vscode [difftool] prompt = false [difftool "vscode"] cmd = \"C:\\Program Files (x86)\\Microsoft VS Code\\Code.exe\" \"$LOCAL\" \"$REMOTE\" --diff --wait trustExitCode = falseУбедитесь, что путь к файлу code.exe правильный.
Аман
1307
git diff <local branch> <remote>/<remote branch>

Например git diff master origin/master, илиgit diff featureA origin/next

Конечно, чтобы иметь указанную ветку удаленного слежения , нужно git fetchсначала; и вам нужно, чтобы в удаленном хранилище была актуальная информация о ветвях.

Якуб Наребски
источник
98
точнее: git diff <локальная ветка> <удаленная> / <удаленная ветка>
nalply
38
Я обычно делаю, git diff <remote>/<remote branch> <local branch>чтобы увидеть, что мой пуш сделает с удаленным репо.
Михал Татаринович
76
Даже короче git diff originдостаточно, если вы просто сравните со своей веткой вверх по течению.
Ludder
12
пожалуйста, добавьте git fetchв начале, это создает проблемы для новичка, как я
Saif
1
Эй, не должно ли это быть git diff <remote>/<remote branch> <local branch>? В противном случае на моем компьютере включаются добавления и удаления (git version 2.7.0.windows.2)
Martín Coll
183

Первый тип

git branch -a

получить список доступных веток. На выходе вы можете увидеть что-то вроде

* master
  remotes/main/master
  remotes/origin/HEAD -> origin/master
  remotes/origin/master
  remotes/origin/mt
  remotes/upstream/master
  remotes/upstream/mt

Тогда покажи разницу

git diff --stat --color remotes/main/master..origin/master
git diff remotes/main/master..origin/master
YSN
источник
1
не должно быть, ...а не ..?
Элиран Малка
9
Я бы определенно выбрал это в качестве ответа. Следуя вашим указаниям, я смог увидеть различия между локальной веткой и удаленной веткой. Спасибо!
ТАСС
1
Я обычно делаю, git log origin/my_branch..что будет принимать в HEADкачестве местного реф, что в основном то, что вы имеете в виду.
Руди
4
+1 за лучший ответ по моему скромному мнению. Было бы достойно +2, если бы вы упомянули «fetch» ​​для синхронизации «удаленного» образа клонированного источника. Этап обзора статистики / цвета особенно полезен.
Bvj
3
Спасибо за один ответ, который в итоге сработал из семи или восьми «ответов», которые привели к чуть большему fatal: bad revisionили fatal: ambiguous argument. Все, что я хотел, это увидеть различие в том же файле из другой ветки, это было слишком много, чтобы спросить? Да, да, это было. :-) git diff remotes/origin/<base branch> <current branch> -- <filename>отлично работает на git 1.8.3.1
Стив Бондс
144

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

git diff @{upstream}

если ваш апстрим не установлен (обычно так, спасибо Arijoon в комментариях)

git diff @{push}

Благодаря этому ответу , git документация для определения ревизий имеет:

<branchname>@{upstream}Например master@{upstream}, @{u}
суффикс @{upstream}к ответвлению (сокращенная форма <branchname>@{u}) относится к ветви, над которой установлен ветвь, заданная branchnameдля (настроенная с branch.<name>.remoteи branch.<name>.merge). Отсутствует по branchnameумолчанию текущий.

Эндрю Гримм
источник
10
Очень хороший ответ, просто не хватает маленькой части. Измените строку на git diff @ @{upstream}. Дополнительным @является то HEAD, где вы сейчас находитесь, так что вы сравниваете HEADс вышестоящими потоками, которые отслеживает ваша ветвь. Вы можете использовать @{push}вместо
апстрима,
3
лучший ответ, не требует извлечения пульта. нужно больше голосов!
jcomeau_ictx
3
В моллюсках я получил результат: fatal: ambiguous argument '@upstream': unknown revision or path not in the working tree. Пришлось использовать git diff @\{upstream\}вместо. Land
Лэндон Кун
Вы должны git fetchсначала, иначе это ничего не делает, не показывает вывод; протестировано удалением файла в исходном хранилище и выполнением этой команды локально. .. работает только после получения.
Кроме того, в качестве ответа, как дано, включены любые локальные изменения. иногда это желательно, а иногда нет.
Дина
44

Я гораздо лучше понимаю вывод:

git diff <remote-tracking branch> <local branch>

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

manfer
источник
Я получаю точно такой же результат: git diff <локальная ветка> <ветка удаленного отслеживания> или git diff <удаленная ветка> <локальная ветка>
user2928048
32

Простой способ:

git fetch
git log -p HEAD..FETCH_HEAD

Сначала будут получены изменения с вашего удаленного по умолчанию (источника). Это будет создано автоматически при клонировании репо. Вы также можете быть явным: git fetch origin master.

Затем git log используется для сравнения вашей текущей ветки с только что выбранной. (Опция -p(создать патч) - это то, что показывает различия .)

Брент Фауст
источник
14

Вот как я это делаю.

#To update your local.
git fetch --all

он будет извлекать все с пульта, поэтому при проверке разницы он будет сравнивать разницу с удаленной веткой.

#to list all branches
git branch -a

Приведенная выше команда отобразит все ветви.

#to go to the branch you want to check difference
git checkout <branch_name>
#to check on which branch you are in, use
git branch
    (or)
git status

Теперь вы можете проверить разницу следующим образом.

git diff origin/<branch_name>

это сравнит вашу локальную ветку с удаленной веткой

Сахит Вибудхи
источник
2
git fetch - все получит все со всех пультов. git fetch должно быть достаточно, если вы используете удаленный источник по умолчанию.
Кристоф Келлер
Удивительно, что через 8 лет мы получаем полный ответ, который правильно объясняет шаги. Мы можем сделать --help, чтобы получить команды. Так что о понимании их.
gdbj
11

Пусть ваша рабочая ветвь развитие и хотят провести различие между местной ветвью разработки и удаленным филиалом развития, тот случаем, синтаксис должен быть как git diff remotes/origin/development..development
или

git fetch origin git diff origin/development

Ратна Гальдер
источник
11

тл; др :git diff <local branch> <remote branch>

При использовании git на оболочке, мне нравится сначала ориентироваться, оглядываясь вокруг. Вот команда, чтобы показать все ветви

$ git branch -a  # (or git branch --all) 
* my-branch
  master
  remotes/origin/some-branch
  remotes/origin/HEAD -> origin/master
  remotes/origin/my-branch
  remotes/origin/some-other-branch
  remotes/origin/master

Здесь у меня две локальные ветви ( my-branchи master) и 4 (удаленные some-branch, some-other-branch, master, и my-branch).

Кроме того, звездочка рядом my-branchуказывает на то, что я в данный момент нахожусь в этой ветке (вы также узнаете об этом, используя команду, git statusкоторая выдаст:) On branch my-branch..

Примечание: удаленные ветви в оболочке git bash показаны красным, а локальные - зеленым.

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

$ git branch -r # (or git branch --remotes)
  origin/some-branch
  origin/HEAD -> origin/master
  origin/my-branch
  origin/some-other-branch
  origin/master

Чтобы показать только локальные ветви, вы можете испытать соблазн, git branch -lно это совершенно другая команда. Для показа локальных веток используйте git branchбез опций

$ git branch
* my-branch 
  master

Чтобы завершить обзор основных параметров ветки, есть нечто --listпротивоположное тому, что вы можете ожидать - разрешить фильтрацию . Используйте это с шаблоном как это:

$ git branch --list 'my*'
* my-branch

Вы можете также комбинировать --listс параметрами -aи , -rно убедитесь , что адаптировать шаблон соответствующим образом ( помните: удаленные ветви начинаются с «пультами» ). Пример:

# this will show all branches (local & remote) that start with my
$ git branch --list 'my*' -a
* my-branch

# better: the pattern includes the remote
$ git branch --list '*my*' -a
* my-branch
  remotes/origin/my-branch

Документы: https://git-scm.com/docs/git-branch

Теперь вы можете сравнить любые две ветви из всех доступных (вы также можете сравнить два локальных или два удаленных).

Здесь я сравниваю локальный с удаленным my-branch, они синхронизируются, поэтому я не получаю никакого вывода:

$ git diff my-branch remotes/origin/my-branch

Примечание: вы должны дать полные имена ветвей без кавычек.

Я также могу сравнить местный my-branchс удаленным master. Здесь я получаю некоторый вывод, потому что пульт my-branchне был объединен с основной веткой.

$ git diff my-branch remotes/origin/master
diff --git a/src/controllers/call.controller.js b/src/controllers/call.controller.js
index fd79b98..df3d798 100644
--- a/src/controllers/call.controller.js
+++ b/src/controllers/call.controller.js
@@ -261,7 +261,7 @@ function callController() {
   /*
    *  Function: doCall
[ . . . ]
user2314737
источник
11

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

git diff --name-status <remote-branch> <local-branch>,

иначе это было бы показать все различия между двумя ветвями:

git diff <remote-branch> <local-branch>

Сарвеш Кешарвани
источник
9

Вот краткий ответ, если вы сравниваете текущую ветку с тем, что хотите git pull.

git fetch
git diff FETCH_HEAD

Первая команда определит, какая удаленная ветвь соответствует вашей текущей ветке. Артефакт этого расчета в FETCH_HEADссылке. Затем вторая команда использует это сравнение сравнения с тем, что имеет ваша текущая ветвь.

Уильям Энтрикен
источник
6

Я знаю, что уже есть несколько ответов на этот вопрос, но я получаю странную ошибку при попытке большинства из них.

В моем случае у меня есть второй пульт называется herokuэто неorigin и потому, что не в синхронизации я получил эту ошибку при попытке запуска git diff master heroku/master:

fatal: ambiguous argument 'heroku/master': unknown revision or path not in the working tree.

или это при попытке другого подхода git diff master..heroku/master:

fatal: bad revision 'master..heroku/master'

Решением было явное упоминание удаленного имени git fetchперед запуском git diff, в моем случае:

$ git fetch heroku
$ git diff master heroku/master

Надеюсь, что это поможет другим с этой же проблемой.

fagiani
источник
4
git difftool <commit> .

Это сравнит коммит вы хотите с вашими локальными файлами. Не забывайте точку в конце (для местного).

Например, чтобы сравнить ваши локальные файлы с некоторыми коммитами:

git difftool 1db1ef2490733c1877ad0fb5e8536d2935566341.

(и вам не нужен git fetch, если не требуется сравнение с новыми коммитами)

Izik
источник
Я думаю, что это интересно, потому что это сравнение, которое я могу сделать перед коммитом и push. К сожалению, в Windows vimdiff для показа ужасен; Есть ли способ использовать что-нибудь лучше, как Notepad ++?
Стефано Скарпанти
3

пример

git diff 'master' 'testlocalBranch'

Если вы используете редактор, такой как веб-шторм, вы можете щелкнуть правой кнопкой мыши по файлу, выбрать сравнить с веткой и ввести / выбрать вашу ветку.

введите описание изображения здесь

введите описание изображения здесь

Kurkula
источник
2
Что это добавляет к принятому 7,5-летнему ответу с 170+ ответами?
Марк Роттвил
Это для пользователя mrblah или для похожих пользователей, которые добавили комментарий к принятому ответу. Синтаксис отличается от примера, и пример помогает больше с точки зрения новичка.
Kurkula
2
В таком случае, это должно быть в комментарии к этому ответу.
рачит
1

В VS 2019, просто сделайте FETCH Не тяните код.

Это то, что я сделал. Добавлен ниже в файле .gitconfig, чтобы я мог использовать Beyond Compare

File location: C:\Users\[username]\.gitconfig

Добавлено ниже

[diff]
    tool = bc
[difftool "bc"]
    path = c:/Program Files/Beyond Compare 4/bcomp.exe

Откройте командную строку и перейдите в рабочий каталог. Я дал ниже, чтобы сравнить локальную ветку DEV с удаленной веткой DEV

git difftool dev origin/dev --dir-diff

Это откроет Beyond Compare и откроет каталоги с файлами, которые отличаются. Если никаких изменений Beyond Compare не запустится.

Ziggler
источник
0

Интересно, есть ли какие-либо изменения в моей основной ветке ...

  1. Во-первых, вам нужно сменить ветку (если вы уже находитесь под этой веткой, вам не нужно это делать!)

мастер проверки

  1. Вы можете увидеть, какой файл был изменен в вашей главной ветке с помощью этой команды

мерзавец статус

  1. Перечислите ветви

git branch -a

  • мастер
    пульты / происхождение / мастер
  1. Найти различия

git diff origin / master

Али Атакан
источник
0

Настроить

git config alias.udiff 'diff @{u}'

Diffing HEAD с HEAD @ {upstream}

git fetch  # Do this if you want to compare with the network state of upstream; if the current local state is enough, you can skip this
git udiff

Diffing с произвольным удаленным ответвлением

Это отвечает на вопрос в вашем заголовке («его удаленный»); если вы хотите использовать «удаленный» (который не настроен в качестве восходящего потока для ветви), вам нужно настроить его непосредственно. Вы можете увидеть все удаленные ветви со следующим:

git branch -r

Вы можете увидеть все настроенные пульты со следующим:

git remote show

Вы можете увидеть конфигурацию ветвления / отслеживания для одного пульта (например, источника) следующим образом:

git remote show origin

Как только вы определите подходящую ветку происхождения, просто сделайте обычный diff :)

git diff [MY_LOCAL] MY_REMOTE_BRANCH

DylanYoung
источник
0

Это довольно просто. Ты можешь использовать:git diff remote/my_topic_branch my_topic_branch

Где my_topic_branchтвоя тема ветка.

Элиша Сену
источник
0

Допустим, вы уже настроили свой originудаленный репозиторий. Затем,

git diff <local branch> <origin>/<remote branch name>

Tirtha
источник
0

пытаться:

git diff origin HEAD

Предполагая, что вы хотите сравнить ваши текущие локальные ветви HEADс источником. И при условии, что вы находитесь в местном отделении. :)

Сурабх Пандит
источник
-3

Если вы используете TortoiseGit (он предоставляет графический интерфейс для Git), вы можете щелкнуть правой кнопкой мыши свою папку репозитория Git и нажать Git Sync.

Вы можете выбрать свои ветви для сравнения, если они не выбраны. Чем вы можете просмотреть различия совершать. Вы также можете щелкнуть правой кнопкой мыши любой коммит, Compare with previous revisionчтобы просмотреть различия между собой.Git Sync черепаха для сравнения удаленного и локального филиала

Халил Ибрагим Оймачи
источник