Usando Git come posso trovare le modifiche tra locale e remoto


152

Qui ci sono due domande diverse, ma penso che siano correlate.

  1. Quando utilizzo Git, come posso trovare le modifiche che ho eseguito il commit a livello locale, ma che non ho ancora inviato a un ramo remoto? Sto cercando qualcosa di simile al comando Mercurial hg outgoing.

  2. Quando utilizzo Git, come posso trovare le modifiche apportate a un ramo remoto prima di eseguire un pull? Sto cercando qualcosa di simile al comando Mercurial hg incoming.

Per il secondo: c'è un modo per vedere cosa è disponibile e poi scegliere le modifiche che voglio tirare?


11
Guardando le risposte, sembra esserci un po 'di confusione su cosa hg incominge hg outgoingeffettivamente fare. L'equivalente Git più vicino che ho trovato è l' --dry-runopzione. Solo git pull --dry-rune vedrai un elenco di tutte le cose che devono accadere.
Roman Starkov,

Risposte:


97

Git non può inviare quel tipo di informazioni sulla rete, come può fare Hg. Ma puoi eseguire git fetch(che è più simile hg pulldi hg fetch) per recuperare nuovi commit dai tuoi server remoti.

Quindi, se hai un ramo chiamato mastere un telecomando chiamato origin, dopo l'esecuzione git fetch, dovresti anche avere un ramo chiamato origin/master. È quindi possibile ottenere git logtutte le commit che masterdevono essere un superinsieme di origin/masterfacendo git log master..origin/master. Invertire quei due per ottenere il contrario.

Un mio amico, David Dollar, ha creato un paio di script git shell per simulare hg incoming/outgoing. Puoi trovarli su http://github.com/ddollar/git-utils .


113

A partire da Git 1.7.0, esiste una sintassi speciale che consente di fare riferimento generico al ramo upstream: @{u}o @{upstream}.

Per simulare hg incoming:

git log ..@{u}

Per simulare hg outgoing:

git log @{u}..

Uso quanto segue incominge gli outgoingalias per semplificare l'utilizzo di quanto sopra:

git config --global alias.incoming '!git remote update -p; git log ..@{u}'
git config --global alias.outgoing 'log @{u}..'

git log .. @ {u} mi dà questi errori. (Ho sia origine che un repository upstream nella mia configurazione git). errore: Nessun ramo a monte trovato per '' errore: Nessun ramo a monte trovato per '..' errore: Nessun ramo a monte trovato per '..' fatale: argomento ambiguo '.. @ {u}': revisione sconosciuta o percorso non in l'albero di lavoro. Usa '-' per separare i percorsi dalle revisioni
Henrik,

6
Otterrai questi errori se la tua filiale locale non è configurata con un upstream. Per risolvere, esegui git branch --set-upstream foo origin/foo.
Richard Hansen,

git log @{u}..elenca ogni singola modifica nel repository per me. Non c'è modo che non esistano ancora.
Roman Starkov,

@romkyns: è possibile che il tuo ramo locale abbia il ramo remoto sbagliato configurato come upstream. Assicurarsi di git rev-parse --symbolic-full-name @{u}stampare il riferimento remoto appropriato. Inoltre, git log @{u}..mostra i commit che non sono raggiungibili dal ramo upstream, che può includere i commit già presenti nel repository remoto (se sono raggiungibili con un riferimento diverso). Questo accadrà subito dopo la fusione in un ramo già spinto.
Richard Hansen,

@RichardHansen Temo di essere troppo indifferente per sapere cosa sarebbe appropriato per un riferimento remoto, tuttavia questo è stato un repository appena clonato su cui ho fatto solo un checkout <somebranch>e merge <otherbranch>. A questo punto, ho fatto il log @{u}..e ho visto ogni modifica elencata.
Roman Starkov,

42

Non una risposta completa, ma git fetch attirerà il repository remoto e non eseguirà l'unione. È quindi possibile fare un

git diff origine / master principale


1
Ha funzionato per me (ma al contrario) -git diff origin/master master
Nick Grealy,

34
  1. Usa "git log origin..HEAD"

  2. Usa "git fetch" seguito da "git log HEAD..origin". Puoi selezionare i singoli commit utilizzando gli ID di commit elencati.

Quanto sopra presuppone, ovviamente, che "origine" sia il nome del tuo ramo di tracciamento remoto (che è se hai usato clone con opzioni predefinite).


3
(E se non stai monitorando il ramo remoto, è "git log origin / master..HEAD".)
plindberg

4
"origine" non è il nome del ramo di tracciamento remoto, è il nome del telecomando. E solo specificare il nome remoto non funziona, devi specificare il ramo di tracciamento remoto, che sarebbe origin / master.
Robininst

22

C'è anche questo, per confrontare tutti i rami:

git log --branches --not --remotes=origin

Questo è ciò che dice la pagina man di git log a riguardo:

Mostra tutti i commit che si trovano in una delle filiali locali ma non in nessuna delle filiali di tracciamento remoto per l'origine (ciò che hai quell'origine non lo fa).

Quanto sopra è per outgoing. Per incoming, basta scambiare:

git log --remotes=origin --not --branches

8

farei

$ git fetch --dry-run

per hg incominge

$ git push --dry-run

per hg outgoing.


Siamo spiacenti, ho trascurato che questo era già stato detto come commento all'OP.
chris,

1

git-out è uno script che emula in modo hg outgoingabbastanza accurato. Analizza l'output "push -n", quindi produce un output accurato se è necessario specificare ulteriori argomenti da inviare.


0

git in arrivo

$ git fetch && git log ..origin/master --stat
OR
$ git fetch && git log ..origin/master --patch

git in uscita

$ git fetch && git log origin/master.. --stat
OR
$ git fetch && git log origin/master.. --patch

0

Quando il "git log" e le risposte @ {u} inizialmente mi hanno dato errori di "revisione sconosciuta", ho provato il suggerimento di Chris / romkyns git push --dry-run.

Otterrai un output come "5905..4878 master-> master". 5905 è l'ultimo commit che il telecomando ha e commette (e incluso) 4878 verrà applicato al telecomando.

È quindi possibile utilizzare 5905..4878 come argomenti per diversi altri comandi git per ottenere maggiori dettagli:

git diff 5905..4878 # Gives full code changes in diff style

git log --online 5905..4878 # Displays each commit's comment

-1

Quando esegui git fetch, tutti i contenuti inclusi rami, tag (ref) vengono temporaneamente archiviati in .git / FETCH_HEAD il cui contenuto può essere visualizzato con il comando: git log FETCH_HEAD Se non usi suffisso -a con git fetch, per impostazione predefinita , I contenuti di FETCH_HEAD verranno sovrascritti da nuovi contenuti. Da questi contenuti, è possibile visualizzare e decidere in quale ramo si desidera unirli se lo si fa o si può semplicemente scegliere la ciliegia se si desidera solo un paio di commit da ciò che è stato portato dal recupero.

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.