web-dev-qa-db-fra.com

Comment pourrais-je utiliser git bisect pour trouver le premier bon commit?

J'ai le problème suivant:

  • la version à master fonctionne bien
  • la version de la dernière balise avant master (disons last) a un bug
  • un collègue a besoin d'un correctif pour sa last révision pour ce certain bug

D'accord. Demandons à notre ami git bisect pour la révision qui a corrigé le bogue:

git bisect start
git bisect bad last
git bisect good master

Mais ça ne va pas marcher:

Certains bons régimes ne sont pas les ancêtres des mauvais régimes.
git bisect ne peut pas fonctionner correctement dans ce cas.
Vous vous trompez peut-être de bons et de mauvais tours?

Des conseils pour surmonter cela? Ai-je raté quelque chose dans les documents?

88
eckes

Depuis git 2.7, vous pouvez utiliser les arguments --term-old et --term-new.

Par exemple, vous pouvez identifier un commit de résolution de problèmes ainsi:

git bisect start --term-new=fixed --term-old=unfixed
git bisect fixed master
git bisect unfixed $some-old-sha1

Pendant que vous testez, dites git bisect fixed ou git bisect unfixed selon le cas.

Ancienne réponse, pour les versions de git antérieures à 2.7

Au lieu de vous entraîner temporairement à penser que le mauvais signifie le bien et le bien signifie le mal, pourquoi ne pas créer des alias?

Dans ~/.gitconfig ajoutez ce qui suit:

[alias]
        bisect-fixed = bisect bad
        bisect-unfixed = bisect good

Vous pouvez commencer à identifier un commit de résolution de problèmes ainsi:

$ git bisect start
$ git bisect-fixed master
$ git bisect-unfixed $some-old-sha1

Pendant que vous testez, dites git bisect-fixed ou git bisect-unfixed selon le cas.

90
Michael Wolf

Je voudrais juste "tricher" git et échanger les significations de bon <=> mauvais.

En d'autres termes, considérez "mauvais" comme quelque chose qui ne présente pas le problème donc ce n'est pas la "bonne" version sur laquelle baser votre patch.

Bon et mauvais sont des concepts assez subjectifs de toute façon, non? :)

git bisect start
git bisect good last
git bisect bad master
47
inger

Si vous utilisez git bisect run comme je l'ai fait avec la commande prove de Perl (qui exécute des tests automatiques), vous n'avez aucune chance d'échanger simplement good et bad. Le succès des tests sera signalé comme code de sortie.

J'ai trouvé une syntaxe Bash valide pour annuler le code de sortie du programme exécuté par git bisect run:

git bisect start
git bisect bad HEAD                 # last revision known to PASS the tests
git bisect good $LAST_FAIL_REVISION # last revision known to FAIL the tests
git bisect run bash -c "! prove"

Cela m'a donné la première révision de pass les tests exécutés par prove.

20
Daniel Böhmer

Git vous permet désormais d'utiliser old et new sans les définir au préalable. Vous devez appeler git bisect start sans commits comme arguments supplémentaires, puis lancez correctement la bissection en appelant

git bisect old <rev>
git bisect new <rev>

https://git-scm.com/docs/git-bisect#_alternate_terms

C'est essentiellement ce que @MarcH suggérait de mettre en œuvre.

8
GKFX

Les alias Git sont une bonne idée, cependant les termes fixed et unfixed ont le même problème que good et bad: vous ne pouvez pas les avoir compatibles avec à la fois régressions et progressions. Il est facile de trouver des mots qui fonctionnent dans les deux sens: il suffit de les récupérer dans la terminologie de recherche binaire d'origine qui est de nature neutre sans aucune idée préconçue de ce qui est bon ou mauvais. Par exemple:

git config --global alias.bisect-high 'bisect bad'
git config --global alias.bisect-low  'bisect good'

Avec des termes neutres comme ceux-ci, vous pouvez toujours taper: git bisect-high (ou git bisect-upper, ou git-bisect max, ... votre choix!) que vous recherchiez une régression ou un correctif.

Dommage que les développeurs de git bisect ne puissent pas simplement réutiliser les termes existants. L'interface utilisateur n'est pas une préoccupation générale de git: http://stevebennett.me/2012/02/24/10-things-i-hate-about-git/

6
MarcH