Ottenere la differenza tra due repository


184

Come possiamo ottenere la differenza tra due repository git?

Lo scenario: abbiamo un repo_a e un repo_b. Quest'ultimo è stato creato come copia di repo_a. Successivamente si sono verificati sviluppi paralleli in entrambi i repository. Esiste un modo in cui possiamo elencare le differenze delle versioni attuali di questi due repository?


Risposte:


249

In repo_a:

git remote add -f b path/to/repo_b.git
git remote update
git diff master remotes/b/master
git remote rm b

3
Cosa succede se è necessario confrontare repo_a / master con un tag specifico di repo_b?
David Torres,

2
non funziona per me, sta gettando: fatale: argomento ambiguo 'telecomandi / b / master': revisione sconosciuta o percorso non nell'albero di lavoro. Usa '-' per separare i percorsi dalle revisioni, in questo modo: 'git <comando> [<revision> ...] - [<file> ...]' Qualche idea qui?
Andrew Heekin,

2
Sto diventando lo stesso di @AndrewHeekin. Qualcuno ha una soluzione?
parlamento

4
Mi sembra di dover specificare origin/masterpiuttosto che un nudo master. Inoltre, questo trova la differenza tra i rami master, quindi cosa succede se si desidera trovare tutti i rami che sono diversi? Ad esempio per verificare lo stato di un backup del repository?
David,

1
Puoi spiegare cosa sta facendo ogni riga? Grazie !
Enrique,

34

La combinazione può confrontare le directory:

meld directory1 directory2

Usa le directory dei due repository git e otterrai un bel confronto grafico:

inserisci qui la descrizione dell'immagine

Quando fai clic su uno degli elementi blu, puoi vedere cosa è cambiato.


1
La fusione si blocca mentre confronta i progetti nella mia soluzione VS, BeyondCompare no.
Sasha Bond,

4
in OSX: diff -rq cartella1 cartella2
Contrassegna il

1
Link meraviglioso! Programma molto semplice, ora lo sto usando come programma diff per OSX.
dmanexe,

1
Questo è assolutamente adorabile! Grazie per la condivisione.
Shihab Khan,

Non sono sicuro che meld sia in grado di gestire file ignorati da git - dovresti considerare questo mentre lo usi
noamgot

11

È possibile aggiungere prima altri repository come telecomando al repository corrente:

git remote add other_name PATH_TO_OTHER_REPO

quindi recupera brach da quel telecomando:

git fetch other_name branch_name:branch_name

questo crea quel ramo come un nuovo ramo nel tuo repository corrente, quindi puoi diff quel ramo con uno qualsiasi dei tuoi rami, ad esempio, per confrontare il ramo corrente con il nuovo ramo (branch_name):

git diff branch_name

8

Una volta che hai entrambi i rami in un repository puoi fare un git diff. E metterli in un repository è facile come

git fetch /the/other/repo/.git refs/heads/*:refs/remotes/other/*

Esiste un modo per selezionare la cronologia con una piccola modifica: ad esempio nel file di repository remoto viene inserito in una directory, ma voglio applicare le modifiche allo stesso file ma che si trova in un'altra directory nel repository locale?
Eugen Konkov,

Se stai parlando di un piccolo cambiamento, penso che il modo più semplice sarebbe solo fare un diff e quindi riapplicarlo all'altro file usando patch.
Michael Krelin - hacker,

La patch non viene applicata a causa di nomi di file diversi nonostante siano gli stessi file
Eugen Konkov,

Oh, stavo solo pensando a diverse directory, non ai nomi dei file (le directory possono essere facilmente gestite tramite le opzioni di patch). Bene, per i nomi dei file li cambierei manualmente o tramite la sceneggiatura. Detto questo, non sto dicendo che non esiste una soluzione migliore, proprio quello che posso trovare senza scavare da nessuna parte.
Michael Krelin - hacker,

e se volessi confrontare tutti i rami, però?
Endolith

7
git diff master remotes/b

Non è corretto remotes/bè un telecomando, ma non un ramo.

Per farlo funzionare, ho dovuto fare:

git diff master remotes/b/master

2
Questo dovrebbe davvero essere un commento sulla risposta pertinente.
EntangledLoops

6

Vedi http://git.or.cz/gitwiki/GitTips , sezione "Come confrontare due repository locali" in "Generale".

In breve, si utilizza la variabile di ambiente GIT_ALTERNATE_OBJECT_DIRECTORIES per accedere al database degli oggetti dell'altro repository e si utilizza git rev-parse con--git-dir / GIT_DIR per convertire il nome simbolico in un altro repository nell'identificatore SHA-1.

La versione moderna sarebbe simile a questa (supponendo che tu sia in 'repo_a'):

GIT_ALTERNATE_OBJECT_DIRECTORIES = .. / repo_b / .git / objects \
   git diff $ (git --git-dir = .. / repo_b / .git rev-parse --verify HEAD) HEAD

dove si ../repo_b/.gittrova il percorso del database degli oggetti in repo_b (sarebbe repo_b.git se fosse un repository nudo). Ovviamente puoi confrontare versioni arbitrarie, non solo HEAD.


Si noti che se repo_a e repo_b sono lo stesso repository, potrebbe essere più sensato metterli entrambi nello stesso repository, o usando " git remote add -f ..." per creare nickname per il repository per aggiornamenti ripetuti o obbedire " git fetch ..."; come descritto in altre risposte.


5

Uso PyCharm che ha grandi capacità di confronto tra cartelle e file.

Basta aprire la cartella principale per entrambi i repository e attendere fino a quando non viene indicizzato. Quindi è possibile utilizzare il tasto destro del mouse su una cartella o un file Compare to...e selezionare la cartella / file corrispondente sull'altro lato.

Mostra non solo quali file sono diversi, ma anche il loro contenuto. Molto più semplice della riga di comando.


2

La tua scommessa migliore è avere entrambi i repository sul tuo computer locale e usare il comando diff linux con le due directory come parametri:

diff -r repo-A repo-B


2
L'unico modo per renderlo utilizzabile è rinominare una delle directory .git. questo riduce a due righe pagine di differenze che non contano. Sono stato lì, fatto questo, sono venuto qui in cerca di una risposta migliore.
Hildred

2

Un modo semplice per farlo senza toccare la configurazione dei telecomandi. Dal repository A, nel master (supponi di voler confrontare i rami master):

git fetch path/to/repo_b.git master
git diff FETCH_HEAD

0

Puoi usare il seguente comando:

diff -x .git -r repo-A repo-B

oppure per fianco a fianco puoi usare:

diff -x .git -W200 -y -r repo-A repo-B

In caso di colorazione di ogni file diff, è possibile utilizzare:

diff -x .git -W200 -y -r repo-A repo-B | sed -e "s/\(^diff .*\)/\x1b[31m\1\x1b[0m/"

basato sulla soluzione @ andrew-heekin
Gerard

0

Promemoria per auto ... recuperare prima, altrimenti il ​​repository non ha hash locale (suppongo).

passaggio 1. Configurare il telecomando upstream e sopra ^

la differenza di un singolo file segue questo modello:

git diff localBranch uptreamBranch --spacepath / singlefile

git diff master upstream/nameofrepo -- src/index.js

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.