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.
Non capisco la domanda. Il diff mostra la differenza tra i rami, perché pensi che non si uniranno? – Abizern
@Abizern my bad! Ho corretto la domanda. Grazie! :) – abhiomkar
possibile duplicato di [confrontare il ramo git locale con il ramo remoto?] (Http://stackoverflow.com/questions/1800783/compare-local-git-branch-with-remote-branch) –