2013-03-14 16 views
62

Ho il seguente problema:Come potrei usare git bisect per trovare il primo commit GOOD?

  • la versione a master funziona bene
  • la versione dell'ultimo tag prima master (diciamo last) ha un bug
  • un collega ha bisogno di una patch per il suo last revisione per quel determinato bug

Ok. Chiediamo il nostro amico git bisect per la revisione che risolto il bug:

git bisect start 
git bisect bad last 
git bisect good master 

Ma che non sta andando a lavorare:

Alcuni buoni giri non sono antenato del cattivo rev.
git bisect non può funzionare correttamente in questo caso.
Forse scambiate i giri buoni e quelli cattivi?

Eventuali suggerimenti per superare questo? Mi sono perso qualcosa nei documenti?

+1

Sto eseguendo 'git bisect run ...' per automatizzare il bisecting. Quindi non ho alcuna possibilità di scambiare le parole 'buono' e' cattivo' (che era troppo ovvio). Come usare 'run' per trovare la prima buona revisione? –

+0

@ DanielBöhmer: devi scambiare i termini ** all'interno del tuo script ** in esecuzione, vero? – eckes

+0

Lo script eseguito da 'git bisect run' restituisce * buono * o * cattivo * come codice di uscita, non come stringa. Vedi la mia risposta che ho appena postato qui sotto. –

risposta

56

A partire da git 2.7, è possibile utilizzare gli argomenti --term-old e --term-new.

Per esempio, è possibile identificare un problema di fissazione commit così:

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

Come si prova, dicono git bisect fixed o git bisect unfixed a seconda dei casi.

Vecchio risposta, per le versioni di Git prima di 2,7

Invece di temporanea formazione te stesso a pensare così male significa bene e il bene affatto male, perché non creare alcuni alias?

Nel ~/.gitconfig aggiungere la seguente:

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

si può iniziare a identificare un problema truccate commettere così:

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

Come si prova, dire git bisect-fixed o git bisect-unfixed a seconda dei casi.

+3

Per inciso, git non ti permette di creare alias di sotto comandi. Da qui i trattini.Se è effettivamente (o è stato reso possibile), si spera che qualcuno aggiorni la risposta. –

+0

E sulla riga di comando: 'git config - globale alias.bisect-broken 'bisect good'' e' git config - global alias.bisect-fixed' bisect bad'' –

+1

Anche se si utilizzano alias, l'output di git non lo farà, quindi segnalerà ancora foo "è il primo commit errato", quindi sembra che sia ancora necessario un addestramento temporaneo, no? – ThomasW

43

Vorrei solo "imbrogliare" git e scambiare significati di buono < => cattivo.

In altre parole, considera "cattivo" come qualcosa che non presenta il problema, quindi questa non è la versione "buona" su cui basare la tua patch.

Bene e male sono comunque concetti piuttosto soggettivi, giusto? :)

git bisect start 
git bisect good last 
git bisect bad master 
+5

funziona ma ti stravolge la mente :-) – eckes

+2

Beh, se ci pensi non c'è un significato generale che cosa sia buono o cattivo (probabilmente nemmeno nella religione) .. dipende solo dai tuoi scopi. In questo modo non è veramente imbroglio - ma forse Git's Sin (rimanere sul tema religioso: D è prendere un termine così controverso piuttosto che un "obiettivo"/"origine" più neutro .. Ma sì, la filosofia può essere incredibile ;-) – inger

+3

Amo questa risposta. – patrickvacek

5

Git alias sono una buona idea, ma i termini fixed e unfixed hanno lo stesso problema di good e bad: non si può avere loro essere compatibile con entrambi i regressioni e progressioni. È facile trovare le parole che funzionano in entrambi i modi: semplicemente riprenderle dalla terminologia di ricerca binaria originale che è di natura neutrale senza alcun preconcetto su ciò che è buono o cattivo. Per esempio:

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

Con termini neutri come questi si può sempre scrivere: git bisect-high (! O git bisect-upper, o git-bisect max, ... la vostra scelta) se siete alla ricerca di una regressione o di una correzione.

Peccato che gli sviluppatori di git bisect non possano semplicemente riutilizzare uno dei termini esistenti. L'interfaccia utente non è di git riguardano in generale: http://stevebennett.me/2012/02/24/10-things-i-hate-about-git/

+0

Da: http://git.github.io/rev_news/2015/07/08/edition-5/ "Alcune serie di patch vengono lucidate per consentire a git bisect di utilizzare una coppia arbitraria di termini anziché buoni e cattivi. .. " – MarcH

14

Se stai usando git bisect run come ho fatto con prove comando di Perl (che esegue i test automatici) non hai nessuna possibilità di scambiare solo good e bad. Il successo dei test verrà segnalato come codice di uscita.

ho trovato una sintassi Bash valida per negare il codice di uscita del programma gestito da 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" 

questo mi ha dato la prima revisione al passaggio i test gestiti da prove.

+2

Questa dovrebbe essere la risposta accettata! –

+0

Sono d'accordo, preferirei non modificare il mio test case, quindi è perfetto. – seanlinsley

5

Git ora consente di utilizzare old e new senza prima definirli. Dovete chiamare git bisect start senza impegna come ulteriori argomenti, quindi avviare correttamente il bisection chiamando

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

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

Questo in sostanza è ciò che @MarcH stava suggerendo dovrebbe essere attuato.

Problemi correlati