Как я могу рассчитать количество строк, измененных между двумя коммитами в git?

748

Есть ли простой способ вычислить количество строк, измененных между двумя коммитами в git?

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

Майк
источник
3
Вы смотрите на BitBucket.
Alex78191

Ответы:

1114

Вам нужна --statопция git diffили, если вы хотите разобрать это в скрипте, --numstatопция.

git diff --stat <commit-ish> <commit-ish>

--statпроизводит удобочитаемый вывод, который вы привыкли видеть после слияний; --numstatсоздает хороший макет таблицы, который сценарии могут легко интерпретировать.

Я почему-то упустил, что вы пытаетесь сделать это одновременно с несколькими коммитами - это задача для git log. Рон ДеВера касается этого, но на самом деле вы можете сделать гораздо больше, чем он упоминает. Поскольку для git logвызова запрошенной информации внутренне вызывается механизм сравнения, вы можете задать ему любой из параметров статистики - не только --shortstat. Что вы, вероятно, хотите использовать:

git log --author="Your name" --stat <commit1>..<commit2>

но вы можете использовать --numstatили --shortstatкак хорошо. git logВы также можете выбирать коммиты различными способами - взгляните на документацию . Возможно, вас заинтересуют такие вещи, как --since(вместо указания диапазонов фиксации, просто выберите коммиты с прошлой недели) и --no-merges(коммиты слияния фактически не вносят изменений), а также симпатичные параметры вывода ( --pretty=oneline, short, medium, full...).

Вот одна строка для получения полных изменений вместо изменений для каждого коммита из git log (измените параметры выбора коммитов по желанию - это коммиты вами, от commit1 до commit2):

git log --numstat --pretty="%H" --author="Your Name" commit1..commit2 | awk 'NF==3 {plus+=$1; minus+=$2} END {printf("+%d, -%d\n", plus, minus)}'

(вы должны позволить git log распечатать некоторую идентифицирующую информацию о коммите; я произвольно выбрал хеш, а затем использовал awk, чтобы выделить строки только с тремя полями, которые являются данными со статистической информацией)

Cascabel
источник
2
Это не отвечает на первоначальный вопрос о «измененных линиях». Изменение одной строки рассчитывается как для вставленной, так и для удаленной строки. Расчет количества измененных строк требует больше работы, чем описано здесь.
Вилле Лайтила
12
@VilleLaitila: Это настолько близко, насколько это возможно без абсурдных усилий, и этого было достаточно для ОП и 15 других. (Как вы определяете, когда измененная строка становится добавленной строкой и удаленной строкой? Путем редактирования расстояния между линиями - и + в виде доли длины строки?) Все мы знаем, что изменения удваиваются; мы можем просто назвать это полезным показателем количества изменений и двигаться дальше в нашей жизни.
Каскабель
188
git diff --shortstat <commit1> <commit2>был тот, который я хотел.
Ким
9
Для справки, формат даты для --sinceи --untilчто - то вроде: yesterday, 1 month 2 weeks 3 days 1 hour 1 second agoили1979-02-26 18:30:00
juanmirocks
4
@ Брайсон Да, именно поэтому эта строка говорит <commit-ish>- она ​​работает со всем, что представляет коммит, включая литеральные коммиты, ветки, теги и ссылки в целом. См. Также stackoverflow.com/questions/23303549/…
Каскабель
193

Для ленивых используйте git log --stat.

Томас
источник
14
Я нашел это полезным, добавил, -10чтобы показать предыдущие десять коммитов.
Чойлтон Б. Хиггинботтом
2
Когда вы закончите просматривать историю коммитов, наберите Qдля возврата в терминал.
Stevoisiak
180
git diff --shortstat

дает вам только количество строк, измененных и добавленных. Это работает только с неустановленными изменениями. Для сравнения с веткой:

git diff --shortstat some-branch
orkoden
источник
3
Круто! но .. имейте в виду, что это работает только с неустановленными изменениями
TomCobo
3
Если вы поставили изменения с git add, убедитесь, что сделалиgit diff --shortstat --cached
TomNash
Изменено 2463 файла, добавлено 39745 (+), удалено 21383 (-) Я фактически удалил около 5–10 тыс. За последний месяц. Это почти все, что я делал, кроме перемещения вещей. Что-то не так. Это не включает удаленные файлы или что-то?
jgmjgm
46
git diff --stat commit1 commit2

РЕДАКТИРОВАТЬ: Вы также должны указать коммиты (без параметров он сравнивает рабочий каталог с индексом). Например

git diff --stat HEAD^ HEAD

сравнить родителя HEADс HEAD.

Мэтью Флэшен
источник
1
Нет необходимости в использовании diff-index- diffинтерфейс может обрабатывать все; дело diff-indexпокрыто --cached/--staged, я полагаю. (И нет способа использовать diff-indexдля сравнения двух произвольных коммитов, как просил ОП.)
Каскабель
Вывод это ничего для меня.
Майк
@Mike: ты бросил карат? Ваш последний коммит был коммитом слияния? Если Git говорит, что нет различий, это потому, что нет различий.
Каскабель
6
или, если не git diff --stat HEAD
ввязался
1
Кроме того, вы можете сравнить дальше, чем просто родитель, используя HEAD~n, где n, как далеко вы хотите вернуться. git diff --stat HEAD~5 HEADпокажет объединенную статистику за последние 5 коммитов относительно HEAD.
Натан Бек
18

Предполагая, что вы хотите сравнить все ваши коммиты между abcd123 (первый коммит) и wxyz789 (последний коммит), включительно:

git log wxyz789^..abcd123 --oneline --shortstat --author="Mike Surname"

Это дает краткий вывод как:

abcd123 Made things better
 3 files changed, 14 insertions(+), 159 deletions(-)
wxyz789 Made things more betterer
 26 files changed, 53 insertions(+), 58 deletions(-)
Рон ДеВера
источник
Вывод этого ничего не значит для меня (я сделал коммиты и проверил - автор прав, используя его с git log и другими аргументами).
Майк
Это случилось со мной тоже. Два коммита были в неправильном порядке, меняя местами их, исправляя.
Боб Эспонья
1
Обновлен порядок фиксации и уточнено, что представляют собой два SHA. Спасибо за то, что
поймали
3
--shortstatФлаг является удивительным, он работает с , git diffхотя (не git log).
lucke84
Как их обобщить?
до
13

Другой способ получить все изменения журнала за указанный период времени

git log --author="Tri Nguyen" --oneline --shortstat --before="2017-03-20" --after="2017-03-10"

Вывод:

2637cc736 Revert changed code
 1 file changed, 5 insertions(+), 5 deletions(-)
ba8d29402 Fix review
 2 files changed, 4 insertions(+), 11 deletions(-)

С длинным контентом, вы можете экспортировать в файл для более удобочитаемого

git log --author="Tri Nguyen" --oneline --shortstat --before="2017-03-20" --after="2017-03-10" > /mnt/MyChangeLog.txt
nmtri
источник
2

Хотя все приведенные выше ответы верны, ниже один удобно использовать, если вам нужно количество последних коммитов

ниже одного, чтобы получить количество последних 5 коммитов

git diff $(git log -5 --pretty=format:"%h" | tail -1) --shortstat

чтобы получить счет последних 10 коммитов

git diff $(git log -10 --pretty=format:"%h" | tail -1) --shortstat

generic - измените N с количеством последних коммитов, которые вам нужны

git diff $(git log -N --pretty=format:"%h" | tail -1) --shortstat

чтобы получить счет всех коммитов с начала

git diff $(git log --pretty=format:"%h" | tail -1) --shortstat


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

Git Log --Numstat просто дает вам только цифры

nibinbhaskar
источник
1

Я просто решил эту проблему для себя, поэтому я поделюсь тем, что я придумал. Вот конечный результат:

> git summary --since=yesterday
total: 114 file changes, 13800 insertions(+) 638 deletions(-)

Основная команда выглядит так:

git log --numstat --format="" "$@" | awk '{files += 1}{ins += $1}{del += $2} END{print "total: "files" files, "ins" insertions(+) "del" deletions(-)"}'

Обратите внимание на команду $@в log для передачи ваших аргументов, таких как --author="Brian"или --since=yesterday.

Выход из awk для помещения его в псевдоним git был грязным, поэтому вместо этого я поместил его в исполняемый скрипт на моем пути ( ~/bin/git-stat-sum), а затем использовал скрипт в псевдониме в моем .gitconfig:

[alias]
    summary = !git-stat-sum \"$@\"

И это работает очень хорошо. И последнее, что следует отметить, file changes- это количество изменений в файлах, а не количество уникальных файлов, которые были изменены. Это то, что я искал, но, возможно, это не то, что вы ожидаете.

Вот еще один пример или два

git summary --author=brian
git summary master..dev
# combine them as you like
git summary --author=brian master..dev
git summary --all

Действительно, вы должны иметь возможность заменить любую git logкоманду на git summary.

не определено
источник