Esiste un comando in Git per vedere (scaricato in stdout, o in $PAGER
o $EDITOR
) una versione particolare di un determinato file?
git checkout <sha1-of-the-commit-you-need>
dopo,git checkout HEAD
Esiste un comando in Git per vedere (scaricato in stdout, o in $PAGER
o $EDITOR
) una versione particolare di un determinato file?
git checkout <sha1-of-the-commit-you-need>
dopo,git checkout HEAD
Risposte:
Puoi usare git show
con un percorso dalla radice del repository ( ./
o ../
per il percorso relativo):
$ git show REVISION:path/to/file
Sostituisci REVISION
con la tua revisione effettiva (potrebbe essere un SHA di commit Git, un nome tag, un nome di ramo, un nome di commit relativo o qualsiasi altro modo di identificare un commit in Git)
Ad esempio, per visualizzare la versione del file <repository-root>/src/main.c
da 4 commit fa, usare:
$ git show HEAD~4:src/main.c
Git per Windows richiede barre rovesciate anche nei percorsi relativi alla directory corrente. Per maggiori informazioni, controlla la pagina man di git-show
.
Farlo per data è simile al seguente:
git show HEAD@{2013-02-25}:./fileInCurrentDirectory.txt
Si noti che HEAD@{2013-02-25}
significa "dove si trovava HEAD il 25-02-2013" in questo repository (usando il reflog ), non "l'ultimo commit prima del 25-02-2013 in questo ramo nella storia".
master
invece di HEAD@{2013-02-25}
, se sei su un ramo
git log --since='2016-04-28 23:59:59 +0100'
?
Se ti piacciono le GUI, puoi usare gitk:
inizia gitk con:
gitk /path/to/file
Scegli la revisione nella parte superiore dello schermo, ad es. Per descrizione o data. Per impostazione predefinita, la parte inferiore dello schermo mostra il diff per quella revisione, (corrispondente al pulsante di opzione "patch").
Per vedere il file per la revisione selezionata:
gitk REVISION /path/to/file
. Questo può tornare utile quando si desidera verificare, ad esempio, con una determinata versione.
Puoi anche specificare un commit hash
(spesso chiamato anche commit ID
) con il git show
comando .
git show <commitHash>:/path/to/file
git log /path/to/file
commit hash
come commit 06c98...
(06c98 ... essendo l'hash di commit)commit hash
git show <commitHash>:/path/to/file
utilizzando il commit hash
passaggio 3 e il path/to/file
passaggio 1.Nota: l' aggiunta di ./
quando si specifica un percorso relativo sembra importante, ad es git show b2f8be577166577c59b55e11cfff1404baf63a84:./flight-simulation/src/main/components/nav-horiz.html
.
git show <SHA1> --name-only
per ottenerlo.
Oltre alla risposta di Jim Hunziker ,
puoi esportare il file dalla revisione come,
git show HEAD@{2013-02-25}:./fileInCurrentDirectory.txt > old_fileInCurrentDirectory.txt
Spero che sia di aiuto :)
Per vedere rapidamente le differenze con le versioni precedenti di un file:
git show -1 filename.txt
> per confrontare con l'ultima revisione del file
git show -2 filename.txt
> per confrontare con la 2a ultima revisione
git show -3 fielname.txt
> per confrontare con l'ultima 3a ultima revisione
git log -p
ti mostrerà non solo i registri di commit ma anche il diff di ogni commit (tranne i commit di unione). Quindi è possibile premere /
, immettere il nome file e premere enter
. Premere n
o p
per passare all'occorrenza successiva / precedente. In questo modo non vedrai solo le modifiche nel file ma anche le informazioni di commit.
git log -pm
mostrerebbe anche i commit di unione.
git log -p -- filename.txt
per limitare la cronologia al solo file desiderato.
È possibile utilizzare uno script come questo per scaricare tutte le versioni di un file per separare i file:
per esempio
git_dump_all_versions_of_a_file.sh path/to/somefile.txt
Ottieni qui lo script come risposta a un'altra domanda simile
git_root
, git_log_short
E git_log_message_for_commit
mancano.
MODO 1: (preferisco così)
git reflog
git diff-tree --no-commit-id --name-only -r <commitHash>
esempio:
git diff-tree --no-commit-id --name-only -r d2f9ba4
// "d2f9ba4" è ID commit da "1"
git show <commitHash>:/path/to/file
esempio:
git show d2f9ba4:Src/Ext/MoreSwiftUI/ListCustom.swift
// "Src / ..." è il percorso del file da "2."
MODO 2:
git reflog
git reset --hard %commit ID%
git reset --hard c14809fa
Aiuto per recuperare più file da una data revisione
Quando si cerca di risolvere i conflitti di unione, questo aiuto è molto utile:
#!/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)
Uso:
git-show-save other-branch file1.c path/to/file2.cpp
Risultato: quanto segue contiene le versioni alternative dei file:
file1.old.c
path/to/file2.old.cpp
In questo modo, mantieni l'estensione del file in modo che il tuo editor non si lamenti e possa facilmente trovare il vecchio file proprio accanto a quello più recente.