Git: come verificare se un repo locale è aggiornato?


85

Vorrei sapere se il mio repository locale è aggiornato (e in caso contrario, idealmente, vorrei vedere le modifiche).

Come posso verificarlo senza fare git fetcho git pull?

Risposte:


96

Prova git fetch --dry-run Il manuale ( git help fetch) dice:

--dry-run
Show what would be done, without making any changes.

3
Grazie! Tuttavia, è difficile capire dall'output quali file sono stati aggiunti / modificati / rimossi.
Misha Moroshko

1
Puoi vedere quali tag vengono aggiornati e l'intervallo di commit start..end per i vari rami. Se questo non è sufficiente, fallo come un corretto fetch (non pull) che ti darà una copia locale appropriata, separata, del telecomando, senza influenzare il tuo lavoro di filiale. Un pull tenterebbe di unire i due, che non è quello che vuoi. Il trasferimento dei dati è lo stesso sia che tu corra a secco o meno.
Philip Oakley,

4
perché quando corro git fetch --dry-runnon si vede niente?
Paramvir Singh Karwal

3
@ParamvirSinghKarwal Git è scarso in ciò che riporta. Se non c'è niente da dire, non dice niente, come se non fosse successo niente. Forse sei aggiornato per il refspec del tuo normale recupero. Forse aggiungere --all?
Philip Oakley

2
@AaronBeall Se questo è il caso, molto probabilmente significa che hai già recuperato le modifiche localmente (quindi niente da recuperare), ma non le hai ancora unite al tuo ramo. git pullè più o meno equivalente a a git fetch && git merge. Se in qualsiasi momento hai eseguito il recupero senza --dry-run, allora hai già recuperato le cose localmente.
DuckPuppy

36
git remote show origin

Risultato:

HEAD branch: master
  Remote branch:
    master tracked
  Local branch configured for 'git pull':
    master merges with remote master
  Local ref configured for 'git push':
    master pushes to master (local out of date) <-------

Questo elenca i rami di tutti i tempi. Se hai un repository con una lunga cronologia, l'output è piuttosto disordinato.
Paulo Carvalho

28

Primo utilizzo git remote update, per aggiornare i tuoi ref del telecomando. Quindi puoi fare una delle diverse cose, come ad esempio:

  1. git status -unoti dirà se il ramo che stai monitorando è avanti, indietro o è divergente. Se non dice nulla, locale e remoto sono la stessa cosa. Risultato del campione:

Sul ramo DEV

Il tuo ramo è dietro 'origine / DEV' di 7 commit e può essere fatto avanzare rapidamente.

(usa "git pull" per aggiornare il tuo ramo locale)

  1. git show-branch *master ti mostrerà i commit in tutti i rami i cui nomi terminano con "master" (ad esempio master e origin / master).

Se usi -vcon git remote update ( git remote -v update) puoi vedere quali rami sono stati aggiornati, quindi non hai davvero bisogno di ulteriori comandi.


2
Perché tutto questo è così basso? git remote update ; git status -unorisolto. git fetch --dry-runnon ha dato alcun output anche nei casi in cui il locale era dietro il telecomando.
Aaron Beall

17

puoi utilizzare git status -unoper verificare se la tua filiale locale è aggiornata con quella di origine.


19
Fornisce solo lo stato locale, non controlla con il ramo remoto.
Ishan Liyanage

4
Dà solo locale, ma ha git remote update ; git status -unofatto il trucco! Non ha git fetch --dry-rundato output quando me lo aspettavo (e git pullavrebbe tirato le cose).
Aaron Beall

1
Questa risposta è sbagliata e dovrebbe essere cancellata. Così com'è, perpetua un mito molto comune ma sbagliato su come funziona Git, uno che viene dissipato solo quando / se qualcuno decide di leggere i commenti ad esso.
Prometeo

8

Non proprio, ma non vedo come git fetchpotrebbe ferire perché non cambierà nessuno dei tuoi rami locali.


Sono completamente d'accordo. Git pull può essere dannoso, sovrascrivendo i file. Ma git fetch estrae solo i metadati, consentendo a comandi come git status di dirti se il tuo repository locale è aggiornato o meno senza sovrascrivere alcun file. Potrebbe non rispondere alla lettera della domanda, ma risponde allo spirito della domanda, dandoti lo strumento che desideri. Git fetch, quindi git status ti dirà dove si trova il tuo repository locale in relazione al telecomando senza sovrascrivere i file.
merlit64

5

Un'altra alternativa è visualizzare lo stato del ramo remoto usando git show-branch remote/branchper usarlo come confronto che potresti vedere git show-branch *branchper vedere il ramo in tutti i telecomandi oltre che nel tuo repository! controlla questa risposta per ulteriori https://stackoverflow.com/a/3278427/2711378


5

Dovrai emettere due comandi:

  1. git fetch origin
  2. stato git

1
Funziona ma la domanda dice chiaramente senza "fetch". Ci sono molti casi in cui si desidera sapere in che modo il repository locale è diverso dal repository remoto senza effettivamente recuperare o unire le modifiche.
pedram bashiri

1
@pedrambashiri Sono sinceramente curioso, come cosa? Per quanto ne so, un solo recupero non può mai danneggiare nulla.
Prometeo

@Prometheus per prima cosa, volevo solo sottolineare che quando una domanda afferma chiaramente "senza recupero" semplicemente non puoi usare il recupero nella tua risposta, se non c'è altro modo per farlo, o nessun motivo reale per farlo senza, è necessario da spiegare nella risposta. Ma per rispondere alla tua domanda, un recupero aggiorna la tua copia locale del repository remoto. Guarda il diagramma in questo post blog.osteele.com/2008/05/my-git-workflow
pedram bashiri

4

È necessario eseguire git fetchprima di poter confrontare il proprio repository locale con i file sul server remoto.

Questo comando aggiorna solo i rami del monitoraggio remoto e non influirà sul tuo albero di lavoro finché non chiami git mergeo git pull.

Per vedere la differenza tra il tuo ramo locale e il tuo ramo di tracciamento remoto una volta scaricato puoi usare git diff o git cherry come spiegato qui.


2

Se usi

git fetch --dry-run -v <link/to/remote/git/repo>

riceverai un feedback sul fatto che sia aggiornato. Quindi, in pratica, devi solo aggiungere l'opzione "verbose" alla risposta data in precedenza.


1

Questo è impossibile senza usare git fetcho git pull. Come puoi sapere se il repository è "aggiornato" o meno senza andare al repository remoto per vedere cosa significa "aggiornato"?


5
Per favore confermalo! Hai appena risposto a quello che pensi! Dovresti stare più attento perché i neofiti cadranno con esso!
Amanuel Nega

4
@AmanuelNega: questa è solo logica di base. Se si desidera sapere se il repository locale si trova nello stesso stato del repository remoto, è necessario conoscere lo stato del repository remoto. Periodo. Se non si conosce lo stato del repository remoto, non è possibile sapere se il repository locale si trova nello stesso stato. Si noti che utilizza la risposta più votata e accettata git pull, cosa che l'OP vieta esplicitamente nella sua domanda.
Jörg W Mittag

2
Essere informato! git status -unofunziona e si può anche usare git show-branch *masterper vedere lo stato di tutti i rami principali! Stai ancora dicendo che è impossibile? Puoi vedere lo stato di qualsiasi filiale purché tu abbia accesso al telecomando!
Amanuel Nega

2
@AmanuelNega: git statusti dice solo lo stato dei tuoi ref locali, non ti dice se i tuoi ref locali sono aggiornati con i ref remoti. Di nuovo: è semplicemente logicamente impossibile sapere qual è lo stato del repository remoto senza ottenere lo stato del repository remoto. Periodo. Queste sono solo le leggi fondamentali dello spaziotempo.
Jörg W Mittag

6
Non è "logicamente" impossibile dal momento che evidentemente si potrebbe chiamare qualcuno nella tua stanza dei server e dire "qual è l'hash della tua TESTA sul ramo principale" potrebbero dirti e poi potresti controllare in locale e vedere che non lo fai ho quell'hash. Ora sai che non sono sincronizzati.
James Robinson

1

ho provato a formattare la mia risposta, ma non ci sono riuscito. Per favore stackoverflow team, perché pubblicare la risposta è così difficile.

tuttavia,

risposta:
git fetch origin
git status (vedrai un risultato come "Il tuo ramo è dietro 'origin / master' di 9 commit")
per aggiornare alle modifiche remote: git pull

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.