2015-07-02 19 views
10

Sto imparando a lavorare con i telecomandi Git leggendo il relevant section of the Pro Git Book.Perché git log non mostra nulla di nuovo dopo git fetch?

Se si clona un repository, il comando aggiunge automaticamente tale repository remoto sotto il nome "origine". Quindi, git fetch origin recupera qualsiasi nuovo lavoro che è stato inviato a quel server da quando è stato clonato (o è stato scaricato da esso).

È importante notare che il comando git fetch solo recupera i dati nel repository locale; non lo fonde automaticamente con nessuno dei tuoi lavori o modifica ciò che stai attualmente lavorando. Devi unirlo manualmente al tuo lavoro quando sei pronto.

Ecco cosa ho provato. Ho clonato un repository e modificato un file. Nel repository originale, qualcuno ha aggiornato lo stesso file e inviato. Poi,

  1. ho corse git fetch. Ha mostrato un messaggio di avanzamento dell'aggiornamento. Tuttavia, git log non ha mostrato tale aggiornamento. Ho frainteso cosa fa git fetch? Mi sto perdendo qualcosa?

  2. ho corse git pull, e ho avuto

error: Your local changes to 'hello_world.c' would be overwritten by merge. Aborting. Please, commit your changes or stash them before you can merge.

Ecco, io credo che è anche la fusione e per evitare la perdita accidentale dei dati, si interrompe.

Modifica: Grazie per le risposte. In realtà prima di guardare le risposte, io cercavo e sono reso conto lo stesso con i seguenti comandi/uscite:

$ git ls-remote origin 
d0006a6bfa95e0e90aa820a0e50d31a548625652 HEAD 
d0006a6bfa95e0e90aa820a0e50d31a548625652 refs/heads/master 
$ git ls-remote . 
14375458b8a6b84f82d9fa4d2ded0bb8c9e87431 HEAD 
14375458b8a6b84f82d9fa4d2ded0bb8c9e87431 refs/heads/master 
d0006a6bfa95e0e90aa820a0e50d31a548625652 refs/remotes/origin/HEAD 
d0006a6bfa95e0e90aa820a0e50d31a548625652 refs/remotes/origin/master 

anche con i seguenti comandi:

$git log origin --oneline 
$git log --oneline 

Grazie per cuscinetti con le mie domande stupide; -)

+1

* [...] il comando git fetch estrae i dati nel repository locale [...] * Attento con il termine "pull"; ha un significato molto specifico in Git e usarlo nel modo in cui lo fai non può che creare confusione. – Jubobs

risposta

7

Per impostazione predefinita, git log mostra il registro del ramo corrente. Poiché il caricamento senza unione non cambia nulla nel ramo (locale) corrente, l'output git log non cambia.

git log può prendere l'opzione --all per mostrare la cronologia di tutti i rami, locale e remoto. In alternativa, è possibile elencare esplicitamente il ramo remoto come in git log origin/master.

4

Dopo il git fetch, il repository locale conosce le modifiche dal repository remoto ma non le ha ancora applicate ai rami locali.

senza parametri aggiuntivi mostra il log del ramo corrente e non sono state ancora unite le modifiche remote in quel ramo.

git pull fa git fetch e git merge FETCH_HEAD.

Il messaggio di errore indica che sono presenti modifiche non accettate nel repository locale. È possibile eseguire il commit o la memorizzazione (come indicato nel messaggio) e provare di nuovo merge (o pull).

4

hai scritto

However, git log did not show that update. Did I misunderstand what git fetch does? Am I missing something?

Lei sembra essere confuso su ciò che sia git log e git fetch fanno.

Partendo dal presupposto che una derivazione chiamata master è attualmente verificata (potrebbe anche essere nello stato A capo scollegato, ma manteniamo le cose semplici, per ragioni di questa spiegazione), il comando git log, senza altri argomenti, è equivalente a git log master. Questo comando dice a Git

Show me all the commits that are in the ancestry of the local master branch.

Tuttavia, è necessario capire che git fetch origin non influisce/Aggiorna la tua sedi locali, come ad esempio master. Invece, i nuovi commit da origin (o qualsiasi altro telecomando da cui si prelevano) vengono inseriti in remote-tracking branches.

I rami di localizzazione remota sono speciali filiali locali il cui unico scopo è quello di riflettere lo stato delle filiali che vivono in un repository remoto al momento dell'ultima comunicazione con il server. In particolare, non puoi impegnarti in rami di questo tipo.

Che probabilmente si desidera è quello di eseguire

git fetch origin 

per recuperare tutti i nuovi commit da origin e li mette nelle filiali remote-tracking (tra cui origin/master, qui), e poi

git log master..origin/master 

a mostra un log di tutti i "nuovi" commit che sono stati aggiunti sul ramo remoto master, ovvero il ramo che risiede sul server remoto che conosci come origin, di cui il ramo di tracciamento remoto origin/master tiene traccia.

+0

grazie per la modifica e la risposta anche :) – Adil

1

tuoi rami locali non vengono mai aggiornati da un recuperano, solo i rami di monitoraggio fanno, git pull d'altra parte fa,

git pull = git fetch + git merge

Non è possibile visualizzare tutti gli aggiornamenti in git log semplicemente beause si esegue sul ramo sbagliato, per visualizzare le modifiche da solo un git fetch allora avete bisogno di git log sul ramo destro, che nel tuo caso sarebbe

git log origin/master