Git diff: возможно ли показывать только измененные строки

Я пытаюсь получить только новую версию строк, которые изменились, и не вся другая информация, которая показывает git diff.

Для:

git diff HEAD --no-ext-diff --unified=0 --exit-code -a --no-prefix

Он показывает:

diff --git file1 file2
index d9db605..a884b50 100644
--- file1
+++ file2
@@ -16 +16 @@ bla bla bla
-old text
+new text

то, что я хочу видеть, только:

new text

Возможно ли это?

Ответы

Ответ 1

Только добавленные строки не имеют смысла во всех случаях. Если вы заменили какой-то блок текста, и вы решили включить одну строку, которая была там раньше, git должна соответствовать и угадывать. - Обычно вывод git diff может использоваться как вход для patch после этого и поэтому имеет смысл. Только добавленные строки точно не определены как git, чтобы угадать в некоторых случаях.

Если вы все же хотите этого, вы не можете доверять ведущему знаку +. Возможно, фильтрация всей зеленой линии лучше:

git diff --color=always|perl -wlne 'print $1 if /^\e\[32m\+\e\[m\e\[32m(.*)\e\[m$/'

только для фильтра удаленных линий для всех красных линий:

git diff --color=always|perl -wlne 'print $1 if /^\e\[31m-(.*)\e\[m$/'

для проверки цветовых кодов на выходе, который вы можете использовать:

git diff --color=always|ruby -wne 'p $_'

Ответ 2

Если вам требуется только часть new text, используйте следующее:

git diff HEAD --no-ext-diff --unified=0 --exit-code -a --no-prefix | egrep "^\+"

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

Ответ 3

Вы можете использовать:

git diff -U0 <commit-hash> | grep "^\+\""

Это даст ваш результат как "+ новый текст"

Ответ 4

Вот ответ, используя grep. Он сохраняет оригинальные красные/зеленые цвета для удобства чтения. Я предоставил несколько вариантов синтаксиса:

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.