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

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

16 ответов


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

git diff <masterbranch_path> <remotebranch_path>

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

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


git diff <local branch> <remote>/<remote branch>
git diff master origin/master или git diff featureA origin/next

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


первый тип

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

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

git diff @{upstream}

вежливость ответ, документация git для С указанием изменений есть:

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


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

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

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


самый простой способ:

git fetch
git log -p HEAD..FETCH_HEAD

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

затем git log используется для сравнения текущей ветви с только что извлеченной. (The -p (generate patch) - это то, что показывает различия.)


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

git fetch origin git diff origin/development


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

#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>

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


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

git fetch
git diff FETCH_HEAD

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


tl; dr: 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 но не забудьте соответствующим образом адаптировать свой шаблон ( помните: удаленные ветви начинаются с"remotes"). Пример:

# 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. Здесь я получаю некоторый выход, потому что remote 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
[ . . . ]

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

в моем случае у меня есть второй пульт называется heroku что это не the 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

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


Если вы хотите увидеть разницу, как только имена файлов изменились, используйте:
git diff --name-status <remote-branch> <local-branch>,
иначе это покажет все различия между двумя ветвями:
git diff <remote-branch> <local-branch>


git difftool <commit> .

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

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

ГИТ difftool в деталях 1db1ef2490733c1877ad0fb5e8536d2935566341 .

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


пример

git diff 'master' 'testlocalBranch'

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

enter image description here

enter image description here


настройка

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

сравниваете головы с головой@{вверх}

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

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

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

git branch -r

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

git remote show

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

git remote show origin

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

git diff [MY_LOCAL] MY_REMOTE_BRANCH


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

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

git checkout master

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

git статус

  1. список ветви

git branch-a

  • мастер
    пульты дистанционного управления / origin / master
  1. найти различия

git diff origin / master