Когда я делаю git diff, он показывает добавленные строки:
+ this line is added
строки, которые были удалены:
- this line is removed
но он также показывает много строк, которые не изменяются:
this line is not modified
this line is also not modified
Это приводит к тому, что фактический git diff выглядит примерно так:
+ this line is added
this line is not modified
- this line is removed
this line is not modified
Могу ли я попросить git отображать только измененные строки и игнорировать весь остальной код, который не был изменен? Я написал метод, который удалит все строки, перед которыми нет знака «+» или «-», но я уверен, что должен быть более простой способ сделать это.
В моем git diff меня интересуют только те строки, которые были изменены.
Заранее спасибо.
git diff | egrep "^(\+|-) "
.git config --global diff.context 0
чтобы установить его глобальноЕще один прием (на un * x), чтобы показать только строки, начинающиеся с
+
и-
:Приведенный выше код делает следующее:
git diff -U0
: выберите 0 контекстных строк+
или-
--- a/
или+++ b/
цвет
Чтобы отобразить цветной дифференциал, попробуйте следующее:
^\e\[[^m]*m[-+]
ищет начало строки (^
), затем escape characer (\e
), за[
которым вместе начинается escape-последовательность, затем любой символ, не являющийся "m" (числа, точки с запятой или ничего), за которым следует " m ", который завершает escape-последовательность.\e[0m
(сброс),\e[m
(также сброс),\e[1m
(жирный шрифт),\e[31m
(красный),\e[32m
(зеленый),\e[9;31m
(зачеркнутый + красный),\e[31;9m
(красный + зачеркнутый),\e[1;4;9;31m
(жирный + подчеркнутый + зачеркнутый + красный). В цветах git по умолчанию используются красный и зеленый, но их можно изменить.--color
такое же, как--color=always
.--- a/
или+++ b/
появление в начале строки было снято, чтобы учесть escape-последовательности, и это могло привести к краевому случаю.Дополнительные замечания:
-R
,--src-prefix
,--dst-prefix
,--no-prefix
и т.д.grep -E -v '^(\+\+\+ b/|--- a/|@@ |diff --git|index )'
, но мне легче понять версию с двойным grep.источник
git diff
строк типа «заголовок», которые начинаются с символа@@
, но какиеgit diff
строки начинаются с---
или+++
? Я не знал об этих.+++
) или удаления (---
). Теперь я вижу это здесь: git-scm.com/docs/git-diff#_combined_diff_format .--- a/filename
похоже, обозначает «файл слева» или файл, как было раньше, и,+++ b/filename
кажется, обозначает «файл справа», или файл, как сейчас, с вашими изменениями. Я так привык использоватьgit difftool
с meld , который показывает красивые параллельные сравнения, что я никогда не привык смотреть на этоgit diff
, поэтому мне это все еще кажется странным, и я никогда раньше не обращал внимания на эти нюансы.Следуя последнему комментарию Криса, основная проблема с постобработкой заключается в том, что вы хотите сохранить строки, начинающиеся с,
-|+
но вы также хотите отфильтровать те, которые начинаются с---|+++
. С другой стороны, если вы храните файлы патчей в своем репо (я храню в Pydoop ), вы хотите сохранить строки, начинающиеся с--|++
, поэтому регулярное выражение становится немного сложным:Регулярное выражение использует отрицательный просмотр вперед: подробное объяснение см. В ответе Питера Боутона на этот вопрос .
Если вы делаете это часто, вы можете настроить для него псевдоним git:
источник
-P
или--perl-regexp
используется для интерпретации шаблона как регулярного повторного выражения Perl, но не всегда реализуется. У меня это не сработало на OSX. gnu.org/software/grep/manual/grep.html#grep-ProgramsЯ думаю, что для простых случаев регулярное выражение может быть намного короче и его легче запомнить, с оговоркой, что это не сработает, если у вас есть изменения строки, где сама строка начинается с
+
или-
Регулярное выражение говорит, что строка должна начинаться с
+
или-
, а следующий за ним символ не должен быть ни одним из них. Я получил те же результаты вне зависимости от того, сбежал я здесь+
или нет, кстати ...Пример:
Скажем, я перехожу
C
наX
,E
наY
иG
наZ
.Однако, как я сказал выше, это только для большинства случаев. Если вы отправите этот вывод в файл
dout
, а затем попробуйте то же регулярное выражение, это не сработает.В любом случае, надеюсь, что это поможет в вашем случае
источник
- name: No pdb
в файле yaml.В этом ответе для удобства чтения сохранятся исходные красный / зеленый цвета. Я предоставил несколько вариантов синтаксиса:
Объяснение:
git diff --color
необходимо, чтобы git не отключал цвет, когда он работает.grep --color=never
предотвращает удаление исходным цветом и выделение совпадающей строки с помощью grep.\e[31m
) или green (\e[32m
).$'...'
(ANSI-C , со ссылкой на синтаксис) или-P
(Perl синтаксис) должен позволить ,grep
чтобы интерпретировать\e
или в\033
качествеESC
символа.источник
$''
часть мне особенно помогла. stackoverflow.com/a/61929887/4561887Как использовать ,
awk
чтобы показать только те ,+
и-
линию, учет любого цвета или форматирование текстаgit diff
может быть вывод:Ни один из других ответов здесь (включая мой другой ответ ) не сделает именно то, что вы хотите, на 100% правильно. Этот ответ, однако, будет. Вот однострочный файл, который вы можете скопировать и вставить в свой терминал. Я только что сделал его несколькими строками для удобства чтения - вы можете скопировать и вставить его одинаково, так что я могу сделать его читабельным! Он полагается на
awk
язык программирования:Вот его особенности. Все эти функции, взятые вместе, решают недостатки любого другого ответа здесь:
^(\033\[(([0-9]{1,2};?){1,10})m)?
git config
настройках . Вот почему в приведенном выше регулярном выражении есть;?
и{1,10}
: если оно обнаруживает начало кода форматирования цвета или текста, оно сопоставляет до 10 последовательностей этих комбинированных кодов ANSI.Он также НЕ включает строки, которые начинаются с
@@
и словаdiff
, как принятый ответ . Если вам действительно нужны эти строки (которые, откровенно говоря, я считаю полезными :)), сделайте вместо этого:или
Вывод выводится точно так же, как
git diff
и вless
пейджере с дополнительным выводом цвета (-R
), и только если текст> 1 страницы (-F
), и при сохранении текущей страницы текста на экране при использованииq
uit (-X
) ,Он также имеет то преимущество, что он мощный и легко настраиваемый, поскольку он использует язык программирования awk.
Если вы заинтересованы в изучении awk , вот несколько ресурсов:
gawk
(GNUawk
) руководство: https://www.gnu.org/software/gawk/manual/html_node/index.html#SEC_Contentsgit diffn
и комментарии к нему: https://github.com/ElectricRCAircraftGuy/eRCaGuy_dotfiles/blob/master/useful_scripts/git-diffn.shgit diffn
тоже хотите , то естьgit diff
с номерами строк, см. Здесь: Git diff с номерами строк (журнал Git с номерами строк)В качестве бонуса я также завернул приведенное выше, чтобы использовать его как
git diffc
, что означает «git diff для отображения ТОЛЬКО 'c'hanges'». Использование является идентичным сgit diff
; просто используйтеgit diffc
вместо этого! Он поддерживает ВСЕ параметры. Цвет по умолчанию включен. Чтобы выключить его, просто используйтеgit diffc --no-color
илиgit diffc --color=never
. Подробнееman git diff
см.Поскольку я только что закончил
git diffn
(инструмент для отображенияgit diff
номеров строк) вчера вечером, писатьgit diffc
было тривиально. Я решил, что лучше сделаю это сейчас, пока в моей голове еще свежи знания.Установить
git diffc
:Следуйте инструкциям в конце этого ответа здесь , за исключением того, что вы видите
git-diffn
в инструкциях, используйтеgit-diffc
вместо этого. Этоwget
тоже входит в команду. Скачать и установитьgit diffc
очень просто: это всего несколько команд.источник
Вот еще один, более простой способ найти только строки, которые были изменены и, следовательно, начинаются с одного
+
или-
, сохраняя при этом цветной вывод:-U0
говорит, что нужно включить 0 строк контекста вокруг измененных строк, то есть: включить только сами измененные строки. Смотритеman git diff
.-E
for grep позволяет ему работать с расширенными регулярными выражениями$''
Синтаксис , по- видимому позволяет ANSI квотирование, который правильно интерпретирует ESC (побег, или 0x1B) символов правильно. Смотрите здесь .^
соответствует началу строки,\e
соответствует символу Escape, который является началом цветового кода в терминале,\[
соответствует следующему символу в цветовом коде, который равен[
, а затем(this|that)
синтаксис соответствует «этому» или «тому» , где "это" -32m+
это зеленая + линия, а31m-
красная -.\e[32m
зеленый и\e[31m
красный.+
показывает строки, помеченныеgit diff
как добавленные, конечно, и-
показывает строки, отмеченныеgit diff
как удаленные.--color=never
это требуется во второмgrep
выражении, чтобы оно не выделяло свои совпадения, что в противном случае могло бы испортить цветовые коды, поступающиеgit diff
слева.+
необходимо экранировать,\+
потому что в противном случае+
это специальный символ регулярного выражения (регулярного выражения), который определяет одно или несколько вхождений предыдущего элемента . См. Здесь: https://en.wikipedia.org/wiki/Regular_expression#Basic_concepts .Ссылки:
Связанный:
git-filechange-search.sh
- сценарий, который позволяет вам искать в файле имя переменной или функции и выяснять, какие коммиты содержат изменения с этой переменной или именем функции. Ex. Использование:./git-filechange-search.sh path/to/my/file.cpp variable_name
найдет все коммиты с изменениями в file.cpp, которыеvariable_name
в них содержатся . Это полезно, чтобы увидеть, где и когда были изменены определенные функции. Это как если бы это был поиск, который мог наблюдать разделы файла, отображаемые сgit blame
течением времени.источник