Pytanie Zobacz historię zmian pliku za pomocą wersji Git


Jak mogę wyświetlić historię zmian pojedynczego pliku w Git, uzupełnić szczegóły o to, co się zmieniło?

Mam do tej pory:

git log -- [filename]

który pokazuje mi historię zatwierdzenia pliku, ale jak mogę uzyskać zawartość każdej zmiany pliku?

Próbuję zrobić przejście z MS SourceSafe i to było proste right-click → show history.


2510
2017-11-10 15:42


pochodzenie


Powyższy link nie jest już ważny. Ten link działa już dziś: Git Community Book - chris


Odpowiedzi:


Do tego użyłbym:

gitk [filename]

lub postępować zgodnie z nazwą pliku przy zmianie nazwy

gitk --follow [filename]

1951
2017-08-24 12:05



Ale mam nawet narzędzie, które łączy powyższe z "git winy", pozwalając mi przeglądać źródło pliku, jak zmienia się w czasie ... - Egon Willighagen
Niestety nie jest to zgodne z historią plików wcześniejszych nazw. - Dan Moulding
Szukałem również historii plików, które zostały wcześniej przemianowane i znalazłem ten wątek jako pierwszy. Rozwiązaniem jest użycie "git log --follow <filename>", jak zauważył Phil tutaj. - Florian Gutmann
Autor szukał narzędzia wiersza poleceń. Podczas gdy gitk jest dostarczany z GIT, nie jest to ani aplikacja wiersza poleceń, ani szczególnie dobry GUI. - mikemaccana
Czy szukał narzędzia wiersza poleceń? "kliknij prawym przyciskiem myszy -> pokaż historię" na pewno nie oznacza to. - hdgarrood


Możesz użyć

git log -p filename

aby git generował łatki dla każdego wpisu dziennika.

Widzieć

git help log

aby uzyskać więcej opcji - może faktycznie zrobić wiele fajnych rzeczy :) Aby uzyskać tylko różnicę dla określonego zatwierdzenia, możesz

git show HEAD 

lub jakakolwiek inna rewizja przez identyfikator. Albo użyj

gitk

przeglądać zmiany wizualnie.


1836
2017-11-10 15:56



git show HEAD pokazuje wszystkie pliki, czy wiesz, jak śledzić pojedynczy plik (o co prosił Richard)? - Jonas Byström
użyjesz: git show <revision> - nazwa pliku, który pokaże różnice dla tej wersji, na wypadek gdyby takowa istniała. - Marcos Oliveira
--stat jest również pomocny. Możesz użyć go razem z -p. - Raffi Khatchadourian
To jest świetne. gitk nie zachowuje się dobrze podczas określania ścieżek, które już nie istnieją. Użyłem git log -p - path. - Paulo Casaretto
Plus gitk wygląda na to, że został zbudowany przez potwora boogie. To jest świetna odpowiedź i najlepiej dostosowana do pierwotnego pytania. - ghayes


git log --follow -p -- file

To pokaże Cały historia pliku (w tym historia poza nazwami i różnicami dla każdej zmiany).

Innymi słowy, jeśli plik o nazwie bar został kiedyś nazwany foo, następnie git log -p bar (bez --follow opcja) wyświetli historię pliku tylko do momentu, w którym została zmieniona - nie będzie wyświetlać historii pliku, gdy był znany jako foo. Za pomocą git log --follow -p bar wyświetli całą historię pliku, w tym wszelkie zmiany w pliku, gdy był znany jako foo. The -p opcja zapewnia uwzględnienie różnic dla każdej zmiany.


1187
2018-03-30 23:25



--stat jest również pomocny. Możesz użyć go razem z -p. - Raffi Khatchadourian
Odpowiedź Dana jest jedyna prawdziwa! git log --follow -p file - zzeroo
Zgadzam się, że to jest PRAWDZIWA odpowiedź. (1.) --follow zapewnia, że ​​widzisz nazwy plików (2.) -p zapewnia, że ​​widzisz, jak zmienia się plik (3.) jest to tylko wiersz poleceń. - Trevor Boyd Smith
@Benjohn The -- opcja mówi Gitowi, że osiągnął koniec opcji i że wszystko, co następuje -- należy traktować jako argument. Dla git log to tylko robi różnicę, jeśli masz nazwę ścieżki zaczynającą się od a dziarskość. Załóżmy, że chcesz poznać historię pliku o niefortunnej nazwie "--follow": git log --follow -p -- --follow - Dan Moulding
@Bjojohn: Normalnie, -- jest przydatny, ponieważ może chronić przed każdym revision nazwy pasujące do wprowadzonej przez Ciebie nazwy pliku, co może być naprawdę przerażające. Na przykład: jeśli masz zarówno gałąź, jak i plik o nazwie foo, git log -p foo wyświetli historię rejestru git do foo, a nie historia dla plik  foo. Ale @DanMoulding ma rację, że od --follow polecenie przyjmuje tylko jedną nazwę pliku jako argument, jest to mniej konieczne, ponieważ nie może być a revision. Właśnie się tego nauczyłem. Być może miałeś rację, aby odrzucić to z twojej odpowiedzi; Nie jestem pewny. - NHDaly


Jeśli wolisz pozostać tekstowym, możesz użyć tig.

Szybka instalacja:

  • apt-get: # apt-get install tig 
  • Homebrew (OS X): $ brew install tig

Użyj go, aby wyświetlić historię w jednym pliku: tig [filename]
Lub przeglądaj szczegółową historię repozytoriów: tig

Podobny do gitk ale oparte na tekście. Obsługuje kolory w terminalu!


147
2018-06-07 10:23



Doskonałe narzędzie tekstowe, świetna odpowiedź. Zaskoczyło mnie, gdy zobaczyłem zależności do instalacji gitk na moim bezgłowym serwerze. Przebiłbym ponownie A +++ - Tom McKenzie
Możesz również spojrzeć na konkretne pliki z tigiem, np. tig -- path/to/specific/file - gloriphobia


git whatchanged -p filename jest również odpowiednikiem git log -p filename w tym przypadku.

Możesz także zobaczyć, kiedy określony wiersz kodu wewnątrz pliku został zmieniony git blame filename. Spowoduje to wydrukowanie krótkiego identyfikatora zatwierdzenia, autora, znacznika czasu i pełnej linii kodu dla każdej linii w pliku. Jest to bardzo przydatne po znalezieniu błędu i chcesz wiedzieć, kiedy został wprowadzony (lub kto jest winien).


102
2017-11-11 06:12



+1, ale filename nie jest opcjonalny w poleceniu git blame filename. - rockXrock
"Nowi użytkownicy są zachęcani do używania git-log zamiast. (...) Polecenie jest przechowywane głównie ze względów historycznych;" - ciastek


Użytkownicy SourceTree

Jeśli używasz SourceTree do wizualizacji swojego repozytorium (jest ono bezpłatne i całkiem dobre), możesz kliknąć plik prawym przyciskiem myszy i wybrać Log Selected

enter image description here

Wyświetlacz (poniżej) jest znacznie bardziej przyjazny niż gitk i większość innych wymienionych opcji. Niestety (w tej chwili) nie ma łatwego sposobu na uruchomienie tego widoku z wiersza poleceń - CLI SourceTree właśnie otwiera właśnie repozytorium.

enter image description here


92
2017-07-30 18:55



Szczególnie podoba mi się opcja "Śledź przemianowane pliki", która pozwala sprawdzić, czy plik został zmieniony lub przeniesiony. - Chris
ale jeśli się nie mylę (proszę dać mi znać!), można tylko porównać dwie wersje naraz w gui? Czy są klienci, którzy mają elegancki interfejs do porównywania kilku różnych wersji jednocześnie? Być może z powiększonym widokiem, jak w Sublime Text? Byłoby to bardzo przydatne, myślę. - Sam Lewallen
@SamLewallen Jeśli dobrze rozumiem, chcesz porównać trzy różne zatwierdzenia? Brzmi to podobnie do łączenia w trzech kierunkach (moje, twoje, baza) - zazwyczaj ta strategia jest używana do rozwiązywania konfliktów scalających niekoniecznie porównujących trzy arbitralne zatwierdzenia. Istnieje wiele narzędzi wspierających trójstronne scalanie stackoverflow.com/questions/10998728/... ale lewą jest karmienie tych narzędzi konkretnymi wersjami gitready.com/intermediate/2009/02/27/... - Mark Fox
Dzięki Mark Fox, o to mi chodzi. Czy znasz jakieś aplikacje, które to zrobią? - Sam Lewallen
Ratujesz moje życie. Możesz użyć gitk znaleźć SHA1 hash, a następnie otwórz SourceTree wejść Log Selected.. w oparciu o znalezione SHA1. - AechoLiu


Aby pokazać, co wersja i autor ostatniej modyfikacji każdego wiersza pliku:

git blame filename

lub jeśli chcesz korzystać z potężnego GUI:

git gui blame filename

57
2017-08-11 13:01





Podsumowanie innych odpowiedzi po przeczytaniu ich i odgadnięciu:

Zwykłe polecenie wiersza poleceń będzie

git log --follow --all -p dir/file.c

Ale możesz także użyć gitk (gui) lub tig (text-ui), aby nadać bardziej czytelny dla człowieka sposób patrzenia na to.

gitk --follow --all -p dir/file.c

tig --follow --all -p dir/file.c

W katalogu debian / ubuntu polecenie instalacji dla tych uroczych narzędzi jest zgodne z oczekiwaniami:

sudo apt-get install gitk tig

Obecnie używam:

alias gdf='gitk --follow --all -p'

więc mogę po prostu pisać gdf dir aby uzyskać skoncentrowaną historię wszystkiego w podkatalogu dir.


40
2017-12-05 18:38



Myślę, że to jest świetna odpowiedź. Być może ty też nie dostajesz głosu, ponieważ odpowiadasz na inne sposoby (IMHO lepiej), aby zobaczyć zmiany, np. Poprzez gitk i tig oprócz git. - PopcornKing
Wystarczy dodać do odpowiedzi. Zlokalizuj ścieżkę (w przestrzeni git, do której wciąż istnieje repozytorium). Następnie użyj polecenia określonego powyżej "git log - obserwuj - all -p <ścieżka_folderu / ścieżka_pliku>". Może się zdarzyć, że filde / folder zostałby usunięty z historii, dlatego zlokalizuj maksymalną ścieżkę, która wciąż istnieje i spróbuj pobrać jej historię. Prace ! - parasrish
--all jest dla wszystkich gałęzi, reszta jest wyjaśniona w odpowiedzi @ Dana - cregox


Dodaj ten alias do pliku .gitconfig:

[alias]
    lg = log --all --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset'\n--abbrev-commit --date=relative

I użyj polecenia w ten sposób:

> git lg
> git lg -- filename

Wyjście będzie wyglądało prawie dokładnie tak samo jak wyjście Gitk. Cieszyć się.


22
2018-06-26 20:12



Po uruchomieniu skrótu Lg powiedziałem (i cytuję) "Beautiful!". Należy jednak zauważyć, że "\ n" po "--graph" jest błędem. - jmbeck
Może być również używany git lg -p filename - zwraca piękną różnicę przeszukiwanych plików. - Egel


napisałem git-playback w tym celu

pip install git-playback
git playback [filename]

Ma to tę zaletę, że oba wyświetlają wyniki w wierszu poleceń (np git log -p), jednocześnie pozwalając ci przechodzić przez każde zatwierdzenie za pomocą klawiszy strzałek (np gitk).


14
2017-11-19 06:25