Git diff показать только строки, которые были изменены
Когда я выполняю diff git, он показывает строки, которые были добавлены:
+ 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 показать только те строки, которые были изменены, и игнорировать все остальные коды, которые не были изменены? Я написал метод, который удалит все строки, которые перед ними не имеют знак "+" или "-", но я уверен, что должен быть более простой способ сделать это.
В моем diff git меня интересуют только изменения строк.
Спасибо заранее.
Ответы
Ответ 1
То, что вы хотите, - это diff с 0 линиями контекста. Вы можете сгенерировать это с помощью:
git diff --unified=0
или
git diff -U0
Вы также можете установить это как параметр конфигурации для этого репозитория:
git config diff.context 0
Чтобы установить его глобально, для любого репозитория:
git config --global diff.context 0
Ответ 2
Другой взлом (на un * x), чтобы показать только строки, начинающиеся с +
и -
:
git diff -U0 | grep '^[+-]' | grep -Ev '^(--- a/|\+\+\+ b/)'
Вышеприведенный код делает следующее:
-
git diff -U0
: выберите 0 контекстных строк
- Первый grep включает только все строки, начинающиеся с
+
или -
- Второй grep исключает строки, начинающиеся с
--- a/
или +++ b/
Примечание:
- Вышеупомянутое решение необходимо будет изменить, если вы используете дополнительные параметры git diff, такие как -R
, --src-prefix
, --dst-prefix
, --no-prefix
,...
- Два greps могут быть объединены в один grep -E -v '^(\+\+\+ b/|--- a/|@@ |diff --git|index )'
, но я считаю, что версия double grep легче понять.
Ответ 3
Следуя последнему комментарию Криса, главная проблема с последующей обработкой заключается в том, что вы хотите сохранить строки, начинающиеся с -|+
, но вы также хотите отфильтровать те, которые начинаются с ---|+++
. Если вы сохраняете файлы исправлений в своем репо (я делаю, Pydoop) с другой стороны, вы хотите сохранить строки, начинающиеся с --|++
, поэтому регулярное выражение становится немного вовлеченным:
git diff | grep -P '^\+(?:(?!\+\+))|^-(?:(?!--))'
Регулярное выражение использует отрицательный результат: см. ответ Питера Боутона на этот вопрос для подробного объяснения.
Если вы часто это делаете, вам может понадобиться создать для него псевдоним git:
git config --global alias.diffonly '!git diff | grep -P "^\+(?:(?!\+\+))|^-(?:(?!--))"'
Ответ 4
Я думаю, что для простых случаев регулярное выражение может быть намного короче и легче запомнить, с оговоркой, что это не сработает, если у вас есть изменения в строке, где сама строка начинается с +
или -
$ git diff | grep '^[+|-][^+|-]'
Регулярное выражение говорит, что строка должна начинаться с +
или -
, и сразу следующий символ не должен быть ни тем, ни другим. Я получил те же результаты, не удалось ли я избежать +
или нет здесь, btw...
Пример:
$ cat testfile
A
B
C
D
E
F
G
Скажем, я меняю C
на X
, E
на Y
и G
на Z
.
$ git diff | grep '^[+|-][^+|-]'
-C
+X
-E
+Y
-G
+Z
Как я уже говорил выше, это просто для большинства случаев. Если вы передаете этот вывод в файл dout
, попробуйте одно и то же регулярное выражение, оно не будет работать.
$ git diff dout | grep '^[+|-][^+|-]'
$
В любом случае, надеюсь, что это поможет в вашем случае
Ответ 5
Этот ответ сохранит исходные красные/зеленые цвета для удобства чтения. Я предоставил несколько вариантов синтаксиса:
git diff --color | grep --color=never $'^\e\[3[12]m'
git diff --color | grep --color=never $'^\033\[3[12]m'
git diff --color | grep --color=never -P '^\e\[3[12]m'
git diff --color | grep --color=never -P '^\033\[3[12]m'
Объяснение:
git diff --color
необходим для того, чтобы git не отключал цвет, когда он перекачивает.
grep --color=never
предназначен для предотвращения удаления исходного цвета и выделения подходящей строки grep.
- Мы сопоставляем строки, начинающиеся с красных (
\e[31m
) или зеленых (\e[32m
) escape-кодов.
$'...'
(синтаксис цитирования ANSI-C) или -P
(синтаксис perl) позволяют grep
интерпретировать \e
или \033
как символ ESC
.