Могу ли я использовать git diff на необработанных файлах?

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

git diff --cached

?

Ответ 1

В последних версиях git вы можете git add -N указать файл (или --intent-to-add), который добавляет к блоку нулевую длину в индекс в этом месте. Результатом является то, что ваш "untracked" файл теперь становится модификацией для добавления всего содержимого в этот файл нулевой длины и отображается в "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

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

Ответ 2

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

git diff --no-index tracked_file untracked_file

Ответ 3

Для моей интерактивной ежедневной игры (где я постоянно разрабатываю рабочее дерево по отношению к 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 "[email protected]"
    fi
}

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

Примечания:

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

Ответ 4

Не на 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 в этом случае.

Ответ 5

git add -A
git diff HEAD

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

git reset HEAD

Ответ 6

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

$ git diff HEAD

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

Ответ 7

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

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

Ответ 8

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

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 }

Ответ 9

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

#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

в выше script я удаляет главную ветвь (не обязательно ее ведущую ветвь) в FETCH_HEAD, они делают список только моего измененного файла и сравнивают измененных файлов на git difftool

здесь много diffftool поддерживается git, я настраиваю Meld Diff Viewer для хорошего сравнения графического интерфейса.

Ответ 10

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

git diff origin/master