git: diff между файлом в локальном репо и источником


190

Я хочу найти различия между файлом в моем локальном хранилище и тем, что находится в origin master.

Я знаю, что есть git diff, однако я просто хочу выделить его в этот конкретный файл.

Для простоты предположим, что файл назван file1.txtи имеет локальный путь к файлу =, [local_path]а в источнике - filepath = [remote-path].

Какую команду git мне нужно набрать?

РЕДАКТИРОВАТЬ: Спасибо всем за ваш вклад, это было очень проницательным. Для тех, кто использует Eclipse (о чем я и должен был сказать ранее), я только что узнал, что вы можете просто щелкнуть правой кнопкой мыши -> Сравнить с -> Ветвь, Тег или Ссылка -> выбрать подходящую версию, и все готово.


Отличается ли [удаленный путь] от [локального пути]?
Код-ученик

Я только что заметил твою правку. Не стесняйтесь размещать это как ответ.
Код-ученик

что вы называете "мастер происхождения"?

метод egit затмения хорош
user1169587

Ответы:


251

Если [remote-path]и [local-path]то же самое, вы можете сделать

$ git fetch origin master
$ git diff origin/master -- [local-path]

Примечание 1: вторая команда, приведенная выше, будет сравниваться с локально сохраненной веткой удаленного отслеживания. Команда fetch необходима для обновления удаленной ветви отслеживания для синхронизации с содержимым удаленного сервера. В качестве альтернативы, вы можете просто сделать

$ git diff master:<path-or-file-name>

Примечание 2: master может быть заменено в приведенных выше примерах любым именем ветви


15
И даже может пропустить локальный путь, если это текущий каталог.
Тони Уолл

19
Для таких крайне нубов, как я, вот пример:git diff master:README.md -- README.md
fabriciorissetto

24
На самом деле, вот лучший пример:git diff origin/master -- README.md
JDiMatteo

Я не мог git fetch masterвместо этого использовать git fetch .(origin / master тоже не работал) Но остальные работали хорошо.
ограбить

1
@rob Вы первый, кто указал на мою ошибку. Так и должно быть git fetch **origin**.
Код-ученик

114

Чтобы просмотреть различия, идущие от удаленного файла к локальному файлу:

git diff remotename/branchname:remote/path/file1.txt local/path/file1.txt

Чтобы увидеть различия в другом направлении:

git diff HEAD:local/path/file1.txt remotename/branchname:remote/path/file1.txt

По сути, вы можете различать любые два файла в любом месте, используя эту запись:

git diff ref1:path/to/file1 ref2:path/to/file2

Как обычно, ref1и ref2может быть имена филиалов, удаленное_имя / branchname, совершают ШАС и т.д.


17

Чтобы сравнить локальное хранилище с удаленным, просто используйте следующий синтаксис:

git diff @{upstream}

2

Для этого я написал скрипт bash:

#set -x 
branchname=`git branch | grep -F '*' |  awk '{print $2}'`
echo $branchname
git fetch origin ${branchname}
for file in `git status | awk '{if ($1 == "modified:") print $2;}'`
do
echo "PLEASE CHECK OUT GIT DIFF FOR "$file 
git difftool  FETCH_HEAD $file ;
done

В приведенном выше сценарии я извлекаю удаленную основную ветвь (не обязательно ее основную ветвь ЛЮБУЮ ветвь) в FETCH_HEAD, затем создаю список только моего измененного файла и сравниваю измененные файлы сgit difftool .

Есть много difftoolподдерживаемых Git, я настроил Meld Diff Viewerдля хорошего сравнения GUI.
Из приведенного выше сценария я уже знаю, какие изменения вносят другие команды в один и тот же файл, прежде чем untrack-->staged-->commitперейти к этапам git, которые помогают мне избежать ненужного конфликта разрешений при слиянии с удаленной командой или создания новой локальной ветви, а также сравнения и объединения в основной ветви.


1

Я попытался пару решений, но я просто так (вы находитесь в локальной папке):

#!/bin/bash
git fetch

var_local=`cat .git/refs/heads/master`
var_remote=`git log origin/master -1 | head -n1 | cut -d" " -f2`

if [ "$var_remote" = "$var_local" ]; then
    echo "Strings are equal." #1
else
    echo "Strings are not equal." #0 if you want
fi

Затем вы сравнили локальный git и номер последнего коммита удаленного git ....


0

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

  1. git fetch origin
  2. git diff master -- [local-path] origin/master -- [remote-path]

Предполагая, что локальный путь - docs / file1.txt, а удаленный путь - docs2 / file1.txt, используйте git diff master -- docs/file1.txt origin/master -- docs2/file1.txt

Это адаптировано из справочной страницы GitHub здесь и Code-Apprentice ответ выше

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.