2014-10-16 10 views
6

Co chcę jest coś takiego -
git checkout FHEAD~ path/filenameCzy istnieje skrót do poprzedniej wersji pliku w Git?

Co ja obecnie zrobić, to znaleźć poprzednią wersję pliku przez -
git log -1 --skip=1 path/filename

a następnie,
git checkout <previous-commit-hash> path/filename

+0

Co pytasz tutaj? Alias ​​do sprawdzania wersji pliku zapisanego w katalogu macierzystym 'HEAD'? Proszę o wyjaśnienie. – Jubobs

+0

Co to jest "FHEAD"? – Jubobs

+2

@Jubobs Pytanie wydaje mi się wystarczająco jasne: znajdź poprzednią wersję konkretnego pliku, gdzie "poprzedni" oznacza "sposób, w jaki był tuż przed ostatnim zatwierdzeniem, które zmieniło ten plik" (i ignorowanie innych zmian, które się nie zmieniają ten plik). – hvd

Odpowiedz

0

Trivial przykład alias do pobrania poprzedniej wersji pliku.

Sztuką jest, aby formatować dane wyjściowe dziennika z --format tylko powrócić hash popełnić

[alias] 
    prev = "!f(){ git checkout $(git log -1 --format="%H" --skip=1 -- ${GIT_PREFIX:-.}/$1) -- ${GIT_PREFIX:-.}/$1; git reset ${GIT_PREFIX:-}/$1; }; f" 

Zastosowanie git log -1 zapewnia git prev zawsze zwraca natychmiastowe pliku nadrzędnego. Wybór następnego rodzica może być bardziej złożony.

Należy również zauważyć, że plik, po wyewidencjonowaniu, jest natychmiast dodawany do indeksu. Nie jest scalony z istniejącą kopią i nie ostrzega o zastąpieniu lokalnych zmian. Zawarłem wezwanie do git-reset, aby upewnić się, że plik do realizacji transakcji znajduje się tylko w katalogu roboczym, a nie w indeksie.

Użycie opcji GIT_PREFIX umożliwia wprowadzanie ścieżek względnych, ale tylko stosunkowo nowe wersje git obsługują GIT_PREFIX.

edit ..

samo przy użyciu git REV-listy .. bardzo mocny polecenie git git przeznaczony dla przejeżdżające wykresy przodków kiedy skryptów i automatyzacji ...

[alias] 
    prev = "!f(){ git checkout $(git rev-list --max-count=1 --skip=1 HEAD -- ${GIT_PREFIX:-.}/$1) -- ${GIT_PREFIX:-.}/$1; git reset ${GIT_PREFIX:-}/$1; }; f" 
+1

Lub użyj 'rev-list' zamiast' log' dla skryptów! – knittl

+0

Pewnie, czemu nie. 'git rev-list --max-count = 1 --skip = 1 HEAD - $ {GIT_PREFIX: -.}/$ 1' może zastąpić dziennik git i wygenerować taki sam wynik. – Dave

Powiązane problemy