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

147

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

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

Чайтанья
источник
Я хотел знать, насколько мой файл изменился по сравнению с последней зафиксированной версией на моем локальном компьютере. Ответом на мой вопрос был этот вопрос. Благодарность!
Souvik Ghosh

Ответы:

137

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

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

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

Синтаксис:

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

(Спасибо Эрику Боэсу за возможность не вводить имя файла дважды)

Нейт
источник
Общее решение мне нравится больше, чем узкое конкретное решение, приведенное выше. Обмен мнениями, где вы это нашли?
fbicknel
Я не могу найти документацию по деталям commit-ishи разделителю двоеточия. Документы по git-diff , похоже, не упоминают об этом. Пользуюсь им так долго, что не помню, где впервые нашел. Возможно, чужие примеры по другим командам, и я просто экспериментировал git-diff. Боюсь, что другой ответcommit-ish - лучшее, что я могу придумать на данный момент.
Nate
3
Приятное дополнение к этому есть git diff master:./ -- README.md. Таким образом, вам не нужно вводить README.mdдважды, и вы можете легко добавить его к псевдониму.
Эрик Бос,
Спасибо @EricBoehs, это отличное предложение.
Nate
2
Этот синтаксис не работает для меня ... а создает источник , а не удаленный филиал. Использование git версии 2.19.0git diff master: -- README.md.//dev/null
rustyDev
23

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

git diff

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

git diff --cached

Pepestar
источник
9

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

git difftool

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

PS: Если вы не установили приложение diff, вы можете сделать это, как в примере ниже (я использую 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
Канер
источник
это изменение вступает в силу немедленно?
Дилип Рагхунатан
Мне просто любопытно, как это связано с заданным вопросом? Разве git difftool просто не сравнивает локальные изменения с основными? Однако OP хочет, чтобы это было между локальными изменениями и удаленным мастером.
написано в инфо-журнале
Безусловно, самое простое решение
Крис Джонсон