Czy istnieje sposób na dodanie linii git show, zmianę linii i usunięcie linii?

110

„git diff --stat” i „git log --stat” pokazują dane wyjściowe:

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

Ale to, co naprawdę wydarzyło się w tym zatwierdzeniu, to zmiana 4 linii i usunięcie 26 linii, co różni się od dodania 4 linii i usunięcia 30.

Czy istnieje sposób na uzyskanie wartości delta LOC (w tym przypadku 26)? Nie obchodzi mnie rozróżnianie między dodanymi lub usuniętymi liniami.

Juan Alonso
źródło

Odpowiedzi:

128

Możesz użyć:

git diff --numstat

aby uzyskać numeryczne informacje o różnicach.

Jeśli chodzi o oddzielenie modyfikacji od pary dodawania i usuwania, --word-diffmoże pomóc. Możesz spróbować czegoś takiego:

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

Jest trochę rozwlekły, więc możesz zamiast tego przeanalizować go we własnym skrypcie.

quornian
źródło
2
Dzięki quornian, ale numstat podaje dokładnie te same informacje, co statystyki, dodatki i usunięcia.
Juan Alonso,
Zaktualizowałem moją odpowiedź, dodając przykładowe użycie --word-diff. To mogłoby być bardziej przydatne.
quornian
14
Dane wyjściowe programu git diff --numstatsą podzielone według plików. Aby zobaczyć sumę dodaną / usuniętą dla różnicy, możesz przesłać ją potokiem do awk:git diff --numstat | awk '{ added += $1; removed += $2 } END { print "+" added " -" removed }'
hughes
15
@hughes Byłby prostszy sposób uzyskania tych samych informacji git diff --shortstat. Z mojego doświadczenia wynika, że ​​jest to równoznaczne z nagromadzeniem produkcji git diff --numstat.
klaus triendl
1
Również FWIW, aby zobaczyć statystyki zmian etapowych, po prostu dodaj--cached
xlm
65
  1. Jeśli chcesz wiedzieć, jakie wiersze zostały dodane / zmienione / usunięte przez zatwierdzenie z id commit-id, możesz użyć

    git show commit-id --stat
    

    lub

    git diff commit-id-before commit-id --stat
    
  2. Jeśli chcesz znać linie dodane / zmienione / usunięte przez zatwierdzenia zakresu, możesz użyć

    git diff commit-id1 commit-id2 --stat
    
  3. Jeśli chcesz wiedzieć, jakie wiersze zostały dodane / zmienione / usunięte przy każdym zatwierdzeniu, możesz użyć

    git log --stat
    
yhluo
źródło
To rozwiązanie nie odpowiada na pytanie, „git --stat” liczy pojedynczą zmodyfikowaną linię jako „1 wstawienie i 1 usunięcie”. Pytanie dotyczy sposobu uzyskania „1 zmiany”.
Juan Alonso
6

Jeśli wszystkie twoje pliki są przygotowywane do zatwierdzenia, zobacz to w --numstatten sposób:

git diff --numstat HEAD~
Falieson
źródło
4

git używa "ujednoliconego" diff, który tylko dodał i usunął linie, jako format różnic. Musisz zrobić coś zewnętrznego, aby uzyskać różnicę, która pokazuje dodawanie, usuwanie i zmianę informacji.

https://wiki.postgresql.org/wiki/Working_with_Git#Context_diffs_with_Git udostępnia linki do skryptu, który umożliwia uruchamianie zwykłego starego "diff" - i na tej podstawie można wygenerować "kontekstowe" wyjście różnicowe . Różnica kontekstowa pokazuje dodane, usunięte i zmienione linie, co powinno pozwolić ci uzyskać żądane dane.

Daniel Pittman
źródło
3

Możesz użyć diffstatdo pokazania liczby zmodyfikowanych linii. Na przykład:

git diff HEAD c9af3e6136e8aec1f79368c2a6164e56bf7a7e07 | diffstat -C -m

Ta -Copcja służy do uzyskania kolorowego wyjścia; -mopcja jest dla pokazujący liczbę zmodyfikowanych wierszy. Przykładowe dane wyjściowe:

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

Liczba zmodyfikowanych linii jest przybliżona, jak man diffstatpowiedziano:

-m łączenie wstawiania / usuwania liczników z każdej „porcji” pliku łatki w celu przybliżenia liczby zmodyfikowanych linii.

Jedna główna różnica między git diff --stati diffstat: diffstatnie pokazuje przenoszenia / zmiany nazw plików (np app/{a.rb => b.rb}.).

Strumień
źródło