2010-03-11 10 views
90

Kiedy uruchamiam "git pull", często chcę wiedzieć, co zmieniło się pomiędzy ostatnią wersją pliku a nową. Powiedz, że chcę wiedzieć, co ktoś inny zaangażował w konkretny plik.git: Jak zmienić zmienione pliki w porównaniu do poprzednich wersji po przeciągnięciu?

Jak to zrobić?

Zakładam, że jest to "git diff" z niektórymi parametrami dla commit x versus commit y, ale nie mogę uzyskać składni. Uważam też, że "git log" nieco myli i nie jestem pewien, skąd wziąć identyfikator zatwierdzenia mojej najnowszej wersji pliku w porównaniu z nową.

+1

Może się okazać, że narzędzie graficzne gitk będzie bardziej dopasowane do Twoich upodobań. – crazyscot

+0

http://stackoverflow.com/questions/61002/how-can-i-generate-a-git-diff-of-whats-changed-since-the-last-time-i-pulled może być podobny do tego – VonC

Odpowiedz

124

Istnieje wiele wspaniałych sposobów określania zatwierdzeń - więcej informacji można znaleźć w sekcji w sekcji man git-rev-parse. W tym przypadku, prawdopodobnie chcesz:

git diff [email protected]{1} 

The @{1} oznacza „poprzednią pozycję ref Mam określonej”, tak, że ocenia się co sprawdził się wcześniej - tuż przed pociągnięciem. Na końcu możesz umieścić na końcu HEAD, jeśli również masz jakieś zmiany w swoim drzewie pracy i nie chcesz widzieć różnic dla nich.

Nie jestem pewien, o co prosisz, używając "identyfikatora zatwierdzenia mojej najnowszej wersji pliku" - "identyfikator" zatwierdzenia (skrót SHA1) to 40-znakowy kod szesnastkowy znajdujący się u góry każdego wpis na wyjściu dziennika git. Jest to skrót dla całego zatwierdzenia, a nie dla danego pliku. Tak naprawdę nie kiedykolwiek potrzeba więcej - jeśli chcesz tylko jeden plik diff całej pull, zrobić

git diff [email protected]{1} filename 

Jest to ogólnie rzecz - jeśli chcesz wiedzieć o stanie pliku w danym popełnić , określasz zatwierdzenie i plik, a nie identyfikator/hash właściwy dla pliku.

+0

Połączony poprzedni post z VonC mówi w zasadzie to samo, ale wyjaśnienie jest nieco inne, więc na razie opuścimy to. (Używa również '@ {1}' jako skrótu dla 'HEAD @ {1}') – Cascabel

+0

prawda, ale podoba mi się także wyjaśnienie. +1 – VonC

+0

Dokładnie tego szukałem. Dziękuję za wyjaśnienie. – lucapette

11

Jeśli zrobisz prostą git pull, to albo "szybko przekazujesz dalej", albo scalisz nieznaną liczbę zatwierdzeń ze zdalnego repozytorium. Zdarza się to jednak jako jedna akcja, więc ostatnie zatwierdzenie, które byłeś tuż przed przeciągnięciem, będzie ostatnim wpisem w reflogu i będzie dostępne jako [email protected]{1}. Oznacza to, że można zrobić:

git diff [email protected]{1} 

jednak gorąco polecam, że jeśli jest to coś znajdziesz się robić dużo to należy rozważyć po prostu robi git fetch i badanie pobranego oddział przed ręcznego łączenia lub przebazowania na to. Na przykład. jeśli jesteś na mistrza i jechaliśmy wciągnąć pochodzenia/Master:

git fetch 

git log HEAD..origin/master 

# looks good, lets merge 

git merge origin/master 
+0

Przyjemne użycie 'git log' zamiast' git diff' tutaj (nawet jeśli składnia jest nieco niespójna między ".." dla 'git log' i' ... 'dla 'git diff';) + 1 Zobacz http://stackoverflow.com/questions/53569/how-to-get-the-changes-on-a-branch-in-git/53573#53573 i http://stackoverflow.com/questions/850607/ differe-in-git-log-origin-master-vs-git-log-origin-master/850695 # 850695 – VonC

+0

Na szczęście, jeśli używasz składni ".." w git gff git "robi to, co trzeba". –

42

lubię używać:

git diff HEAD^ 

Lub jeśli chcę tylko diff konkretny plik:

git diff HEAD^ -- /foo/bar/baz.txt 
+3

-1: 'HEAD ^' jest nadrzędnym zatwierdzeniem, a nie zatwierdzeniem przed 'pull' – CharlesB

+0

Jeśli' HEAD' jest zatwierdzeniem scalenia, 'HEAD ^' jest pierwszym nadrzędnym zatwierdzeniem, więc tak, może to być commit przed 'pull'. Aby uzyskać drugiego rodzica (w przypadku scalania dwukierunkowego), użyj 'HEAD^2'. Ale potem powyższa odpowiedź w zasadzie nie odpowiada na pytanie, więc opuszczenie -1 ;-) –

+0

Dzięki za wyjaśnienia. Nie bardzo dokładnie przeczytałem to pytanie, ponieważ szukałem czegoś innego, a ten link znalazł się wysoko na stronie wyników. Myślałem, że zadzwonię, ponieważ jestem nowym użytkownikiem i nie mam żadnej karmy (jeśli tak to się nazywa na SO). Moja wina =) – cadizm

Powiązane problemy