Могу ли я использовать git diff для неотслеживаемых файлов? - PullRequest
225 голосов
/ 13 мая 2009

Можно ли попросить git diff включить неотслеживаемые файлы в свой вывод diff? Или мой лучший выбор - добавить новые созданные мной файлы и отредактированные файлы и использовать

git diff --cached

Ответы [ 10 ]

228 голосов
/ 13 мая 2009

В последних версиях git вы можете git add -N файл (или --intent-to-add), который добавляет блоб нулевой длины к индексу в этом месте. В результате ваш «неотслеживаемый» файл теперь становится модификацией для добавления всего содержимого в этот файл нулевой длины, и это отображается в выводе «git diff».

git diff

echo "this is a new file" > new.txt
git diff

git add -N new.txt
git diff
diff --git a/new.txt b/new.txt
index e69de29..3b2aed8 100644
--- a/new.txt
+++ b/new.txt
@@ -0,0 +1 @@
+this is a new file

К сожалению, как указывалось, вы не можете git stash, пока у вас есть файл --intent-to-add, ожидающий, как это. Хотя, если вам нужно спрятать, просто добавьте новые файлы, а затем спрячьте их. Или вы можете использовать обходной путь эмуляции:

git update-index --add --cacheinfo \
100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 new.txt

(настройка псевдонима - ваш друг здесь).

80 голосов
/ 13 мая 2009

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

git diff --no-index tracked_file untracked_file
33 голосов
/ 01 февраля 2011

Для моего интерактивного ежедневного поиска (где я постоянно разрабатываю рабочее дерево по отношению к HEAD и хотел бы, чтобы неотслеживаемые файлы были включены в diff), add -N/--intent-to-add непригоден, потому что он перерывы git stash.

Итак, вот моя замена git diff. Это не особо чистое решение, но поскольку я действительно использую его только в интерактивном режиме, у меня все в порядке с взломом:

d() {
    if test "$#" = 0; then
        (
            git diff --color
            git ls-files --others --exclude-standard |
                while read -r i; do git diff --color -- /dev/null "$i"; done
        ) | `git config --get core.pager`
    else
        git diff "$@"
    fi
}

Печатая просто d, вы включите неотслеживаемые файлы в diff (это то, что меня волнует в моем рабочем процессе), а d args... будет вести себя как обычный git diff.

Примечания:

  • Мы используем тот факт, что git diff на самом деле представляет собой просто объединенные отдельные diff-файлы, поэтому невозможно узнать d вывод из «реального diff» - за исключением того факта, что все неотслеживаемые файлы сортируются последний.
  • Единственная проблема, связанная с этой функцией, заключается в том, что выходные данные окрашены, даже если они перенаправлены; но я не могу потрудиться добавить логику для этого.
  • Я не смог найти способ включить неотслеживаемые файлы, просто скомпилировав список аргументов для git diff. Если кто-то выяснит, как это сделать, или если какая-то функция будет добавлена ​​к git в какой-то момент в будущем, пожалуйста, оставьте здесь примечание!
21 голосов
/ 18 февраля 2016

Не на 100% точно, но если по какой-то причине вы не хотите добавлять свои файлы в индекс, как предполагает принятый ответ, вот еще один вариант:

Если файлы не отслеживаются, очевидно, что diff - это весь файл, поэтому вы можете просто просмотреть их с меньшим количеством:

less $(git ls-files --others --exclude-standard)

Перемещайтесь между ними с помощью :n и :p для следующего и предыдущего ..

Обновление из комментариев: Если вам нужен формат патча, вы также можете комбинировать его с git diff:

git ls-files --others --exclude-standard | xargs -n 1 git --no-pager diff /dev/null | less

В этом случае вы также можете перенаправить вывод в файл или использовать другую команду diff.

14 голосов
/ 03 марта 2016

Изменения работают при постановке и не постановке с помощью этой команды. Новые файлы работают при постановке:

$ git diff HEAD

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

13 голосов
/ 23 мая 2018
git add -A
git diff HEAD

При необходимости создайте патч, а затем:

git reset HEAD
8 голосов
/ 03 июня 2016

это работает для меня:

git add my_file.txt
git diff --cached my_file.txt
git reset my_file.txt

Последний шаг не является обязательным, он оставит файл в предыдущем состоянии (без отслеживания)

полезно, если вы тоже создаете патч:

  git diff --cached my_file.txt > my_file-patch.patch
4 голосов
/ 30 августа 2018

Для одного файла:

git diff --no-index /dev/null new_file

Для всех новых файлов:

for next in $( git ls-files --others --exclude-standard ) ; do git --no-pager diff --no-index /dev/null $next; done;

Как псевдоним:

alias gdnew="for next in \$( git ls-files --others --exclude-standard ) ; do git --no-pager diff --no-index /dev/null \$next; done;"

Для всех измененных и новых файлов, объединенных в одну команду:

{ git --no-pager diff; gdnew }
2 голосов
/ 02 ноября 2017

обычно, когда я работаю с командами удаленного определения местоположения, для меня важно, чтобы у меня были предварительные знания о том, какие изменения вносят другие команды в тот же файл, прежде чем я буду следовать этапам git untrack -> staged -> commit для этого я написал скрипт bash, который поможет мне избежать ненужного конфликта разрешений при слиянии с удаленной командой или создания новой локальной ветки, сравнения и слияния в основной ветке

#set -x 
branchname=`git branch | grep -F '*' |  awk '{print $2}'`
echo $branchname
git fetch origin ${branchname}
for file in `git status | grep "modified" | awk "{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.

0 голосов
/ 10 сентября 2015

Если у вас нет локальных коммитов,

git diff origin/master
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...