Usando Git come posso trovare le modifiche tra locale e remoto
Domanda
Qui ci sono due domande diverse, ma penso che siano correlate.
-
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 in uscita
. -
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?
Soluzione
Git non può inviare quel tipo di informazioni sulla rete, come può fare Hg. Ma puoi eseguire git fetch
(che è più simile a hg pull
che hg fetch
) per recuperare nuovi commit dai tuoi server remoti.
Quindi, se hai un ramo chiamato master
e un telecomando chiamato origin
, dopo aver eseguito git fetch
, dovresti anche avere un ramo chiamato origin / master
. Puoi quindi ottenere il git log
di tutti i commit che master
deve essere un superset di origin / master
facendo 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 .
Altri suggerimenti
A partire da Git 1.7.0, esiste una sintassi speciale che consente di fare riferimento generico al ramo upstream: @ {u}
o @ {upstream}
.
Per imitare hg incoming
:
git log ..@{u}
Per imitare hg in uscita
:
git log @{u}..
Uso i seguenti alias incoming
e outgoing
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}..'
Non una risposta completa, ma git fetch attirerà il repository remoto e non eseguirà l'unione. Puoi quindi eseguire un
git diff master origin/master
-
Usa " git log origin..HEAD "
-
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". è il nome del ramo di tracciamento remoto (che è se hai usato clone con opzioni predefinite).
C'è anche questo, per confrontare tutti i rami:
git log --branches --not --remotes=origin
Ecco cosa dice la pagina man di git log a riguardo:
Mostra tutti i commit presenti in uno dei filiali locali ma non in nessuno dei filiali di tracciamento remoto per l'origine (ciò che hai quell'origine non è & # 8217; t).
Quanto sopra è per in uscita
.
Per in arrivo
, basta scambiare:
git log --remotes=origin --not --branches
Vorrei
$ git fetch --dry-run
per hg incoming
e
$ git push --dry-run
per hg in uscita
.
git-out è uno script che emula hg outgoing
in modo abbastanza accurato. Analizza " push -n " output, quindi produce output accurati se è necessario specificare argomenti aggiuntivi da inviare.
git incoming
$ git fetch && git log ..origin/master --stat
OR
$ git fetch && git log ..origin/master --patch
git outgoing
$ git fetch && git log origin/master.. --stat
OR
$ git fetch && git log origin/master.. --patch
Quando il " git log " e @ {u} risposte inizialmente mi hanno dato "revisione sconosciuta" errori, ho provato il suggerimento di Chris / romkyns di 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
Quando esegui git fetch, tutti i contenuti inclusi branch, tag (refs) vengono archiviati temporaneamente in .git / FETCH_HEAD il cui contenuto può essere visualizzato con il comando: git log FETCH_HEAD Se non usi il 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 una ciliegina se si desidera solo qualche commit da ciò che è stato portato da fetch.