J'ai lu des articles disant que git bisect
c'est génial. Cependant, je ne suis pas natif et je ne comprends pas pourquoi c'est génial.
Quelqu'un pourrait-il démontrer avec un exemple de code:
- Comment l'utiliser?
- Est-ce juste comme ça
svn blame
?
git
git-bisect
IAdapter
la source
la source
Réponses:
L'idée derrière
git bisect
est d'effectuer une recherche binaire dans l'histoire pour trouver une régression particulière. Imaginez que vous ayez l'historique de développement suivant:Vous savez que votre programme ne fonctionne pas correctement lors de la
current
révision et qu'il fonctionnait lors de la révision0
. Ainsi , la régression a probablement été introduite dans l' un des commits1
,2
,3
,4
,5
,current
.Vous pouvez essayer de vérifier chaque commit, de le construire, de vérifier si la régression est présente ou non. S'il y a un grand nombre de validations, cela peut prendre du temps. Il s'agit d'une recherche linéaire. Nous pouvons faire mieux en faisant une recherche binaire. C'est ce que fait la
git bisect
commande. À chaque étape, il essaie de réduire de moitié le nombre de révisions potentiellement mauvaises.Vous utiliserez la commande comme ceci:
Après cette commande,
git
va extraire un commit. Dans notre cas, ce sera commit3
. Vous devez créer votre programme et vérifier si la régression est présente ou non. Vous devrez également indiquergit
l'état de cette révision avecgit bisect bad
si la régression est présente ougit bisect good
si elle ne l'est pas.Supposons que la régression ait été introduite dans commit
4
. Ensuite, la régression n'est pas présente dans cette révision, et nous le lui disonsgit
.Il extraira ensuite un autre commit. Soit
4
ou5
(car il n'y a que deux commits). Supposons qu'il ait choisi5
. Après une construction, nous testons le programme et voyons que la régression est présente. Nous lui disons ensuitegit
:Nous testons la dernière révision,
4
. Et puisque c'est celui qui a introduit la régression, on lui ditgit
:Dans cette situation simple, nous ne devions tester 3 versions (
3
,4
,5
) au lieu de 4 (1
,2
,3
,4
). C'est une petite victoire, mais c'est parce que notre histoire est si petite. Si la plage de recherche est de N validations, nous devrions nous attendre à tester 1 + log2 N validations avecgit bisect
au lieu de grossièrement N / 2 validations avec une recherche linéaire.Une fois que vous avez trouvé le commit qui a introduit la régression, vous pouvez l'étudier pour trouver le problème. Une fois cela fait, vous utilisez
git bisect reset
pour tout remettre à l'état d'origine avant d'utiliser lagit bisect
commande.la source
git bisect bad <rev> [<rev>...]
pour marquer des révisions spécifiques comme mauvaises (ou bonnes avecgit bisect good <rev> [<rev>...]
).rev
peut être n'importe quel identifiant de révision comme un nom de branche, une balise, un hachage de validation (ou un préfixe unique de hachage de validation), ...git bisect reset
pour tout remettre sur le commit récentgit bisect run
bissect automatiqueSi vous avez un
./test
script automatisé qui a le statut de sortie 0 si le test est OK, vous pouvez trouver automatiquement le bogue avecbisect run
:Cela suppose bien sûr que si le script de test
./test
est git tracké, il ne disparaît pas lors d'une validation antérieure lors de la bissection.J'ai constaté que très souvent, vous pouvez vous en sortir en copiant simplement le script dans l'arborescence de l'arborescence, et éventuellement en jouant avec des
PATH
variables de type similaire, et en l'exécutant à partir de là.Bien sûr, si l'infrastructure de test sur laquelle
test
dépend dépend des validations plus anciennes, alors il n'y a pas de solution, et vous devrez faire les choses manuellement, en décidant comment tester les validations une par une.J'ai trouvé cependant que l'utilisation de cette automatisation fonctionne souvent et peut être un énorme gain de temps pour les tests plus lents se trouvant dans votre carnet de tâches, où vous pouvez simplement le laisser fonctionner pendant la nuit, et éventuellement avoir votre bug identifié le lendemain matin, cela vaut la peine l'essayer.
Plus de conseils
Restez sur le premier commit échoué après la bissect au lieu de revenir à
master
:start
+ initialebad
etgood
en une seule fois:est le même que:
Voir ce qui a été testé jusqu'à présent (par manuel
good
etbad
ourun
):Exemple de sortie:
Afficher les bonnes et les mauvaises références sur git log pour avoir une meilleure idée du temps:
Cela ne montre que les validations avec une référence correspondante, ce qui réduit considérablement le bruit, mais inclut les références générées automatiquement de type:
qui nous disent quels engagements nous avons marqués comme bons ou mauvais.
Considérez ce repo de test si vous voulez jouer avec la commande.
L'échec est rapide, le succès est lent
Quelquefois:
Pour ces cas, par exemple en supposant que l'échec se produit toujours avec 5 secondes, et si nous sommes paresseux pour rendre le test plus spécifique comme nous le devrions vraiment, nous pouvons utiliser
timeout
comme dans:Cela fonctionne depuis les
timeout
sorties124
tandis que l'échec destest-command
sorties1
.Statuts de sortie magique
git bisect run
est un peu pointilleux sur les états de sortie:tout ce qui est supérieur à 127 fait échouer la bissection avec quelque chose comme:
En particulier, un C
assert(0)
mène à unSIGABRT
et sort avec le statut 134, très ennuyeux.125 est magique et permet de sauter la course
git bisect skip
.L'intention est d'aider à ignorer les versions cassées pour des raisons indépendantes.
Voir
man git-bisect
pour les détails.Donc, vous voudrez peut-être utiliser quelque chose comme:
Testé sur git 2.16.1.
la source
test_script
suite de tests bien conçue + modulaire, et exécutez-le à partir du fichier séparé tout en bissectant. Lorsque vous corrigez, fusionnez le test dans la suite de tests principale.bisect run
particulièrement utile lorsque le test prend beaucoup de temps pour se terminer, et je suis presque sûr que le système de test ne cassera pas. De cette façon, je peux simplement le laisser fonctionner en arrière-plan, ou du jour au lendemain s'il prend trop de ressources, sans perdre de temps de changement de contexte cérébral.TL; DR
Début:
Bisecting: X revisions left to test after this (roughly Y steps)
Répéter:
Le problème existe toujours?
$ git bisect bad
$ git bisect good
Résultat:
Lorsque vous avez terminé:
la source
git bisect good
pour passer au prochain commit.Juste pour ajouter un autre point:
Nous pouvons spécifier un nom de fichier ou un chemin d'accès au
git bisect start
cas où nous saurions que le bogue provient de fichiers particuliers. Par exemple, supposons que nous savions que les modifications qui ont provoqué la régression se trouvaient dans le répertoire com / workingDir, alors nous pouvons exécutergit bisect start com/workingDir
Cela signifie que seuls les validations qui ont changé le contenu de ce répertoire seront vérifiées, ce qui rend les choses encore plus rapides.De plus, s'il est difficile de dire si un commit particulier est bon ou mauvais, vous pouvez l'exécuter
git bisect skip
, ce qui l'ignorera. Étant donné qu'il y a suffisamment d'autres validations, git bisect en utilisera une autre pour affiner la recherche.la source
$ git bisect ..
basiquement, un outil Git pour le débogage . 'Git Bisect' débogue en passant par les commits précédents depuis votre dernière (connue) de commit. Il utilise la recherche binaire pour parcourir tous ces commits, pour arriver à celui qui a introduit la régression / bug.$ git bisect start
# Démarrage de la bissect$ git bisect bad
# indiquant que le commit actuel (v1.5) a le point de régression / réglage «mauvais»$ git bisect good v1.0
# en mentionnant le dernier bon commit de travail (sans régression)Cette mention des points «mauvais» et «bons» aidera git bisect (recherche binaire) à choisir l'élément central (commit v1.3). Si la régression est là lors de la validation v1.3, vous la définirez comme le nouveau «mauvais» point, c'est-à-dire ( Bon -> v1.0 et Mauvais -> v1.3 )
ou de même si la validation v1.3 est exempte de bogues, vous la définissez comme le nouveau «bon point», c'est-à-dire (* bon -> v1.3 et mauvais -> v1.6).
la source
Remarque: les termes
good
etbad
ne sont pas les seuls que vous pouvez utiliser pour marquer un commit avec ou sans certaine propriété.Git 2.7 (Q4 2015) a introduit de nouvelles
git bisect
options.Avec la documentation ajoutant:
Voir commit 06e6a74 , commit 21b55e3 , commit fe67687 (29 juin 2015) par Matthieu Moy (
moy
) .Voir commit 21e5cfd (29 juin 2015) par Antoine Delaite (
CanardChouChinois
) .(Fusionné par Junio C Hamano -
gitster
- en commit 22dd6eb , 05 oct.2015 )la source