2012-02-15 18 views
6

Ho ribadito un ramo argomento piuttosto vecchio sul master. Poiché durante il rebase ci sono stati alcuni conflitti, mi piacerebbe confrontare il ramo vecchio argomento con quello successivo, per assicurarmi di non aver rimosso accidentalmente o rovinare nessuna delle modifiche sull'argomento. Il più vicino che ho ottenuto è diffondere i risultati di git diff master...topic e git diff master...topic-rebased. Questo tipo di lavoro funziona, ma c'è molta rumorosità nella differenza finale rispetto alle modifiche nel codice di contesto, numeri di linea, hash di commit, ecc., Oltre a non essere una soluzione molto solida. C'è un modo più semplice per farlo?Confronta il ramo git con il ramo rebased

+0

A seconda dell'importanza della complessità, è possibile provare a ricollocarlo nuovamente e confrontare tale risultato con 'topic-rebased' ... (Si sta lavorando sul presupposto che si sarà più cauti in luoghi diversi la seconda volta .) Altrimenti, l'opzione -U su 'git diff' può ridurre il contesto e puoi provare a estrarre le intestazioni del blocco contenente i numeri di riga e gli hash del blob. – antak

+0

Un'interessante alternativa è quella di rebase di esso (ad esempio 'master..topic-rebased') su * merge-base * (o da dove mai' topic' proviene) e confronta (diff) questo a 'topic'. Ciò si comporterebbe come una prova matematica e tutti i delta che vedete qui dovrebbero essere quelli di importanza. Il rebasing qui potrebbe essere fatto con 'cherry-pick' o' rebase upstream topic ~ 0 --onto new_base'.Non conosco il tuo livello di conoscenza, ma il "ribaltamento" in questo caso non dovrebbe comportare il blocco dei rami correnti perché mi aspetto che venga eseguito in uno stato distaccato o in un ramo a eliminazione diretta. – antak

+0

rebasing indietro non funzionerà come risulteranno gli altri conflitti. –

risposta

4

Probabilmente vorrebbe diff effettive le modifiche (patch) prodotte da ciascuno:

diff <(git log master..topic -p) <(git log master..old-place-of-topic -p) 

Questo potrebbe rimuovere efficacemente tutte le modifiche introdotte nel master.

+0

Correggetemi se ho torto, ma questo mostrerebbe anche tutte le modifiche da 'git merge-base master topic' a' git merge-base master topic-rebased', che non voglio. Voglio solo visualizzare le modifiche specifiche al ramo dell'argomento. Inoltre, non ho bisogno di un reflog, ho ancora sia argomento che topic-based. – Ryan

+0

modificato. Ora ho quello che cerchi. –

+0

Apprezzo la risposta, ma questo ha lo stesso risultato e problemi (supponendo che intendessi "master ... old-place-of-topic") come quello che faccio attualmente (menzionato nella domanda). – Ryan

0

Se non ti interessa la cronologia dei commit dal ramo dell'argomento puoi rifare il rebase e aggiungere il flag --squash. Questo ti darà un singolo commit sulla parte superiore del tuo ramo master dove puoi e passare attraverso i file modificati file per file. Vorrei anche aggiungere il flag --no-commit al rebase in modo che potessi rivedere le modifiche prima di commettere il rebase git.

git checkout master 
git rebase --squash --no-commit topic 
//review changes with your favourite git tool 
git commit 

Se non si vuole rifare il rebase uno strumenti diff esterni come KDiff3 potrebbe aiutare.

+1

Non si desidera rebase master su topic. –

+0

Questo è vero. Ho dovuto rileggere la mia risposta, ma non riesco a vedere dove ho scritto che il master dovrebbe essere ribattezzato sull'argomento? – MikaelHalen

+0

Non voglio rivedere le modifiche che l'argomento ha apportato, voglio rivedere le modifiche apportate (a seguito di conflitti) durante il rebase. – Ryan

4

Ero alle prese con questo stesso problema e ho trovato idee simili a quelle di Ryan e Adam Dymitruk e li ho trovati non molto soddisfacenti: confrontare il diff finale è complicato e inoltre non mostra dove è stato introdotto l'errore lo trovi.

Il mio flusso di lavoro corrente di rebase include il confronto di ciascun commit rebased con quello originale, in modo da individuare e correggere potenziali errori mentre appaiono e non è necessario ripetere il rebase. Sto utilizzando la seguente coppia di alias git per facilitare questo:

rc = !git diff -w $(cat .git/rebase-merge/stopped-sha) > .git/rebase-merge/current-diff 
rd = !git diff -w $(cat .git/rebase-merge/stopped-sha) | diff --suppress-common-lines .git/rebase-merge/current-diff - | cut -b 1-2 --complement | less 

git rc memorizza il diff tra HEAD l'ultima revisione dal ramo che viene calcolato su base. Dopo aver riprodotto il seguente commit, git rd confronta questo diff memorizzato con il diff tra il nuovo HEAD e il successivo commit sul ramo che viene ridefinito. Quindi questo mostra che solo la differenza ("errore") si presenta riproducendo quest'ultimo commit.

Dopo aver controllato il diff, chiamare git rc per aggiornare il diff memorizzato e continuare il rebase.

Invece di chiamare manualmente git rc e git rd, è possibile aggiungerli al numero git-rebase-todo in modo che vengano chiamati automaticamente dopo la ripetizione di ciascun commit.

Problemi correlati