Как различать локальные незафиксированные изменения и источник

Допустим, я клонировал репозиторий и начал изменять файлы. Я знаю, что если у меня есть локальные незафиксированные изменения, я могу выполнить diff следующим образом git diff test.txt, и он покажет мне разницу между текущим локальным HEAD и модифицированными незафиксированными изменениями в файле. Если я зафиксирую эти изменения, я могу сравнить их с исходным репозиторием, используя git diff master origin/master

Но есть ли способ сравнить локальные изменения с исходным репозиторием на сервере до локальной фиксации? Я пробовал различные перестановки git diff --cached master origin/master безуспешно.


person Chaitanya    schedule 16.07.2013    source источник
comment
Я хотел знать, насколько мой файл изменился по сравнению с последней зафиксированной версией на моем локальном компьютере. Ответом на мой вопрос был этот вопрос. Спасибо!   -  person Souvik Ghosh    schedule 18.07.2017


Ответы (5)


Учитывая, что удаленный репозиторий был кэширован через git fetch, должна быть возможность сравнить эти коммиты. Попробуйте следующее:

$ git fetch origin
$ git diff origin/master
person JJD    schedule 16.07.2013
comment
Ах, отлично. Ключ был в том, чтобы оставить хозяина в стороне. Раньше я пробовал комбинацию, в которой я выполнял выборку, но когда я сделал git diff master origin/master, она все еще сравнивалась с зафиксированной версией (очевидно в ретроспективе). Но если исключить мастер, теперь он сравнивает локальные изменения с полученной версией. - person Chaitanya; 17.07.2013
comment
@Chaitanya Хорошо, я могу помочь. На самом деле меня несколько раздражают разные стили, которые использует Git: однажды вам нужно написать origin master, а где-то еще origin/master. Есть над чем еще поработать, ИМХО. - person JJD; 17.07.2013
comment
Похоже, это не работает: git diff origin/master возвращает fatal: ambiguous argument 'origin/master': unknown revision or path not in the working tree. мастер существует в источнике, например, git fetch origin master работает нормально, - person mikemaccana; 08.04.2015

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

Синтаксис:

git diff <commit-ish>:./ -- <path>

Примеры:

git diff origin/master:./ -- README.md
git diff HEAD^:./ -- README.md
git diff stash@{0}:./ -- README.md
git diff 1A2B3C4D:./ -- README.md

(Спасибо Eric Boehs за способ не вводить имя файла дважды)

person Nate    schedule 29.07.2015
comment
Общее решение мне нравится больше, чем узкое, конкретное выше. Поделитесь, где вы это нашли? - person fbicknel; 26.08.2015
comment
Кажется, я не могу найти документацию по деталям commit-ish и разделителя двоеточия. Документы на git-diff, похоже, не упоминают об этом. Я так долго им пользовалась, что уже и не помню, где впервые его нашла. Возможно чужие примеры по другим командам а я просто экспериментировал с git-diff. Боюсь, что другой ответ на commit-ish - лучшее, что я могу придумать на данный момент. - person Nate; 26.08.2015
comment
Хорошим дополнением к этому является git diff master:./ -- README.md. Таким образом, вам не придется вводить README.md дважды, и вы сможете проще добавить его к псевдониму. - person Eric Boehs; 19.11.2015
comment
Спасибо @EricBoehs, это отличное предложение. - person Nate; 19.11.2015
comment
Этот синтаксис не работает для меня ... скорее git diff master: -- README.md ./ создает источник /dev/null, а не удаленную ветвь. Использование git версии 2.19.0 - person rustyDev; 25.04.2019

Чтобы увидеть неустановленные (не добавленные) изменения в существующие файлы

git diff

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

git diff --cached

person pepestar    schedule 29.07.2016

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

git difftool

Приложение автоматически запустится для каждого измененного файла.

PS: Если вы не установили приложение сравнения, вы можете сделать это, как в примере ниже (я использую Winmerge):

git config --global merge.tool winmerge
git config --replace --global mergetool.winmerge.cmd "\"C:\Program Files (x86)\WinMerge\WinMergeU.exe\" -e -u -dl \"Base\" -dr \"Mine\" \"$LOCAL\" \"$REMOTE\" \"$MERGED\""
git config --global mergetool.prompt false
person Caner    schedule 09.12.2015
comment
это изменение вступает в силу немедленно? - person Dilip Raghunathan; 10.03.2017
comment
Мне просто интересно, как это связано с заданным вопросом? Разве git difftool не сравнит локальные изменения с мастером? Однако OP хочет, чтобы это было между локальными изменениями и удаленным мастером. - person infoclogged; 03.01.2018
comment
Пока самое простое решение - person Chris Johnson; 25.10.2018

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

$ git diff origin/master

Она отличается от приведенной ниже команды, которая игнорирует различия для незафиксированных изменений:

$ git diff origin/master..develop

Вы можете добавить некоторые параметры для фильтрации различий:

$ git diff origin/master [--name-only] [--diff-filter=A] [<path>]

Опция '--diff-filter=A' означает отфильтровывать добавленные файлы из ветки origin/master. Однако, если вы запускали git rm до этого, вам придется сначала отправить изменения в git stash, а затем восстановить репозиторий git и позже применить сохраненные изменения. В противном случае он не показывает правильные различия, как ожидалось.

Поэтому полезно видеть различия с параметром '--name-status' для статуса.

$ git diff origin/master [--name-status] 
person Jeff    schedule 18.05.2021