Подтвердить что ты не робот

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 меня интересуют только изменения строк.

Спасибо заранее.

4b9b3361

Ответ 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.