2010-01-05 4 views
127

So che posso visualizzare la differenza tra HEAD e lo stato corrente con meld .. Ma come posso visualizzare le differenze tra i rami, ad esempio master e devel con combinazione?Visualizza le differenze di rami con combinazione?

Al momento faccio le seguenti fasi:

  1. cartella Rinomina di copia
    che esercita ad esempio mv /projectA /projectA_master)
  2. Clone di nuovo il progetto
    git clone url
  3. Passa alla devel ramo
    cd projectA && git -b devel origin/devel
  4. Visualizza differenze con fusione
    meld /projectA_Master projectA

Non c'è un modo più semplice per ottenere lo stesso risultato in fusione? Ho solo bisogno di rivedere le modifiche e non principalmente per la fusione.

risposta

51

Ho trovato anche questo problema fastidioso, quindi ho creato una combinazione di git che consente un modo più comodo di diffondere i commit arbitrari contro l'albero di lavoro o l'area di staging. Puoi trovarlo allo https://github.com/wmanley/git-meld. È un po 'come lo script di Mark ma funziona per confrontare qualsiasi commit arbitrario o l'area di staging o la directory di lavoro rispetto a uno degli altri. Se una delle cose a cui stai confrontando è l'albero di lavoro, allora è anche in lettura-scrittura, in modo da non perdere le tue modifiche.

+1

Strumento eccellente, Will. Grazie! Raccomandato vivamente ... ora se solo ha funzionato anche su fusioni. – Dipstick

+0

TYVM per un grande strumento - (promemoria per auto da aggiungere! All'alias) – kfmfe04

+20

Quoting Will, dal repository github hit: "NOTA: git-meld è obsoleto poiché git difftool ha imparato l'opzione --dir-diff in git 1.7. 11." – oluc

265

Breve & dolce:

git config --global diff.tool meld 

questo modo si configura Git da utilizzare meld come strumento diff. (Non è necessario specificare gli argomenti della riga di comando, il supporto per meld è integrato in Git.)

Quindi, se si vuole un diff grafica invece di una testuale, è sufficiente invocare git difftool invece di git diff (entrambi prendere gli stessi argomenti). Nel tuo caso:

git difftool master..devel 

Aggiornamento: Se non si desidera che il diff un-file-at-a-tempo, ma invece vuole usare "sottodirectory" punto di vista di fondersi con tutti i cambiamenti tra il due rami, nota l'opzione -d o --dir-diff per git difftool. Ad esempio, quando sono sul ramo XYZ e voglio vedere ciò che è diverso tra questa e il ramo ABC, corro questo:

git difftool -d ABC 
+2

non è quello che sto cercando. Mi mostra le differenze file per file. L'ho archiviato con uno script diff.py e 'git diff master..devel' prima. Voglio vedere tutte le differenze e l'albero delle directory come 'meld folderA/folderB /' fa. –

+0

Marten, questo è il modo in cui funziona git. Traccia solo il file, quindi puoi vedere solo la differenza file per file. In git, non puoi impegnare una directory vuota da sola. Qualche ragione particolare per cui vuoi visualizzare la differenza tra dir? –

+0

@DonnyKurnia: Mi ci è voluto un po 'per capire cosa OP sta cercando di fare: Meld ha un'interfaccia utente separata per visualizzare tutte le modifiche in una directory. È possibile filtrare i file di visualizzazione in base a se sono uguali, modificati, nuovi. OP vuole utilizzare quell'interfaccia utente per mostrare le modifiche. (Questo ti permette di vedere una lista di tutte le modifiche e scegliere quelle che vuoi diff.) Quindi non è un confronto tra le directory, ma un confronto tra commit ma visto nel suo insieme. – idbrii

5

Anche se sembra dalle altre risposte, come se non c'è un modo per farlo questo direttamente nel repository git al momento, è facile (grazie alla risposta allo another question :)) scrivere uno script che estrae gli alberi di due commit in directory temporanee ed eseguirli su di essi, rimuovendo entrambe le directory quando esce la fusione:

http://gist.github.com/498628

Naturalmente, perderai tutte le modifiche effettuate tramite fusione, ma è abbastanza bello per una rapida panoramica delle differenze, penso.

5

Penso che un modo semplice per fare questo sta usando git reset --soft:

Obiettivo: confronta le differenze tra branch_a e branch_b con fusione

git checkout branch_a 
git checkout -b do_diff 
git reset --soft branch_b 
meld . 
86

partire con git v1.7.11, è possibile utilizzare per eseguire git difftool --dir-diff una directory diff. Che funziona abbastanza bene con gli script senza script https://github.com/wmanley/git-meld.

Configura git

git config --global diff.tool meld 

Utilizzare lo

git difftool -d topic    // -d is --dir-diff 
git difftool -d master..topic 

per MacOS

brew cask install meld 
git config --global difftool.meld.cmd 'open -W -a Meld --args \"$LOCAL\" \"$PWD/$REMOTE\"' 
git config --global difftool.meld.trustExitCode true 
+2

Penso che questo sia davvero ciò che l'OP voleva. Nota l'opzione -g per usare lo strumento guidiff e l'opzione -d per usare un --dir-diff. Questo è buono per fare revisioni del codice. Nit: l'opzione difftool.prompt non è richiesta quando si specifica -d, almeno per Git 1.8. –

+0

Questo è INCREDIBILE. Esattamente quello di cui avevo bisogno. Grazie! –

+2

Questo può essere fatto in modo che il ramo corrente non si trovi in ​​una cartella tmp e quindi consenta modifiche? – zkent

0

Se si dispone di directory di lavoro pulito e l'indice pulita (o non si preoccupano di esso), allora questo quello che vuoi:

git diff master..devel | patch -p1 && meld . && git reset --hard 
1

In git V1.7.9 è possibile confrontare due commit senza la riga di comando:

È necessario configurare in 'gui' git opzioni di modifica, globale: "Utilizzare lo strumento di unione: fondersi".

Inizio gitk, selezionare un commit, fate clic destro un'altra commettere> "diff questo -> selezionato". In "patch" fare clic con il pulsante destro del mouse su un file> "diff esterno".

combinazione verrà avviato e verrà visualizzato il ancora selezionato, il primo impegno sul lato destro.

8

E 'importante dire che l'utilizzo di git difftool -d si comunque possibile modificare i file di lavoro in Meld e salvarli. Al fine di raggiungere che è necessario confrontare qualche ramo per il vostro albero di lavoro corrente, ad esempio:

git difftool -d branchname 

Meld sarà mostrando che entrambe le directory destra e sinistra si trovano in/tmp. Tuttavia, i file nella directory giusta sono in realtà collegamenti simbolici ai file nella directory di lavoro corrente (non si applica a Windows). Quindi puoi modificarli proprio in Meld e quando li salvi le tue modifiche verranno salvate nella tua directory di lavoro.

Un'opzione ancora più interessante è il confronto della directory di lavoro corrente con lo stash. È possibile farlo semplicemente digitando:

git difftool -d stash 

quindi è possibile trasferire alcune modifiche da scorta (finestra di sinistra) a vostra copia di lavoro corrente (finestra di destra), senza l'utilizzo di git stash pop/apply ed evitando la risoluzione dei conflitti fastidio che può essere indotta da questo comanda

Penso che possa aumentare significativamente il flusso di lavoro con le barre. È possibile trasferire gradualmente le modifiche da stash a copia di lavoro e trasferirle una alla volta, introducendo altre modifiche se lo si desidera.

+0

Piotr, questo è esattamente quello che ho Ho provato a farlo, ma nel mio caso (su CentOS) non sono stati creati collegamenti simbolici. Esiste qualche configurazione di configurazione richiesta o una versione minima di fusione che supporti questo? – wrjohns

+0

Penso che Git sia responsabile della creazione di collegamenti simbolici, non Meld. Controlla il manuale di Git per il comando difftool. Forse dovresti aggiornarlo ad una versione più recente? –

+1

copiare i nuovi file dalla diramazione alla dir funzionante non funziona :( – pykiss