2011-02-09 1 views
38

Voglio controllare la differenza reale tra filiale remota e filiale locale. Come lo posso fare?Come verificare la differenza di git reale prima della fusione dal ramo remoto?

L'emissione del comando di seguito funziona parzialmente, ma mostra anche il diff delle nuove modifiche del mio ramo locale.

git diff remote/branch 
+0

Non capisco la domanda. Il diff mostra la differenza tra i rami, perché pensi che non si uniranno? – Abizern

+0

@Abizern my bad! Ho corretto la domanda. Grazie! :) – abhiomkar

+0

possibile duplicato di [confrontare il ramo git locale con il ramo remoto?] (Http://stackoverflow.com/questions/1800783/compare-local-git-branch-with-remote-branch) –

risposta

12

Dal documentation:

git diff [--options] <commit>...<commit> [--] [<path>…] 

Questo modulo è quello di visualizzare le modifiche sul ramo contenenti fino al secondo <commit>, a partire da una comune antenato sia <commit>. "git diff A ... B" è equivalente a "git diff $ (git-merge-base A B) B". È possibile omettere uno qualsiasi di <commit>, che ha lo stesso effetto dell'utilizzo di HEAD.

hai provato questo?

+0

Grazie! Non ho realizzato tre punti per questo, funziona! :) – abhiomkar

7

Che cosa si vuole fare è, come suggerito da Evgen Bodunov:

git diff ...remote/branch 

Ciò diff modifiche dal ramo a distanza/e ignorare le modifiche dalla tua testa corrente.

97

Poiché questo argomento si presenta spesso e può confondere senza un po 'di background su come funziona git, ho pensato di provare a spiegare il caso più semplice possibile, ma con sufficiente profondità che i nuovi arrivati ​​avranno abbastanza di una maniglia su di esso per fare ulteriori ricerche.

Se si imposta il repository git tramite un normale "clone" e si hanno i refspec predefiniti, il che significa che il telecomando è denominato "origine" e si tira/recupera dal master "ramo", a volte è necessario vedere cosa c'è nel repository remoto prima di tirarlo giù.

Poiché "git pull" esegue un'unione automatica (a meno che non vi siano conflitti), può essere bello vedere che cosa è "incoming" in seguito. Se non hai familiarità con come funziona git e come vengono gestiti in particolare i refspec, questo può essere un po 'non intuitivo.

Supponiamo che qualcuno fa un cambiamento nel repository remoto (per motivi di esempio, l'aggiunta di una riga al repository remoto commettendo un cambiamento e spingendolo), e si digita:

$ git diff origin/master 

Probabilmente non vedrà alcun cambiamento; se si eseguono le seguenti:

$ git fetch; git diff ..origin/master 

vedrete la differenza tra ciò che è stato impegnati nella vostra repository git locale e ciò che è nel repository remoto. NON vedrai cambiamenti nel tuo filesystem locale o messi in scena nel tuo indice.

Ok, perché lo facciamo? origine/master è un refspec (vedi pagine man). In breve, questo è ciò a cui ci riferiamo per confrontare, tirare o recuperare e spingere a.Tutti i seguenti sono funzionalmente equivalenti:

origin/master 
remotes/origin/master 
refs/remotes/origin/master 

per cominciare a districare questo, basta dare uno sguardo a struttura di directory .git del vostro repository. Un layout tipico è simile al seguente:

.git/refs 
.git/refs/heads 
.git/refs/heads/master 
.git/refs/remotes 
.git/refs/remotes/origin 
.git/refs/remotes/origin/HEAD 
.git/refs/remotes/origin/master 
.git/refs/tags 

Vedere .git/refs/remotes/origine/HEAD; nel caso predefinito punta al ramo che usi per tirare e premere. Nel mio caso, visto che sono sul padrone, il contenuto di questo file di testo simile a questa:

ref: refs/remotes/origin/master 

Questo mi dice che il capo del mio telecomando è identificata dal refspec 'refs/remotes/origin/master '(che capita di avere gli alias sopra menzionati).

Questo non ci dice molto; qual è lo stato del repository remoto? Guarda lo stato del master remoto:

$ cat .git/refs/heads/master  
6d0fb0adfdfa5af861931bb06d34100b349f1d63 

Ok, è un hash SHA1; probabilmente un impegno. Come viene messo in questo file? Bene, ogni volta che fai un pull o un recupero, questo file viene aggiornato con il commit più recente dal telecomando che è stato tirato o recuperato. Questo spiega perché dobbiamo git fetch prima di eseguire il diff. Ricorda, git fetch aggiorna solo la tua copia locale di un ramo remoto, ma non lo unisce con la tua copia di lavoro. È completamente sicuro A git fetch; git merge equivale a git pull.

Una volta eseguito il recupero, git sarà in grado di vedere il commit più recente nel repository remoto al momento del recupero.

È possibile utilizzare varie combinazioni di committenti a git per visualizzare le diff come desiderato (gli esempi seguenti usano la copia di lavoro locale come il primo implicita commit):

$ git diff remote/origin 
This shows the incoming remote additions as deletions; any additions in your local 
repository are shown as additions. 

$ git diff ...remote/origin 
Shows incoming remote additions as additions; the triple-dot excludes changes 
committed to your local repository. 

$ git diff ..remote/origin 
Shows incoming remote additions as additions; the double-dot includes changes 
committed to your local repository as deletions (since they are not yet pushed). 

Per info sul ".." in "..." vedere git help diff e la documentazione eccellente su git-scm revision selection: commit ranges In breve, per gli esempi sopra, la sintassi a due punti mostra tutti i commit raggiungibili dall'origine/master ma non dalla copia di lavoro. Allo stesso modo, la sintassi a triplo punto mostra tutti i commit raggiungibili dal commit (copia di lavoro implicita, remoto/origine) ma non da entrambi.

Sto passando attraverso questo passaggio perché sono abbastanza nuovo da git e questo è esattamente il tipo di cosa che aveva me confuso ... Sono sicuro che gli esperti di git possono trovare difetti con il dettagli ... Spero solo che questa risposta colmi il divario per alcune persone che trovano tutti i vari post un po 'concisi.

+4

Doppio punto e triplo punto, eh? È un po 'orribile. Ma grazie per la tua risposta - spiega perché git diff non ha mai mostrato molto per me. –

+4

Questa dovrebbe essere la risposta accettata; molto più adatto ai principianti e spiega i concetti importanti riguardanti diff (la pagina di manuale è un dolore da comprendere correttamente se non si è abituati a tutti i termini). – mark

+0

Non capisco l'ultima parte. "Mostra le modifiche remote in arrivo come aggiunte"? Quindi, se le modifiche in arrivo sono aggiunte o cancellazioni, vengono mostrate come aggiunte? Non ci credo.Anche la risposta [qui] (http://stackoverflow.com/questions/7251477/git-diff-whats-the-difference-between-having-and-no-dots) sembra molto diversa. – Cerran