J'ai un dépôt Git avec n commits.
J'ai un fichier dont j'ai besoin, qui se trouvait dans le référentiel, et que je cherche soudainement et pense "Oh! Où est passé ce fichier?"
Existe-t-il une (série de) commande (s) Git qui me dira que "le fichier really_needed.txt a été supprimé lors de la validation n-13"?
En d'autres termes, sans regarder chaque commit individuel et sachant que mon dépôt Git a chaque changement de chaque fichier, puis-je trouver rapidement le dernier commit qui a ce fichier, donc je peux le récupérer?
Réponses:
git log --full-history -- [file path]
montre les modifications d'un fichier, fonctionne même si le fichier a été supprimé.Exemple:
Si vous souhaitez voir uniquement le dernier commit, qui a supprimé un fichier, utilisez -1 en plus, par exemple,
git log --full-history -1 -- [file path]
Voir quel commit a supprimé un fichier
la source
git log -- */<<filename>>.<<file extension>>
ne connaissant pas le chemin d'accès complet au fichier.Réponse courte:
vous montrera toutes les validations de l'historique de votre dépôt, y compris les validations de fusion, qui ont touché
your_file
. Le dernier (en haut) est celui qui a supprimé le fichier.Quelques explications:
Le
--full-history
drapeau ici est important. Sans cela, Git effectue une "simplification de l'historique" lorsque vous lui demandez le journal d'un fichier. Les documents sont légers sur les détails de la façon dont cela fonctionne et je n'ai pas le courage et le courage nécessaires pour essayer de le comprendre à partir du code source, mais les documents git-log ont beaucoup à dire:Cela concerne évidemment le moment où le fichier dont nous voulons l'historique est supprimé , car l'historique le plus simple expliquant l'état final d'un fichier supprimé n'est pas un historique . Y a-t-il un risque que
git log
sans--full-history
vouloir simplement prétendre que le fichier n'a jamais été créé? Malheureusement oui. Voici une démonstration:Remarquez comment
git log -- bar
le vidage de terminal ci-dessus n'a entraîné littéralement aucune sortie; Git "simplifie" l'histoire en une fiction quibar
n'a jamais existé.git log --full-history -- bar
, d'autre part, nous donne le commit qui a créébar
et le commit qui l'a supprimé.Pour être clair: cette question n'est pas seulement théorique. J'ai seulement regardé les documents et découvert le
--full-history
drapeau parce quegit log -- some_file
j'échouais dans un vrai référentiel où j'essayais de retrouver un fichier supprimé. La simplification de l'historique peut parfois être utile lorsque vous essayez de comprendre comment un fichier existant est devenu dans son état actuel, mais lorsque vous essayez de retrouver une suppression de fichier, il est plus probable qu'il vous dérange en masquant la validation qui vous intéresse . Utilisez toujours l'--full-history
indicateur pour ce cas d'utilisation.la source
git log
sortie elle-même, il n'est pas du tout évident que le dernier commit a supprimé le fichier. J'ai également essayégit log --name-status --full-history -- file_name
etgit log -p --stat --full-history -- file_name
, mais ni l'un ni l'autre n'indique explicitement que le fichier a été supprimé lors de la dernière validation. Cela semble être un bug.mkdir somedir && cd somedir && git init && touch foo && git add foo && git commit -m "Added foo" && git checkout -b newbranch && touch bar && git add bar && git commit -m "Added bar" && git checkout master && git rm foo && git commit -m "Deleted foo" && git checkout newbranch && git rm bar && git commit -m "Deleted bar" && git checkout master && git merge newbranch && git log --name-status --full-history -- bar
inclutD bar
etA bar
pour moi dans la sortie du journal avec Git 2.12.2. Ne voyez-vous pas ces lignes dans la sortie? Quelle version avez-vous?git version 2.15.1
Oui, votre séquence de commandes rend compteD bar
etA bar
. Peut-être que mon problème est particulier à l'historique de mon dossier. Je.htaccess
traçais l'historique d'un fichier qui a été gitignoré et supprimé. J'ai finalement compris cela et j'ai rajouté le fichier. Lorsque j'inclus--name-status
dans lagit log
commande, je vois deuxA .htaccess
entrées (depuis que je l'ai ajouté dans le dernier commit) mais nonD .htaccess
. Il semble donc que dans certains cas, même si un fichier a été supprimé du référentiel,git log
il ne présentera pas d'D file_name
entrée explicite ..htaccess
ajout dans un commit X mais non inclus dans le commit de fusion qui a amené X sur master? C'est la seule chose à laquelle je peux penser que je pourrais peut-être affirmer devrait ressembler à un fichier ayant été ajouté et jamais supprimé et pourtant toujours pas présent. Il serait intéressant d'essayer de comprendre un MCVE, puis de déterminer s'il s'agit d'un bogue Git, et sinon, s'il est possible de modifier ma réponse pour gérer votre cas.Journal Git mais vous devez préfixer le chemin avec
--
Par exemple:
la source
Je viens d'ajouter une solution ici (existe-t-il un moyen dans git de répertorier tous les fichiers supprimés dans le référentiel?) Pour trouver les validations des fichiers supprimés à l'aide d'une expression rationnelle:
Cela renvoie tout ce qui a été supprimé dans un répertoire nommé
some_dir
(en cascade). Tout regexp sed là où il\/some_dir\/
est fera l'affaire.OSX (merci à @triplee et @keif)
la source
sed: 1: "/^commit/h;/\/some_dir\ ...": bad flag in substitute command: '}'
sed
n'est apparemment pas toujours bon avec des points-virgules comme séparateurs de commandes. Essayez de les changer en nouvelles lignes, ou passez àsed -n -e '/^commit/h' -e '\:/some_dir/:{' -e G -e 's/\ncommit \(.*\)/ \1/gp' -e }
git log --diff-filter=D --summary | sed -n -e '/^commit/h' -e '\:/:{' -e G -e 's/\ncommit \(.*\)/ \1/gp' -e }
travaillé pour moi sur OSX.Vous pouvez trouver le dernier commit qui a supprimé le fichier comme suit:
De plus amples informations sont disponibles ici
la source
Essayer:
la source