Чи можна додати лінії git show, змінити рядки та видалити рядки?


110

"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 рядків.

Чи є спосіб отримати дельтові локальні точки (26 у даному випадку)? Мені не цікаво розмежувати між доданими або видаленими рядками

Відповіді:


127

Ви можете використовувати:

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

Це трохи затято, тому ви можете замість цього розібрати його у власному сценарії.


2
Спасибі Quornian, але numstat дає точно таку ж інформацію, як stat, доповнення та вилучення.
Хуан Алонсо

Оновлено мою відповідь, щоб включити приклад використання --word-diff. Це може бути корисніше.
кворній

14
Вихід даних git diff --numstatрозбивається на файл. Щоб побачити загальну кількість доданих / вилучених git diff --numstat | awk '{ added += $1; removed += $2 } END { print "+" added " -" removed }'
різниць

15
@hughes Простішим способом отримання тієї самої інформації був би git diff --shortstat. На мій досвід, це рівноцінно накопиченню продукції git diff --numstat.
klaus triendl

1
Також FWIW, щоб побачити статистику поетапних змін, просто додайте--cached
xlm

65
  1. Якщо ви хочете знати рядки, додані / змінені / видалені командою з id 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
    

Це рішення не відповідає на запитання, "git --stat" вважає один змінений рядок "1 вставка та 1 видалення". Питання задає питання, як отримати "1 змінено".
Хуан Алонсо

6

Якщо всі ваші файли ставлять для фіксації, перегляньте --numstatтак:

git diff --numstat HEAD~

4

git використовує "уніфікований" diff, який лише додає та видаляє рядки як формат diff. Вам потрібно зробити щось зовнішнє, щоб отримати відмінність, що показує додавання, видалення та зміну інформації.

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


3

Ви можете використовувати diffstatдля відображення кількості модифікованих рядків. Наприклад:

git diff HEAD c9af3e6136e8aec1f79368c2a6164e56bf7a7e07 | diffstat -C -m

Можливість -Cотримання кольорового виходу; -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}).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.