Ho visto post sul blog che spiegano come eseguire Git bisect, ma come correggere il bug, eseguire nuovamente il commit e mantenere il resto della cronologia dei commit?
Un vero problema che ho affrontato nel mio progetto era come questo (l'immagine è solo un'approssimazione):
Ho contrassegnato il commit più in alto in bad
e il commit in basso in good
. Alcuni dei commit sotto Buggy commit A
erano buoni commit, perché da qualche parte nel mezzo, avevo commentato il codice che rendeva Bad commit B
un commit errato. Quindi, naturalmente, git bisect mi ha portato prima a Buggy commit B
.
Ho corretto il bug e quando ho provato a eseguire il commit, volevo che le righe di codice modificate venissero applicate allo stesso Buggy commit B
commit. Ma ho scoperto che:
- Git crea sempre un nuovo commit per questo
-
Ho ricevuto l'errore
detached head
:HEAD detached at b855e36 Changes not staged for commit: modified: main.cpp
Ora cosa faccio?
Crea un nuovo ramo (chiamiamolo fixedit
) e commetti questo codice corretto? Se lo faccio, allora cosa succede a tutti gli altri commit sopra di esso? Devo fare un rebase
(mai fatto prima) del commit sopra Buggy commit B
e mettere l'intera linea di commit sul nuovo ramo fixedit
?
Preferirei che mi fosse solo permesso di modificare il commit esistente e l'intero albero rimanesse così com'è, ma poi dovrei passare a tutti i commit superiori a Buggy commit B
e correggere la linea buggy in tutti quei commit. Questo non ha senso. Quindi, come si risolvono i bug e si conserva la cronologia dei commit correttamente?
UPDATE:
Quindi faccio un git bisect reset
e corrego il codice sul commit più in alto (perché so quale riga di Buggy commit B
ha introdotto il bug)?
Come ho detto prima, il codice che ha causato Buggy commit B
è stato commentato in uno dei commit poco prima di Buggy commit A
.
- Quindi quando nel mio commit più alto vedo che la riga è commentata, mi rendo conto che il bug è da qualche altra parte.
- Durante il primo bisect, dal momento che uno dei commit tra A e B è stato contrassegnato come buono, lo sceglierei come buon commit per il mio secondo tentativo Git bisect, e il più recente commit come bad commit e poi continuare con Git bisect. Questo mi porterebbe a
Buggy commit A
. - Poi farei un
git bisect reset
e correggi le linee di codice nel codice più in alto e poi eseguo il commit.
Ok; ciò ha senso. Grazie: -)