Mam repozytorium Git i chciałbym zobaczyć, jak wyglądały niektóre pliki kilka miesięcy temu. Znalazłem rewizję w tym dniu; to jest 27cf8e84bb88e24ae4b4b3df2b77aab91a3735d8
. Muszę zobaczyć, jak wygląda jeden plik, a także zapisać go jako („nowy”) plik.
Udało mi się zobaczyć plik przy użyciu gitk
, ale nie ma opcji, aby go zapisać. Próbowałem z narzędziami wiersza poleceń, najbliższe było:
git-show 27cf8e84bb88e24ae4b4b3df2b77aab91a3735d8 my_file.txt
To polecenie pokazuje jednak różnicę, a nie zawartość pliku. Wiem, że mogę później użyć czegoś takiego PAGER=cat
i przekierować dane wyjściowe do pliku, ale nie wiem, jak uzyskać dostęp do rzeczywistej zawartości pliku.
Zasadniczo szukam czegoś takiego jak svn cat .
git
single-file
Milan Babuškov
źródło
źródło
git show
(nieprzydatnie) używa innej składni z dwukropkiem.git show 2c7cf:my_file.txt
>
Odpowiedzi:
Aby uzupełnić własną odpowiedź, składnia jest rzeczywiście
Polecenie przyjmuje zwykły styl zmiany, co oznacza, że możesz użyć dowolnej z następujących opcji:
HEAD
+ x liczba^
znakówWskazówka Ważne jest, aby pamiętać, że używając „
git show
”, zawsze określ ścieżkę z katalogu głównego repozytorium , a nie bieżącą pozycję katalogu.(Chociaż Mike Morearty wspomina, że przynajmniej w git 1.7.5.4 można określić ścieżkę względną, umieszczając „
./
” na początku ścieżki - na przykład:)
W Git 2.23+ (sierpień 2019 r.) Możesz także użyć,
git restore
który zastępuje mylącegit checkout
polecenieSpowodowałoby to przywrócenie w działającym drzewie tylko pliku obecnego w zatwierdzeniu SHA1 lub gałęzi „source” (
-s
)somebranch
.Aby przywrócić również indeks:
(
-SW
: skrót od--staged --worktree
)Przed git1.5.x zrobiono to z pewną instalacją:
git ls-tree <rev>
pokaż listę jednego lub więcej obiektów „obiektów blob” w zatwierdzeniu
git cat-file blob <file-SHA1>
cat plik, ponieważ został zatwierdzony w ramach określonej wersji (podobnie jak svn cat). użyj git ls-tree, aby pobrać wartość danego pliku-sha1
git-ls-tree wyświetla identyfikator obiektu dla pliku $ w wersji $ REV, jest on wycinany z danych wyjściowych i używany jako argument do pliku git-cat, który tak naprawdę powinien być nazwany git-cat-object, i po prostu zrzuca ten obiekt na standardowe wyjście.
Uwaga: od wersji Git 2.11 (IV kwartał 2016 r.) Można zastosować filtr zawartości do danych
git cat-file
wyjściowych!Zobacz zatwierdzenie 3214594 , zatwierdzenie 7bcf341 (09 września 2016 r.), Zatwierdzenie 7bcf341 (09 września 2016 r.) I zatwierdzenie b9e62f6 , zatwierdzenie 16dcc29 (24 sierpnia 2016 r.) Przez Johannesa Schindelina (
dscho
) .(Połączone przez Junio C Hamano -
gitster
- w commit 7889ed2 , 21 września 2016)Uwaga: „
git cat-file --textconv
” zaczął segfaulting niedawno (2017), co zostało poprawione w Git 2.15 (IV kwartał 2017)Zobacz commit cc0ea7c (21 września 2017 r.) Autor: Jeff King (
peff
) .(Połączone przez Junio C Hamano -
gitster
- in commit bfbc2fc , 28 września 2017)Pamiętaj, że aby zastąpić / zastąpić plik z zawartością z przeszłości, nie powinieneś już używać mylącego
git checkout
polecenia , alegit restore
(Git 2.23+, sierpień 2019)Spowodowałoby to przywrócenie w działającym drzewie tylko pliku obecnego w
-s
zatwierdzeniu SHA1 „source” ( ).Aby przywrócić również indeks:
(
-SW
: skrót od--staged --worktree
)źródło
git show
zasadniczo zrzut zawartości nastdout
(standardowe wyjście), możesz po prostu przekierować to wyjście do dowolnego pliku, który chcesz ( tldp.org/LDP/abs/html/io-redirection.html ).git checkout [branch | revision] filepath
to właściwe poleceniegit checkout
by zastąpić plik o innej wersji, w przeciwieństwie dogit show
, który pozwala zapisać go pod inną nazwą, aby można dostać i zobaczyć zarówno (aktualną wersję i starą wersję). Pytanie, czy OP chce zastąpić obecną wersję starą, nie jest jasne .^^^
mogą być również bardziej ogólnie jako pisemnej~~~
lub lepiej~3
. Korzystanie z tyldy ma tę zaletę, że nie wyzwala dopasowywania nazw plików niektórych powłok (na przykład zsh).git rev-parse
obsługujerev:path
składnię? (W nowszym git możeszgit cat-file -p $REV:path
. Jednakgit show
działa również dla ścieżek katalogów, więc nie jest tylko krótszy, zwykle jest bliżej tego, czego się chce.)Jeśli chcesz zastąpić / zastąpić zawartość pliku w bieżącej gałęzi zawartością pliku z poprzedniego zatwierdzenia lub innej gałęzi, możesz to zrobić za pomocą następujących poleceń:
lub
Będziesz musiał zatwierdzić te zmiany, aby były skuteczne w bieżącym oddziale.
źródło
git show SHA1:PATH
rozwiązanie drukuje tylko na standardowe wyjście.git help checkout
. Musiałem sprawdzić podkatalog od określonej daty i stosując to podejście, mogłem uruchomić tę składnię:git checkout @{YYYY-MM-DD} sub-dir
Musisz podać pełną ścieżkę do pliku:
źródło
git show --name-only
, też wystarcząfull/repo/path/to
i spróbujesz:git show 27cf8e84:my_file.txt
otrzymasz nagrodę w postaci: fatal: ścieżka „pełna / repo / ścieżka / do / mój_plik.txt” istnieje, ale nie „mój_plik.txt” . Miałeś na myśli „27cf8e84: full / repo / path / to / my_file.txt” aka „27cf8e84: ./ my_file.txt”? To tak, jakby Git mógł pomóc bezpośrednio, ale postanowił być pedantyczny.Najprostszym sposobem jest napisać:
gdzie:
Przykład
Spowoduje to zapisanie my_file.txt z wersji 27cf8e jako nowego pliku o nazwie my_file.txt.OLD
Został przetestowany z Git 2.4.5.
Jeśli chcesz odzyskać usunięty plik, możesz go użyć
HASH~1
(jeden zatwierdzenie przed określonym HASH).PRZYKŁAD:
źródło
git log file/path/name.ext
W systemie Windows za pomocą Git Bash:
git show cab485c83b53d56846eb883babaaf4dff2f2cc46:./your_file.ext > old.ext
źródło
Aby ładnie zrzucić go do pliku (przynajmniej w systemie Windows) - Git Bash:
Że
"
potrzebne są cytaty tak zachowuje nowe linie.źródło
git show
składni, o której wspomniałem powyżej.Pomoże to uzyskać wszystkie usunięte pliki między zatwierdzeniami bez określania ścieżki, co jest przydatne, jeśli usunięto wiele plików.
źródło
to polecenie pobiera skopiowany plik z określonego zatwierdzenia.
źródło
Pobierz plik z poprzedniego zatwierdzenia poprzez pobranie poprzedniego zatwierdzenia i skopiowanie pliku.
git checkout 27cf8e84bb88e24ae4b4b3df2b77aab91a3735d8
git checkout theBranchYouNoted
git commit -m "added file ?? from previous commit"
źródło