Comment rechercher un référentiel Git par message de validation?

828

J'ai vérifié du code source dans GIT avec le message de validation "Build 0051".

Cependant, je n'arrive plus à trouver ce code source - comment puis-je extraire cette source du référentiel GIT, en utilisant la ligne de commande?

Mise à jour

  1. Vérifié dans les versions 0043, 0044, 0045 et 0046 à l'aide de SmartGIT.
  2. Récupéré 0043 et archivé dans les versions jusqu'à 0051 sur une autre branche.
  3. Vérifié à nouveau 0043.
  4. Maintenant, 0051 a disparu.

Mise à jour

Le code source est définitivement là, maintenant il s'agit de le vérifier:

C:\Source>git log -g --grep="0052"
commit 77b1f718d19e5cf46e2fab8405a9a0859c9c2889
Reflog: HEAD@{10} (unknown <Mike@.(none)>)
Reflog message: commit: 20110819 - 1724 - GL: Intermediate version. File version:  v0.5.0 build 0052.
Author: unknown <Mike@.(none)>
Date:   Fri Aug 19 17:24:51 2011 +0100

    20110819 - 1724 - GL: Intermediate version. File version: v0.5.0 build 0052.

C:\Source>
Contango
la source
2
Les réponses n'appartiennent pas aux questions sur Stack Overflow. Vous contribuez depuis assez longtemps pour que vous le sachiez. Si vous souhaitez répondre à votre propre question, vous êtes certainement le bienvenu . Alternativement, vous pouvez modifier la réponse de Shelhamer pour l'améliorer / l'étendre.
Cody Gray
1
@Cody Je me réfère à ce poste de temps en temps. Vous ne pouvez pas simplement supprimer du texte au hasard, ce n'est pas du cricket. Si vous souhaitez le supprimer, vous êtes certainement le bienvenu pour le déplacer dans votre propre réponse (et vous pourriez même obtenir quelques votes positifs pour cela - vous avez été un contributeur assez longtemps pour savoir comment cela fonctionne).
Contango

Réponses:

1284

Pour rechercher dans le journal de validation (dans toutes les branches) le texte donné:

git log --all --grep='Build 0051'

Pour rechercher le contenu réel des validations dans l'historique d'un dépôt, utilisez:

git grep 'Build 0051' $(git rev-list --all)

pour afficher toutes les instances du texte donné, le nom du fichier contenant et le commit sha1.

Enfin, en dernier recours, si votre commit est suspendu et n'est pas du tout connecté à l'historique, vous pouvez rechercher le reflog lui-même avec le -gdrapeau (abréviation de --walk-reflogs:

git log -g --grep='Build 0051'

EDIT: si vous semblez avoir perdu votre historique, vérifiez le reflogcomme votre filet de sécurité. Recherchez Build 0051 dans l'un des commits répertoriés par

git reflog

Vous avez peut-être simplement défini votre HEADdans une partie de l'historique dans laquelle le commit 'Build 0051' n'est pas visible, ou vous l'avez peut-être effacé. L' article de reflog git-ready peut être utile.

Pour récupérer votre commit à partir du reflog : effectuez une vérification git du commit que vous avez trouvé (et éventuellement créez une nouvelle branche ou une nouvelle balise pour référence)

git checkout 77b1f718d19e5cf46e2fab8405a9a0859c9c2889
# alternative, using reflog (see git-ready link provided)
# git checkout HEAD@{10}
git checkout -b build_0051 # make a new branch with the build_0051 as the tip
Shelhamer
la source
2
avec git grep 'Build 0051' $ (git rev-list --all) I get sh.exe ": / bin / git: Un mauvais numéro de fichier a peut-être changé la façon de procéder?
Jens Schauder
7
git log -i -grep
jhvaras
@JensSchauder Si vous rencontrez une erreur avec git grep 'search' $(git rev-list --all), essayezgit rev-list --all | xargs git grep 'search'
afilina
83

Je mets ceci dans mon ~ / .gitconfig:

[alias]
    find = log --pretty=\"format:%Cgreen%H %Cblue%s\" --name-status --grep

Ensuite, je peux taper "git find string" et j'obtiens une liste de tous les commits contenant cette chaîne dans le message. Par exemple, pour trouver toutes les validations référençant le ticket # 33:

029a641667d6d92e16deccae7ebdeef792d8336b Added isAttachmentEditable() and isAttachmentViewable() methods. (references #33)
M       library/Dbs/Db/Row/Login.php

a1bccdcd29ed29573d2fb799e2a564b5419af2e2 Add permissions checks for attachments of custom strategies. (references #33).
M       application/controllers/AttachmentController.php

38c8db557e5ec0963a7292aef0220ad1088f518d Fix permissions. (references #33)
M       application/views/scripts/attachment/_row.phtml

041db110859e7259caeffd3fed7a3d7b18a3d564 Fix permissions. (references #33)
M       application/views/scripts/attachment/index.phtml

388df3b4faae50f8a8d8beb85750dd0aa67736ed Added getStrategy() method. (references #33)
M       library/Dbs/Db/Row/Attachment.php
Alex Howansky
la source
1
Sympa, mais il manque peut-être une réinitialisation des couleurs? --pretty=\"format:%Cgreen%H %Cblue%s%Creset\"
Ashley Coolman
4
Je préfère imprimer le message complet git (grep peut y être arrivé, pas dans le titre), donc j'ai fini avec: find = log --all --pretty=\"format:%Cgreen%H %Cblue%s\n%b%Creset\" --name-status --grep. Notez les caractères --allet %b. Thx @AshleyCoolman pour la resetpointe.
arcol
Merci. J'ai trouvé l'alias très utile. Je n'ai pas aimé la coloration et j'ai trouvé le format en ligne parfait pour cela. L'ajout de -i pour le rendre insensible à la casse a été utile. par exemplefind = log --oneline --name-status -i --grep
robbp
39

Bien qu'un peu en retard, il existe une :/notation dédiée pour spécifier une validation (ou révision) basée sur le message de validation, il suffit de préfixer la chaîne de recherche avec :/, par exemple:

git show :/message

Voici <message>un modèle d'expression rationnelle complexe composé d'espaces blancs, alors assurez-vous de citer / échapper si nécessaire, par exemple:

git log -1 -p ":/a few words"

Alternativement, un point de départ peut être spécifié, pour trouver la validation la plus proche accessible à partir d'un point spécifique, par exemple:

git show 'HEAD^{/fix nasty bug}'

Voir: git revisions manual .

ryenus
la source
23
git log --grep=<pattern>
            Limit the commits output to ones with log message that matches the
            specified pattern (regular expression).
Josh Lee
la source
19
git log --grep="Build 0051"

devrait faire l'affaire

Noufal Ibrahim
la source
1
Je dois utiliser des guillemets doubles (") au lieu de guillemets simples (').
frage
9

Essaye ça!

git log | grep -b3 "Build 0051"
Nic
la source
Merci - mais ce n'est pas le trouver. Comment rechercher dans toutes les succursales possibles?
Contango
6
Vous souhaitez utiliser à la git grepplace de grep normal et fournir l' --allindicateur pour rechercher plusieurs branches.
shelhamer
Hmm - les autres réponses le trouvent-elles non plus? Sinon, vous pourriez avoir un plus gros problème. J'essaierais git log --all --grep='Build 0051'(@ réponse de Shelhamer)
Nic
J'ai essayé "git log --all", et il ne répertorie que les versions 0046. La version 0051 était sur une branche différente. Je suis revenu à 0043 et 0051 a disparu.
Contango
3
@Gravitas, essayez mon exemple qui utilise le reflog: celui avec git log -g. Vous avez peut-être perdu l'historique dans une réinitialisation, mais vous pouvez toujours vérifier le reflog s'il n'a pas été récupéré.
shelhamer
4

première utilisation git log --onelinepour trouver le SHA du commit (Message), puis j'ai utilisé git log --stat 8zad24davec le SHA (le premier exemple de couple sha char (8zad24d)) pour trouver la bonne info

Ridha Rezzag
la source
1

Cette:

git log --oneline --grep='Searched phrase'

ou ca:

git log --oneline --name-status --grep='Searched phrase'

les commandes fonctionnent le mieux pour moi.

simhumileco
la source
1

Pour rechercher dans toutes les branches

git log --all --grep='Build 0051'

Une fois que vous savez à quel engagement vous souhaitez vous rendre

git checkout <the commit hash>
Samarth S
la source
1

Si le changement n'est pas trop ancien, vous pouvez le faire,

git reflog

puis extraire l'ID de validation

joseph
la source