Je veux pouvoir trouver une certaine chaîne qui a été introduite dans n'importe quel commit dans n'importe quelle branche, comment faire? J'ai trouvé quelque chose (que j'ai modifié pour Win32), mais git whatchanged
ne semble pas regarder dans les différentes branches (ignorez le morceau py3k, c'est juste un correctif de flux de ligne msys / win)
git whatchanged -- <file> | \
grep "^commit " | \
python -c "exec(\"import sys,msvcrt,os\nmsvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)\nfor l in sys.stdin: print(l.split()[1])\")" | \
xargs -i% git show origin % -- <file>
Peu importe que votre solution soit lente.
Réponses:
Tu peux faire:
Pour trouver toutes les validations qui ont ajouté ou supprimé la chaîne fixe
whatever
. Le--all
paramètre signifie commencer à partir de chaque branche et--source
signifie montrer laquelle de ces branches a conduit à trouver ce commit. Il est souvent utile d'ajouter-p
pour montrer les correctifs que chacun de ces commits introduirait également.Les versions de git depuis 1.7.4 ont également une
-G
option similaire , qui prend une expression régulière . Cela a en fait une sémantique différente (et plutôt plus évidente), expliquée dans ce billet de blog de Junio Hamano .Comme le souligne thameera dans les commentaires, vous devez mettre des guillemets autour du terme de recherche s'il contient des espaces ou d'autres caractères spéciaux, par exemple:
Voici un exemple d'utilisation
-G
pour rechercher des occurrences defunction foo() {
:la source
--decorate
n'ajoute que le nom de la branche au commit à la pointe de chaque branche. En pratique, je n'utilise pas vraiment--source
ou--decorate
, et j'utilise plutôtgit branch -a --contains <commit-hash>
pour trouver quelles branches contiennent le commit qui m'intéresse.git log -S"dude, where's my car?" --source --all
. @ribamar a également écrit cela dans une réponse ci-dessous, mais cela pourrait facilement être ignoré à côté de cette première réponse.--reverse est également utile car vous voulez le premier commit qui a fait le changement:
De cette façon, les validations plus anciennes apparaîtront en premier.
la source
La réponse de Mark Longair est excellente, mais j'ai trouvé que cette version plus simple fonctionnait pour moi.
la source
HEAD
, mais cette question particulière posait spécifiquement sur la recherche dans toutes les branches d'un référentiel.Déconner avec les mêmes réponses:
Maintenant vous pouvez faire
ou
la source
Faites attention à ne pas utiliser d'espaces entre S et "string_to_search". Dans certaines configurations (git 1.7.1), vous obtiendrez une erreur comme:
la source
Bien que cela ne réponde pas directement à votre question, je pense que cela pourrait être une bonne solution pour vous à l'avenir. J'ai vu une partie de mon code, ce qui était mauvais. Je ne savais pas qui l'avait écrit ni quand. Je pouvais voir toutes les modifications du fichier, mais il était clair que le code avait été déplacé d'un autre fichier vers celui-ci. Je voulais savoir qui l'a ajouté en premier lieu.
Pour ce faire, j'ai utilisé Git bisect , qui m'a rapidement permis de trouver le pécheur.
J'ai couru
git bisect start
et puisgit bisect bad
, parce que la révision vérifiée avait le problème. Comme je ne savais pas quand le problème est survenu, je Ciblée la première commettras pour le « bon »,git bisect good <initial sha>
.Ensuite, j'ai continué à chercher dans le référentiel le mauvais code. Quand je l' ai trouvé, je courais
git bisect bad
, et quand il était pas là:git bisect good
.En ~ 11 étapes, j'avais couvert environ 1000 commits et trouvé le commit exact, où le problème a été introduit. Assez bien.
la source
Je ne sais pas pourquoi la réponse acceptée ne fonctionne pas dans mon environnement, enfin je lance la commande ci-dessous pour obtenir ce dont j'ai besoin
la source