git-checkout starsza wersja pliku pod nową nazwą

264

Mam plik „ main.cpp” otwarty w moim edytorze.

Chcę też zobaczyć poprzednią wersję „ main.cpp” w edytorze.

Sposób, w jaki to teraz robię, jest taki.

close "main.cpp" in the editor

prompt> mv main.cpp tmp
prompt> git checkout HEAD^ main.cpp
prompt> mv main.cpp old_main.cpp
prompt> mv tmp main.cpp
prompt>

open "main.cpp" and "old_main.cpp" in the editor

Czy można to uprościć, więc nie muszę zamykać pliku „main.cpp” w edytorze?

Mam nadzieję, że jest to wariant, git-checkoutktóry może to zrobić.


AKTUALIZACJA: używam git na Mac OSX 10.5.7

prompt> git --version
git version 1.6.0.4
prompt> 

AKTUALIZACJA 2: Jakub Narębski odpowiedź brzmi:

prompt> git show HEAD^:dir1/dir2/dir3/main.cpp > old_main.cpp
prompt>

AKTUALIZACJA 3: Odpowiedź Karmiego, dla konkretnej wersji:

prompt> git show 4c274dd91dc:higgs/Higgs.xcodeproj/project.pbxproj > old_project.pbxproj
prompt> 
neoneye
źródło
Jakiego edytora używasz? Być może ma wtyczkę / dodatek / moduł dodający obsługę Git?
Jakub Narębski
Używam partnera tekstowego. Ma pewne wsparcie dla gita, choć nie sprawdziłem, czy da się to zrobić.
neoneye
Textmate ma pakiet git: github.com/timcharper/git-tmbundle (powinieneś sprawdzić stronę InterfacesFrontendsAndTools na git wiki: git.or.cz/gitwiki )
Jakub Narębski
Nawiasem mówiąc, interfejs VC w Emacsie (dla którego Git ma również wsparcie w postaci vc-git.el) ma polecenie „Pokaż inną wersję”. Jeśli pakiet TexMate Git (git-tmbundle) go nie ma, być może warto go dodać.
Jakub Narębski
Używam dowiązań symbolicznych do lepszego śledzenia mojego projektu w TextMate. 25 reż., 300 plików. Pomaga to ukryć katalogi build i inne nieistotne katalogi. Jednak git / TextMate nie jest zbyt zadowolony z tych dowiązań symbolicznych, więc nie :-(
neoneye

Odpowiedzi:

312

Możesz do tego użyć „git show”:

prompt> git show HEAD^:main.cpp > old_main.cpp

(Zwróć uwagę, że :pomiędzy HEAD^i main.cpp) <revision>:<path>jest znak dwukropka [ ] . Składnia jest opisana na stronie podręcznika git rev- pars, obok ostatniego punktu w sekcji „Określanie wersji”:

  • <rev>: <path>, np. HEAD: README,: README, master: ./ README

    Sufiks, :po którym następuje ścieżka, określa nazwę obiektu blob lub drzewa na podanej ścieżce w obiekcie drzewiastym nazwanym przez część przed dwukropkiem. :path(z pustą częścią przed dwukropkiem) jest szczególnym przypadkiem składni opisanej dalej: zawartość zapisana w indeksie na danej ścieżce.

    Ścieżka rozpoczynająca się od ./lub ../jest względna do bieżącego katalogu roboczego. Podana ścieżka zostanie przekonwertowana na względną do katalogu głównego drzewa roboczego. Jest to najbardziej przydatne do adresowania obiektu blob lub drzewa z zatwierdzenia lub drzewa, które ma taką samą strukturę drzewa jak drzewo robocze.

Zauważ, że <path>tutaj jest PEŁNA ścieżka względem górnego katalogu twojego projektu, tj. Katalogu z .git/katalogiem. (Lub ściślej mówiąc do „ <revision> ” (którym ogólnie może być dowolny <tree-ish> , tj. Coś, co reprezentuje drzewo))

Jeśli chcesz użyć ścieżki względem bieżącego katalogu, musisz użyć ./<path>składni (lub ../pathprzejść z bieżącego katalogu).

Edytuj 2015-01-15: dodano informacje o względnej składni ścieżki


W większości przypadków można uzyskać te same dane wyjściowe za pomocą polecenia niskiego poziomu (hydraulika) git cat-file:

prompt> git cat-file blob HEAD^:main.cpp > old_main.cpp
Jakub Narębski
źródło
3
Interesuje mnie pełna kopia, ale git-show pokazuje mi tylko różnice .. Próbowałem bawić się z opcją --pretty .. monit> git show --pretty = fuller HEAD ^ main.cpp, ale tak się nie stało nie rozwiązuj tego.
neoneye
7
„git show HEAD ^ main.cpp” (ze spacją między HEAD ^ a main.cpp) różni się od „git show HEAD ^: main.cpp” (z dwukropkiem „:” między HEAD ^ a main.cpp).
Jakub Narębski
Hmm, z okrężnicą widzę ten błąd, więc pomyślałem, że okrężnica była pomyłką. Tak, wydaje się, że dwukropek jest drogą, ale jak to rozwiązać? prompt> git show HEAD ^: main.cpp fatal: dwuznaczny argument 'HEAD ^: main.cpp': nieznana wersja lub ścieżka nie działa w drzewie roboczym. Użyj „-”, aby oddzielić ścieżki od monitu o poprawki>
neoneye
2
To prawdopodobnie oznacza, że ​​podałeś niewłaściwą PATHNAME (niestety z powodu „git show” magiczny git nie może dać lepszego komunikatu o błędzie). Powinna to być PEŁNA nazwa ścieżki względem głównego katalogu projektu: $ (git ls-tree -r - nazwa-tylko HEAD ^ | grep main.cpp)
Jakub Narębski
3
Zamiast pełnej ścieżki z dokumentów: „Ścieżka zaczynająca się od ./ lub ../ jest względna w stosunku do bieżącego katalogu roboczego.” Działa z moją wersją 1.8.5.
LVB
24

Wystarczy dodać do odpowiedzi Jakuba: nie musisz nawet przekierowywać wyjścia do pliku >, jeśli jesteś zainteresowany jedynie przeglądaniem zawartości pliku w terminalu. Możesz po prostu biec $ git show 58a3db6:path/to/your/file.txt.

karmi
źródło