Есть ли способ добавить строки git show, изменить строки и удалить строки?

114

"git diff --stat" и "git log --stat" выводят следующий результат:

$ git diff -C --stat HEAD c9af3e6136e8aec1f79368c2a6164e56bf7a7e07
 app/controllers/application_controller.rb |   34 +++-------------------------
 1 files changed, 4 insertions(+), 30 deletions(-)

Но что на самом деле произошло в этой фиксации, так это то, что 4 строки были изменены и 26 строк были удалены, что отличается от добавления 4 строк и удаления 30.

Есть ли способ получить дельта-LOC (в данном случае 26)? Меня действительно не волнует различие между добавленными или удаленными строками.

Хуан Алонсо
источник

Ответы:

133

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

git diff --numstat

чтобы получить числовую информацию о различиях.

Что касается отделения модификации от пары добавления и удаления, это --word-diffможет помочь. Вы можете попробовать что-то вроде этого:

MOD_PATTERN='^.+(\[-|\{\+).*$' \
ADD_PATTERN='^\{\+.*\+\}$' \
REM_PATTERN='^\[-.*-\]$' \
git diff --word-diff --unified=0 | sed -nr \
    -e "s/$MOD_PATTERN/modified/p" \
    -e "s/$ADD_PATTERN/added/p" \
    -e "s/$REM_PATTERN/removed/p" \
    | sort | uniq -c

Это немного многословно, поэтому вы можете вместо этого разобрать его в своем собственном скрипте.

Quornian
источник
2
Спасибо, quornian, но numstat дает точно такую ​​же информацию, как статистика, добавления и удаления.
Хуан Алонсо,
Обновил мой ответ, чтобы включить пример использования --word-diff. Это могло быть более полезно.
Quornian 01
16
Вывод git diff --numstatразбивается по файлам. Чтобы увидеть общее количество добавленных / удаленных для различий, вы можете git diff --numstat | awk '{ added += $1; removed += $2 } END { print "+" added " -" removed }'
передать
18
@hughes. Более простой способ получить ту же информацию git diff --shortstat. По моему опыту, это эквивалентно накоплению продукции git diff --numstat.
klaus triendl
1
Также FWIW, чтобы увидеть статистику поэтапных изменений, просто добавьте--cached
xlm
67
  1. Если вы хотите знать строки, добавленные / измененные / удаленные фиксацией с идентификатором commit-id, вы можете использовать

    git show commit-id --stat
    

    или

    git diff commit-id-before commit-id --stat
    
  2. Если вы хотите знать, какие строки добавлены / изменены / удалены коммитами диапазона, вы можете использовать

    git diff commit-id1 commit-id2 --stat
    
  3. Если вы хотите знать, какие строки добавлены / изменены / удалены каждой фиксацией, вы можете использовать

    git log --stat
    
yhluo
источник
Это решение не отвечает на вопрос, «git --stat» считает одну измененную строку как «1 вставку и 1 удаление». Вопрос спрашивает, как получить «1 изменено».
Хуан Алонсо
6

Если все ваши файлы подготовлены для фиксации, для этого выполните --numstatследующие действия:

git diff --numstat HEAD~
Falieson
источник
4

git использует "унифицированный" diff, который только добавляет и удаляет строки в качестве формата diff. Вы должны сделать что-то внешнее, чтобы получить различие, которое показывает добавление, удаление и изменение информации.

https://wiki.postgresql.org/wiki/Working_with_Git#Context_diffs_with_Git дает ссылки на скрипт, который позволяет запускать обычный старый "diff" - и из этого вы можете сгенерировать "контекстный" вывод diff . Различия контекста действительно показывают добавленные, удаленные и измененные строки, что должно позволить вам получить нужные данные.

Дэниел Питтман
источник
4

Вы можете использовать, diffstatчтобы показать количество измененных строк. Например:

git diff HEAD c9af3e6136e8aec1f79368c2a6164e56bf7a7e07 | diffstat -C -m

-CОпция для получения colourised вывода; -mопция для показа количества измененных строк. Пример вывода:

 app/controllers/application_controller.rb |   30 -------------------!!!
 1 files changed, 0 insertions(+), 26 deletions(-), 4 modifications(!)

Подсчет количества измененных строк является приблизительным, как man diffstatсказано:

-m объединить счетчики вставок / удалений из каждого «фрагмента» файла исправления для приблизительного подсчета измененных строк.

Одно из основных различий между git diff --statи diffstat: diffstatне показывает перемещение / переименование файлов (например app/{a.rb => b.rb}).

Поток
источник