Czy w Git jest polecenie, aby zobaczyć (zrzuconą na standardowe wyjście lub w $PAGER
lub $EDITOR
) określoną wersję określonego pliku?
git checkout <sha1-of-the-commit-you-need>
późniejgit checkout HEAD
Czy w Git jest polecenie, aby zobaczyć (zrzuconą na standardowe wyjście lub w $PAGER
lub $EDITOR
) określoną wersję określonego pliku?
git checkout <sha1-of-the-commit-you-need>
późniejgit checkout HEAD
Odpowiedzi:
Możesz użyć git show
ścieżki z katalogu głównego repozytorium ( ./
lub ../
względnej ścieżki ):
$ git show REVISION:path/to/file
Zastąp REVISION
aktualną wersją (może to być SHA zatwierdzenia Git, nazwa znacznika, nazwa gałęzi, względna nazwa zatwierdzenia lub inny sposób identyfikacji zatwierdzenia w Git)
Na przykład, aby wyświetlić wersję pliku <repository-root>/src/main.c
sprzed 4 zatwierdzeń, użyj:
$ git show HEAD~4:src/main.c
Git dla Windows wymaga ukośników nawet w ścieżkach względem bieżącego katalogu. Aby uzyskać więcej informacji, sprawdź stronę podręcznika dla git-show
.
Wykonanie tego według daty wygląda następująco:
git show HEAD@{2013-02-25}:./fileInCurrentDirectory.txt
Zauważ, że HEAD@{2013-02-25}
oznacza to „gdzie HEAD był w dniu 25.02.2013” w tym repozytorium (używając reflog ), a nie „ostatni zatwierdzenie przed 25.02.2013 w tej gałęzi w historii”.
master
zamiast HEAD@{2013-02-25}
, jeśli jesteś na gałęzi
git log --since='2016-04-28 23:59:59 +0100'
?
Jeśli lubisz GUI, możesz użyć gitk:
uruchom gitk za pomocą:
gitk /path/to/file
Wybierz wersję w górnej części ekranu, np. Według opisu lub daty. Domyślnie dolna część ekranu pokazuje różnicę dla tej wersji (odpowiadająca przyciskowi opcji „łatka”).
Aby zobaczyć plik dla wybranej wersji:
gitk REVISION /path/to/file
. Może się to przydać, gdy chcesz na przykład sprawdzić pewną wersję.
Możesz także określić commit hash
(często nazywany commit ID
) git show
poleceniem .
git show <commitHash>:/path/to/file
git log /path/to/file
commit hash
takie, jak commit 06c98...
(06c98 ... będący skrótem zatwierdzenia)commit hash
git show <commitHash>:/path/to/file
używając commit hash
kroku 3 i path/to/file
kroku 1.Uwaga: dodanie ./
przy określaniu ścieżki względnej wydaje się ważne, tj git show b2f8be577166577c59b55e11cfff1404baf63a84:./flight-simulation/src/main/components/nav-horiz.html
.
git show <SHA1> --name-only
aby ją zdobyć.
Oprócz Jim Hunziker „s odpowiedź
możesz wyeksportować plik z wersji jako,
git show HEAD@{2013-02-25}:./fileInCurrentDirectory.txt > old_fileInCurrentDirectory.txt
Mam nadzieję że to pomoże :)
Aby szybko zobaczyć różnice w starszych wersjach pliku:
git show -1 filename.txt
> aby porównać z ostatnią wersją pliku
git show -2 filename.txt
> aby porównać z 2. ostatnią wersją
git show -3 fielname.txt
> aby porównać z ostatnią trzecią ostatnią wersją
git log -p
pokaże ci nie tylko dzienniki zatwierdzeń, ale także różnicę każdego zatwierdzenia (z wyjątkiem zatwierdzeń scalania). Następnie możesz nacisnąć /
, wprowadzić nazwę pliku i nacisnąć enter
. Naciśnij n
lub, p
aby przejść do następnego / poprzedniego wystąpienia. W ten sposób zobaczysz nie tylko zmiany w pliku, ale także informacje o zatwierdzeniu.
git log -pm
że pokazywałby również zatwierdzenia scalania.
git log -p -- filename.txt
aby ograniczyć historię tylko do żądanego pliku.
Możesz użyć takiego skryptu, aby zrzucić wszystkie wersje pliku w celu oddzielenia plików:
na przykład
git_dump_all_versions_of_a_file.sh path/to/somefile.txt
Pobierz skrypt tutaj jako odpowiedź na kolejne podobne pytanie
git_root
, git_log_short
A git_log_message_for_commit
brakuje.
SPOSÓB 1: (Wolę w ten sposób)
git reflog
git diff-tree --no-commit-id --name-only -r <commitHash>
przykład:
git diff-tree --no-commit-id --name-only -r d2f9ba4
// „d2f9ba4” to identyfikator zatwierdzenia z „1.”
git show <commitHash>:/path/to/file
przykład:
git show d2f9ba4:Src/Ext/MoreSwiftUI/ListCustom.swift
// „Src / ...” to ścieżka do pliku z „2”
SPOSÓB 2:
git reflog
git reset --hard %commit ID%
git reset --hard c14809fa
Pomocnik, aby pobrać wiele plików z danej wersji
Podczas próby rozwiązania konfliktów scalania ten pomocnik jest bardzo przydatny:
#!/usr/bin/env python3
import argparse
import os
import subprocess
parser = argparse.ArgumentParser()
parser.add_argument('revision')
parser.add_argument('files', nargs='+')
args = parser.parse_args()
toplevel = subprocess.check_output(['git', 'rev-parse', '--show-toplevel']).rstrip().decode()
for path in args.files:
file_relative = os.path.relpath(os.path.abspath(path), toplevel)
base, ext = os.path.splitext(path)
new_path = base + '.old' + ext
with open(new_path, 'w') as f:
subprocess.call(['git', 'show', '{}:./{}'.format(args.revision, path)], stdout=f)
Stosowanie:
git-show-save other-branch file1.c path/to/file2.cpp
Wynik: poniższe zawierają alternatywne wersje plików:
file1.old.c
path/to/file2.old.cpp
W ten sposób zachowujesz rozszerzenie pliku, aby Twój edytor nie narzekał i mógł łatwo znaleźć stary plik tuż obok nowszego.