Visualizza le differenze di rami con fusione?


159

So che posso vedere la differenza tra HEAD e lo stato attuale con meld .. Ma come posso visualizzare le differenze tra i rami, ad esempio mastere develcon la fusione?

Al momento faccio i seguenti passi:

  1. Rinomina cartella della copia di lavoro
    Ad esempio mv /projectA /projectA_master)
  2. Clona di nuovo il progetto
    git clone url
  3. Passa al develramo
    cd projectA && git -b devel origin/devel
  4. Visualizza le differenze con la combinazione
    meld /projectA_Master projectA

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


Risposte:


55

Ho anche trovato questo problema fastidioso, quindi ho creato git meld che consente un modo più comodo di differire gli commit arbitrari contro l'albero di lavoro o l'area di gestione temporanea. Puoi trovarlo su 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 con uno qualsiasi degli altri. Se una delle cose a cui stai confrontando è l'albero di lavoro, allora anche quello è di lettura-scrittura in modo da non perdere le modifiche.


1
Ottimo strumento, Will. Grazie! Altamente raccomandato ... ora se solo funzionasse anche con le fusioni.
Astina di livello

TYVM per un ottimo strumento - (promemoria per sé da aggiungere all'alias)
kfmfe04

26
Citando Will, dal repository di hit github: "NOTA: git-meld è obsoleto poiché git difftool ha appreso l'opzione --dir-diff in git 1.7.11."
Oluc,

318

Breve e dolce:

git config --global diff.tool meld

Questo configura Git da usare meldcome strumento diff. (Non è necessario specificare gli argomenti della riga di comando, il supporto per meldè integrato in Git.)

Quindi, se si desidera una differenza grafica anziché una testuale, è sufficiente invocare git difftoolinvece di git diff(entrambi accettano gli stessi argomenti). Nel tuo caso:

git difftool master..devel

Aggiornamento: se non si desidera il diff di un file alla volta, ma si desidera utilizzare la vista "sottodirectory" di meld con tutte le modifiche tra i due rami, notare l' opzione -do --dir-diffper git difftool. Ad esempio, quando sono sul ramo XYZ e voglio vedere cosa c'è di diverso tra questo e il ramo ABC, eseguo questo:

git difftool -d ABC

3
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 'cartella M / cartella B /'.
Marten Bauer,

Marten, è così che funziona Git. Tiene traccia solo dei file, quindi puoi vedere solo le differenze file per file. In git, non puoi commettere una directory vuota da sola. Qualche motivo particolare che si desidera visualizzare diff tra dir?
Donny Kurnia,

@DonnyKurnia: Mi ci è voluto un po 'per capire cosa OP stesse cercando di fare: Meld ha un'interfaccia utente separata per visualizzare tutte le modifiche in una directory. Puoi filtrare la visualizzazione dei file in base a se sono uguali, modificati, nuovi. OP desidera utilizzare quell'interfaccia utente per mostrare le modifiche. (Ciò consente di visualizzare un elenco di tutte le modifiche e scegliere quelle che si desidera diff.) Quindi non è un confronto tra directory, ma un confronto tra commit ma visualizzato nel suo insieme.
idbrii,

17
@MartenBauer Penso che questo sia quello che vuoi: git difftool --dir-diff master devel
Stéphane

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

100

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

Configura git

git config --global diff.tool meld

Usalo

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 voleva l'OP. Nota l'opzione -g per usare lo strumento guidiff e l'opzione -d per usare --dir-diff. Questo è buono per fare recensioni di codice. Nit: l'opzione difftool.prompt non è richiesta quando si specifica -d, almeno per Git 1.8.
Michael Percy,

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

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

2
Gradirei anche una risposta alla domanda di @zkent ... :(
tavlima

3
@zkent @tavlima: questo comando consente già di modificare la versione corrente. Anche se vedi un floppy tmp nella combinazione, se salvi - Ctrl+s- la parte giusta, il tuo file viene modificato.
Benjamin,

13

E 'importante dire che l'utilizzo git difftool -dsi può ancora modificare i file di lavoro in Meld e salvarli . Per ottenere ciò, devi confrontare alcuni rami con il tuo attuale albero di lavoro, ad esempio:

git difftool -d branchname

La combinazione mostrerà che entrambe le directory sinistra e destra si trovano in / tmp. Tuttavia, i file nella directory corretta sono in realtà collegamenti simbolici ai file nella directory di lavoro corrente (non si applica a Windows). Quindi puoi modificarli direttamente in Combinazione e quando li salvi le modifiche verranno salvate nella directory di lavoro.

Un'opzione ancora più interessante è il confronto dell'attuale directory di lavoro con lo stash. Puoi farlo semplicemente digitando:

git difftool -d stash

Quindi è possibile trasferire alcune modifiche dalla scorta (finestra a sinistra) alla copia di lavoro corrente (finestra a destra), senza utilizzare git stash pop/apply ed evitare fastidiose risoluzioni di conflitto che possono essere indotte da questi comandi.

Penso che possa aumentare significativamente il flusso di lavoro con gli stash. È possibile trasferire gradualmente le modifiche dalla scorta alla copia di lavoro e commetterle una ad una, introducendo altre modifiche se lo si desidera.


Piotr, questo è esattamente quello che ho cercato di fare, ma nel mio caso (su CentOS), non vengono creati collegamenti simbolici. C'è qualche configurazione richiesta o una versione minima di meld che supporti questo?
wrjohns,

Penso che Git sia responsabile della creazione di symlink, non di Meld. Controlla il manuale di Git per il comando difftool. Forse dovresti aggiornarlo a una versione più recente?
Piotr Jurkiewicz,

2
la copia di nuovi file dalla diramazione alla directory di lavoro non funziona :(
pykiss

5

Anche se dalle altre risposte sembra che non ci sia un modo per farlo direttamente nel repository git al momento, è facile (grazie alla risposta ad un'altra domanda :)) scrivere uno script che estrarrà gli alberi di due commit alle directory temporanee ed eseguire la fusione su di esse, rimuovendo entrambe le directory alla chiusura della fusione:

http://gist.github.com/498628

Certo, perderai tutte le modifiche apportate tramite la fusione, ma è abbastanza bello per una rapida panoramica delle differenze, penso.


3

Penso che un modo semplice per farlo sia usare git reset --soft:

Obiettivo: confrontare le differenze tra branch_a e branch_b con la combinazione

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

0

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

È necessario configurare nelle opzioni di modifica 'git gui', globali: "Usa lo strumento di unione: fusione".

Avvia gitk , seleziona un commit, fai clic con il pulsante destro del mouse su un altro commit> " diff this -> selezionato ". Sotto 'patch' fai clic destro su un file> " diff esterno ".

la fusione verrà avviata e visualizzerà la selezione ancora selezionata, prima il commit sul lato destro.


0

Per Meld su macOS, aggiungilo al tuo ~/.gitconfigcome raccomandato dal manutentore dell'applicazione macOS, yousseb :

[diff]
  tool = meld
[difftool]
  prompt = false
[difftool "meld"]
  trustExitCode = true
  cmd = open -W -a Meld --args \"$LOCAL\" \"$REMOTE\"
[merge]
  tool = meld
[mergetool]
  prompt = false
[mergetool "meld"]
  trustExitCode = true
  cmd = open -W -a Meld --args --auto-merge \"$LOCAL\" \"$BASE\" \"$REMOTE\" --output=\"$MERGED\"

Se lo mergedesideri, puoi omettere le configurazioni.

La risposta di @ GutenYe non ha funzionato per me a causa della fuga automatica e / o qualcosa con zsh.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.