2009-02-16 9 views
8

A un certo punto nel nostro passato i rami di sviluppo in git sono stati uniti. Tuttavia, è stata presa la decisione di unione errata e quindi alcuni codici non sono stati inclusi nel ramo principale che ci aspettavamo ci sarebbe stato. (Esistevano più fusioni di rami diversi prima di un'unione finale a un ramo principale. Quindi la storia di ramificazione e unione era abbastanza complessa.)Come cercare nella cronologia di un repository git per trovare un errore di fusione?

C'è un modo semplice per cercare un repository git per determinare su quale unione "errato" "la decisione è stata presa su?

(. So già la risposta per questo caso particolare, ma il processo di ricerca è stato un po 'noioso)

EDIT: La colpa ragione git dimostrato inadeguato è che la linea è stato toccato in un commit qualche tempo dopo l'errore di fusione.

risposta

7

Se si conosce una riga in un file che è stato modificato dalla fusione di git branch, è possibile eseguire "git blame file.txt" e determinare il numero di hash di commit e l'autore di commit della riga nel file. Quindi è possibile passare attraverso il log git e richiamare il commit esatto associato alla fusione dei rami errata.

MODIFICA: In risposta ai commenti dell'autore, se stai cercando la scomparsa di una determinata linea allora 'git diff' combinato con grep e ricerca binaria potrebbe essere quello che vuoi. Diciamo che hai numeri di commit 0,1,2,3,4,5,6. Sai che la linea esisteva nella revisione 0, ma è scomparsa nella revisione 6. Usa 'git diff' più grep per cercare la scomparsa.

git diff 0 6 | grep '- line I care about' 

La prima iterazione, vedrai la linea che ti interessa scomparire. Poi si taglia il numero di revisione a metà e riprovare

git diff 0 3 | grep '- line I care about' 

Se il grep mostra ancora la linea di scomparire (con il segno '-'), poi si sa che la linea è scomparso nella revisione 0 a 3. Se la grep no mostra la linea che scompare, quindi la linea è scomparsa nelle revisioni 4-6.

Continuare a tagliare le revisioni a metà fino a trovare il colpevole.

+0

Il problema era che la linea veniva toccata qualche tempo dopo "l'errore di fusione". Sapevo quando è stata introdotta la patch, ma non è stato facile capire quando è stata ritirata. – Atlas1j

+1

Piuttosto quindi git diff e search, usa le opzioni fornite da git log. In particolare, prova 'git log .. -S" linea che mi interessa "--diff-filter = M' –

+2

Il processo che descrivi è ciò che fa git bisect. Tuttavia, non devi contare gli hash. Mentre il tuo pattern 0-6, 0-3/4-6, ecc. È chiaro e comprensibile, non puoi usare i numeri di commit. Devi usare gli hash del commit e questo non è chiaro. git bisect è tuo amico. –

10

Senza ulteriori dettagli, posso solo suggerire le soluzioni possibili. Se si conosce il file o la linea interessata, si può provare sia git-blame (git blame *file*, o git blame *revision* *file*), oppure si può provare cosiddetto 'piccone ricerca' con git-log, cioè git log -S'*line* cercando di trovare revisione che ha introdotto dato la linea, o eliminato dato linea. Puoi trovare ed esaminare tutte le unioni, ad esempio tramite git log -p -m --grep=Merge, ed esaminare come si relazionano con i loro genitori (-m mostra diffs a tutti i genitori, in alternativa -c mostra diff unito ma non mostra cambiamenti di unione triviale, cioè se una parte è stata presa) .

0

Per gli altri alla ricerca di una soluzione più semplice, il fuoco fino gitk (o da Git GUI andare a Repository> Visualizzate X Storia) e usare il suo strumento di ricerca.

9

Git log ha potenti opzioni di ricerca.Dal momento che c'è l'indicazione si potrebbe conoscere un pezzo di codice che è scomparso, è possibile cercare quella stringa di codice

git log <HERE>..<THERE> -S"line I care about" --diff-filter=M

cercherà da qui a lì per la stringa dopo -S e solo se la linea è stata modificata (aggiunto o rimosso)

È possibile ottenere ancora più precisione nella ricerca se si utilizza -G anziché -S. -G fornisce la ricerca di espressioni regolari invece della ricerca letterale di stringa con -S.

+0

Questo è FANTASTICO! Non lo sapevo. Grazie! –

+0

ha bisogno di più voti ... –

+1

Questo può essere molto utile con l'opzione -p per mostrare le patch piuttosto che i riepiloghi di commit. Quindi puoi effettivamente vedere le modifiche per i commit che corrispondono. – studgeek

Problemi correlati