Можно ли попросить git diff включить неотслеживаемые файлы в свой вывод diff? Или мой лучший выбор - добавить новые файлы, которые я создал, и существующие файлы, которые я отредактировал, и использовать
git diff --cached
?
В последних версиях 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
(настройка псевдонима - ваш друг здесь).
git add -N .
Я считаю, что вы можете различать файлы в вашем индексе и неотслеживаемые, просто указав путь к обоим файлам.
источник
git diff --no-index untracked_file_1 untracked_file_2
дляgit diff
раскраски синтаксиса и т. Д. На diffs ... красиво./dev/null
вместо:git diff --no-index -- /dev/null <untracked_file>
.cat untracked_file_1
, или, возможно,printf '\e[1;32m%s\e[0m\n' "$(cat untracked_file_1)"
если вам действительно нужен зеленый выход. :) (Хотя на более серьезной ноте, обратите внимание, что подстановка команд удалит завершающие символы новой строки из вашего файла.)Для моей интерактивной повседневной работы (где я постоянно разрабатываю рабочее дерево по отношению к HEAD и хотел бы, чтобы неотслеживаемые файлы были включены в diff),
add -N/--intent-to-add
он непригоден, потому что он ломаетсяgit stash
.Так вот моя
git diff
замена. Это не особо чистое решение, но, поскольку я действительно использую его только в интерактивном режиме, у меня все в порядке с хаком:d
Печатая просто включит неотслеживаемые файлы в diff (что меня беспокоит в моем рабочем процессе), иd args...
будет вести себя как обычныйgit diff
.Ноты:
git diff
на самом деле объединяются отдельные разностные различия, поэтому невозможно определитьd
выходные данные из «реального различий» - за исключением того факта, что все неотслеживаемые файлы сортируются последними.git diff
. Если кто-то выяснит, как это сделать, или если какая-то функция будет добавленаgit
в какой-то момент в будущем, пожалуйста, оставьте примечание здесь!источник
git update-index --add --cacheinfo 100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 new.txt
обходной путь, который я предложил для более старых gits , работаетgit stash
, предполагая, что у вас уже есть e69de29bb в вашей базе данных, например, при попытке использоватьadd -N
ранее. Так что, по-видимому, это не совсем то же самое, что иgit add -N
: я не знаю, как.test
Кстати, вы выполняете сравнение строк, а не проверку числового равенства с помощью вашей команды. Ничего не должно влиять, ноtest "$#" -eq 0
точнее то, что задумано.less
чтобы вам не нужно было нажиматьq
для каждого файла, и это выглядит точно так жеgit diff
, удаляя разбиение на страницы для каждого файла (-P
), добавляя его впоследствии (| less
), сохраняя цвет (--color=always
) и интерпретируя его как цвет (less -r
илиless -R
). Так в целом это:do git -P diff --color=always -- /dev/null "$i"; done | less -r
test -t 1
(например,if [ -t 1 ]; then color_arg=--color; fi
что-то вроде этого), это способ для оболочки проверить, является ли ее вывод терминалом, что является полезным способом выбора цвета. Иxargs
может дать способ избавиться от цикла while. Вам все еще понадобится-n 1
это, так что он все равно будет запускать git несколько раз, и все равно должен быть попарно таким образом, но ... он избавляется от,while
иread
, может быть, так лучше ?! Я оставляю это читателю.Не на 100%, но если по какой-то причине вы не хотите добавлять свои файлы в индекс, как предполагает принятый ответ, вот еще один вариант:
Если файлы не отслеживаются, очевидно, что diff - это весь файл, так что вы можете просто просмотреть их с меньшим количеством:
Перейдите между ними с помощью
:n
и:p
для следующего и предыдущего ..Обновление из комментариев: Если вам нужен формат патча, вы также можете комбинировать его с
git diff
:В этом случае вы также можете перенаправить вывод в файл или использовать другую команду diff.
источник
git diff /dev/null <untracked_tile>
и получить патч в формате патча, а не «просто» файлПри необходимости сгенерируйте патч, а затем:
источник
git add -p
очень часто (что я обычно рекомендую, между прочим) ... Это дает способ сделать основную вещь, просто ... следует отметить, что у нее есть потенциал для нежелательной стороны последствия.это работает для меня:
Последний шаг не является обязательным, он оставит файл в предыдущем состоянии (без отслеживания)
полезно, если вы тоже создаете патч:
источник
Изменения работают, когда поставлены и не поставлены с этой командой. Новые файлы работают при постановке:
Если они не организованы, вы увидите только различия файлов.
источник
HEAD
это значение по умолчанию , так что это то же самое,git diff
что не решает проблему.git add
от каждого не отслеживаемого файлаgit add
его, то проще всего будет проверить, что вы только что добавили / хотите добавитьДля одного файла:
Для всех новых файлов:
Как псевдоним:
Для всех измененных и новых файлов, объединенных в одну команду:
источник
обычно, когда я работаю с командами удаленного определения местоположения, для меня важно, чтобы у меня были предварительные знания о том, какие изменения были сделаны другими командами в том же файле, прежде чем я буду следовать этапам git untrack -> staged -> commit для этого, я написал скрипт bash, который помогите мне избежать ненужного разрешения конфликта слияния с удаленной командой или создания новой локальной ветки и сравнения и слияния в основной ветке
В приведенном выше сценарии я выбираю удаленную основную ветвь (не обязательно ее основную ветвь), чтобы FETCH_HEAD создал список только моего измененного файла и сравнил измененные файлы с git difftool
здесь много difftool, поддерживаемых git, я настраиваю 'Meld Diff Viewer' для хорошего сравнения GUI.
источник
Предполагая, что у вас нет локальных коммитов,
источник
git diff
команду, которая включает неотслеживаемые файлы. Эта команда не включает их. Кроме того, наличие локальных коммитов не имеет абсолютно никакого отношения к вопросу.git merge --squash mybranch
иgit diff master
показал мне изменения в неотслеживаемых файлах.git diff
не показывает различий в неотслеживаемых файлах: поскольку они не отслеживаются, по определению различий нет. Просто так работает Git. :)