2013-09-15 3 views
58

Когда я делаю GIT различий, он показывает строки, которые были добавлены:Git дифф, чтобы показать только те строки, которые были изменены

+ this line is added 

линии, которые были удалены:

- this line is removed 

но это также показывает количество строк, которые не изменены:

this line is not modified 
this line is also not modified 

Это приводит к фактическому мерзавцу дифф выглядеть примерно так:

+ this line is added 
    this line is not modified 
- this line is removed 
    this line is not modified 

Могу ли я попросить git показать только те строки, которые были изменены, и игнорировать все другие коды, которые не были изменены? Я написал метод, который удалит все строки, у которых нет знака «+» или «-» перед ними, но я уверен, что должен быть более простой способ сделать это.

В моем git diff мне интересны только видимые строки, которые были изменены.

Заранее спасибо.

ответ

89

Что вы хотите - это diff с 0 линиями контекста. Вы можете создать это с:

git diff --unified=0 

или

git diff -U0 

Вы также можете установить в качестве опции конфигурации для этого хранилища:

git config diff.context 0 

Чтобы это установить глобально, для любого хранилища :

git config --global diff.context 0 
+1

Спасибо за быстрый ответ. Это решает половину моей проблемы, но я все еще получаю некоторые строки, такие как «@@ -1 +1 @@», в моем разном и в верхней части моего git diff есть «diff -git a/db/xxxxxxx b/db/xxxx index xxxxx..aaaaaaa bbbbbbbb – Reboot

+2

Я не думаю, что git предоставляет любой способ избежать вывода этих строк, потому что diff не имеет смысла без них (вы не могли знать, какой файл вы просматривали, и где вы были в файл) –

+6

@Rakesh: для расширения git-diff пытается создать diffs, которые могут быть фактически использованы как исправления для исходных файлов, что невозможно без этой информации. Единственный способ удалить его - например, через 'git diff | egrep"^(\ + | -) ". –

5

Вслед за в последнем комментарии Криса, основная проблема с последующей обработкой заключается в том, что вы хотите сохранить строки, начинающиеся с -|+, но вы также хотите отфильтровать те, которые начинаются с ---|+++. Если вы храните файлы исправлений в вашем репо (я, в Pydoop), с другой стороны, вы хотите, чтобы строки, которые начинаются с --|++, поэтому регулярное выражение становится усложнится:

git diff | grep -P '^\+(?:(?!\+\+))|^-(?:(?!--))' 

регулярное выражение польз отрицательный взгляд: см. ответ Питера Боутона на this question для подробного объяснения.

Если вы делаете это часто, вы можете создать GIT псевдоним для него:

git config --global alias.diffonly '!git diff | grep -P "^\+(?:(?!\+\+))|^-(?:(?!--))"' 
+1

это не работает для меня на Windows, мерзавца Баш. Не знаю, почему (grep сказал недействительный вариант P), у меня нет chutzpah, чтобы посмотреть на него в данный момент. – Dennis

+1

'-P' или' --perl-regexp' используется для интерпретации шаблона как регулярного повторения Perl, но не всегда реализуется. Это не сработало для меня на OSX. http://www.gnu.org/software/grep/manual/grep.html#grep-Programs –

18

Другой хак (на ип * х), чтобы показать только строки, начинающиеся с + и -:

git diff -U0 | grep '^[+-]' | grep -Ev '^(--- a/|\+\+\+ b/)' 

код выше выполняет следующие действия:

  • git diff -U0: чу SE 0 строки контекста
  • Первый Grep только включает в себя все линии, начиная с + или -
  • Второй ГРЭП исключает строки, начинающиеся с --- a/ или +++ b/

Примечание: - выше решение будет необходимо модифицировать если вы используете дополнительные опции git diff, такие как -R, --src-prefix, --dst-prefix, --no-prefix, ... - Два greps могут быть объединены в один grep -E -v '^(\+\+\+ b/|--- a/|@@ |diff --git|index)', но я считаю, что версия с двойным grep проще и удобнее erstand.

+0

Хороший. Упреждайте пояснение каждого фильтра. – henrebotha

1

Я думаю, что для простых случаев регулярного выражения может быть гораздо короче и легче запомнить, с оговоркой, что это не будет работать, если у вас есть линия изменения, где сама строка начинается с + или -

$ git diff | grep '^[+|-][^+|-]' 

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


Пример:

$ cat testfile 
A 
B 
C 
D 
E 
F 
G 

Say меняю C к X, E к Y и G к Z.

$ git diff | grep '^[+|-][^+|-]' 
-C 
+X 
-E 
+Y 
-G 
+Z 

Как я уже сказал выше, это просто для большинства случаев. Если вы подключите этот вывод к файлу dout, попробуйте одно и то же регулярное выражение, оно не будет работать.

$ git diff dout | grep '^[+|-][^+|-]' 
$ 

В любом случае, надеюсь, что помогает в вашем случае

Смежные вопросы