Come visualizzare l'anteprima di git-pull senza eseguire il recupero?


204

È anche possibile?

Fondamentalmente, c'è un repository remoto da cui estraggo usando solo:

git pull

Ora, vorrei vedere in anteprima cosa cambierebbe questo pull (un diff) senza toccare nulla dalla mia parte. Il motivo è che la cosa che sto estraendo potrebbe non essere "buona" e voglio che qualcun altro lo risolva prima di rendere "sporco" il mio repository.


4
La tua modifica è strana. Fare un "git fetch" non modifica in alcun modo il tuo albero di lavoro, quindi non importa se hai apportato modifiche locali senza commit. Ed è poco chiara la parte del recupero che vuoi annullare, poiché non tocca l'albero di lavoro.
dkagedal,

Grazie dkagedal, ho scritto questo prima di capire appieno come funziona Git. Ho rimosso quella modifica.
Milan Babuškov,

Risposte:


234

Dopo aver eseguito un git fetch, eseguire un git log HEAD..origin/masterper mostrare le voci di registro tra l'ultimo commit comune e il ramo principale dell'origine. Per mostrare le differenze, usa o git log -p HEAD..origin/masterper mostrare ciascuna patch, oppuregit diff HEAD...origin/master (tre punti non due) per mostrare un singolo diff.

C'è di solito non è alcuna necessità di annullare un'operazione di recupero, perché facendo un preleveranno gli aggiornamenti solo le remote rami e nessuno dei tuoi rami. Se non sei disposto a fare un pull e unire tutti i commit remoti, puoi usare git cherry-pickper accettare solo i commit remoti specifici che desideri. Più tardi, quando sei pronto per ottenere tutto, agit pull volontà si fonderà nel resto degli impegni.

Aggiornamento: non sono del tutto sicuro del motivo per cui vuoi evitare l'uso di git fetch. Tutto ciò che fa git fetch è aggiornare la tua copia locale dei rami remoti. Questa copia locale non ha nulla a che fare con nessuna delle tue filiali e non ha nulla a che fare con le modifiche locali senza commit. Ho sentito parlare di persone che eseguono git fetch in un lavoro cron perché è così sicuro. (Di solito non consiglierei di farlo.)


Immagino di aver perso quella parte di "niente a che fare con i MIEI rami" durante la lettura dei documenti. Grazie.
Milano Babuškov,

1
Per qualche motivo che non funziona per me. Ho provato git diff HEAD ... origin / master e non ha ancora elencato alcuna modifica quando faccio 'pull origin master' recupera e unisce le modifiche. È perché ho impostato il repository remoto usando git remote add?
screenm0nkey

@ screenm0nkey: non lo so (senza conoscere ulteriori informazioni). Ti consiglio di aprire una nuova domanda da porre al riguardo, se non sei ancora sicuro.
Greg Hewgill,

1
Cosa funziona per me (dopo il recupero git): git log origin / master
slaman

2
git diff ...@{u}è lo stesso che git diff HEAD...origin/masterse l'origine / il padrone sono il ramo a monte
succulento

47

Penso che andare a prendere sia quello che stai cercando.

Tirerà le modifiche e gli oggetti senza trasferirli nell'indice del repository locale.

Possono essere uniti in seguito con git merge .

Man Page

Modifica: ulteriore spiegazione

Direttamente dal link Git- SVN Crash Course

Ora, come si ottengono nuove modifiche da un repository remoto? Li prendi:

git fetch http://host.xz/path/to/repo.git/ 

A questo punto sono nel tuo repository e puoi esaminarli usando:

git log origin 

Puoi anche diff le modifiche. Puoi anche usare git log HEAD..origin per vedere solo le modifiche che non hai nel tuo ramo. Quindi se desideri unirli, fai semplicemente:

git merge origin

Si noti che se non si specifica un ramo da recuperare, verrà automaticamente impostato il telecomando di tracciamento.

Leggere la pagina man ti darà onestamente la migliore comprensione delle opzioni e di come usarla.

Sto solo cercando di farlo con esempi e memoria, al momento non ho una scatola su cui provare. Dovresti guardare:

git log -p //log with diff

Un recupero può essere annullato con git reset --hard ( link ), tuttavia tutte le modifiche non confermate nel tuo albero andranno perse così come le modifiche che hai recuperato.


Se spieghi due cose, potrebbe essere buono: 1. come posso annullare git-fetch? 2. Come vedo il diff?
Milano Babuškov,

1
1) annullare git-fetch? 2) git diff HEAD..origin
Chris Vest,

Il diff è fatto come ha detto Christian, un recupero può essere annullato con git reset --hard, tuttavia tutte le modifiche non confermate nel tuo albero andranno perse così come le modifiche che hai recuperato.
Brian Gianforcaro,

Stai cercando git reset --softo --mixed? Controlla la manpage.
Aristotele Pagaltzis,

1
Se ho capito bene, non è necessario annullare un "git fetch" perché non tocca la tua copia di lavoro e nemmeno il tuo repository. "git fetch" memorizza oggetti e ref in .git / FETCH_HEAD
Thorsten Niehues

21

È possibile recuperare da un repository remoto, vedere le differenze e quindi estrarre o unire.

Questo è un esempio per un repository remoto chiamato origine un ramo chiamato mastertracking del ramo remoto origin/master:

git checkout master                                                  
git fetch                                        
git diff origin/master
git pull --rebase origin master

8

Ho creato un alias git personalizzato per farlo per me:

alias.changes=!git log --name-status HEAD..

con quello puoi fare questo:

$git fetch
$git changes origin

Questo ti offrirà un modo semplice e facile per visualizzare in anteprima le modifiche prima di fare un merge.


Tu sei dio. questo dovrebbe rientrare in git stesso
Z. Khullah,

3

Uso questi due comandi e posso vedere i file da cambiare.

  1. Prima eseguendo git fetch , fornisce un output come questo (parte dell'output):

    ...
    72f8433..c8af041 sviluppo -> origine / sviluppo
    ...

Questa operazione ci dà due ID di commit, il primo è quello vecchio e il secondo sarà il nuovo.

  1. Quindi confrontare questi due commit usando git diff

    git diff 72f8433..c8af041 | grep "diff --git"

Questo comando elencherà i file che verranno aggiornati:

diff --git a/app/controller/xxxx.php b/app/controller/xxxx.php
diff --git a/app/view/yyyy.php b/app/view/yyyy.php

Ad esempio app / controller / xxxx.php e app / view / yyyy.php verranno aggiornati.

Il confronto di due commit con git diff stampa tutti i file aggiornati con le righe modificate, ma con grep cerca e ottiene solo le righe contiene diff --git dall'output.


3

Potrei essere in ritardo alla festa, ma questo è qualcosa che mi ha infastidito troppo a lungo. Nella mia esperienza, preferirei vedere quali modifiche sono in sospeso piuttosto che aggiornare la mia copia di lavoro e gestirle.

Questo va nel ~/.gitconfigfile:

[alias]
        diffpull=!git fetch && git diff HEAD..@{u}

Recupera il ramo corrente, quindi fa una differenza tra la copia di lavoro e questo ramo recuperato. Quindi dovresti vedere solo i cambiamenti che verrebbero git pull.


1
Potresti scambiare la stringa ref per HEAD..@{u}? È più semplice e non richiede che il telecomando sia chiamato "origine" o che il tuo ramo sia chiamato come sul telecomando.
Michael - Dov'è Clay Shirky il

Questo è un alias ben fatto, ma non sono sicuro del perché tu voglia farlo in primo luogo. Dovrai affrontare i cambiamenti qualche volta, giusto? Dovresti essere in grado di interrompere la parte di unione git pullse non ti piace quello che sta facendo ... quindi non sono sicuro di quale sia il caso d'uso per questo.
Marnen Laibow-Koser,

So che ad un certo punto devo affrontare i cambiamenti, ma come ho scritto, a volte non voglio. Voglio solo sapere se qualcosa si romperà e devo riservare un po 'più di tempo per questo - o se posso semplicemente fare un git pullseguito. Penso anche che sia questa la domanda di op.
Andy P

-1

Se non vuoi che git-fetch aggiorni il tuo .git locale, copia semplicemente il tuo repository locale in una directory temporanea e fai un pull lì. Ecco una breve:

$ alias gtp="tar -c . | (cd /tmp && mkdir tp && cd tp && tar -x && git pull; rm -rf /tmp/tp)"

Ex.:

$ git status
# On branch master
nothing to commit (working directory clean)

$ gtp
remote: Finding sources: 100% (25/25)
remote: Total 25 (delta 10), reused 25 (delta 10)
Unpacking objects: 100% (25/25), done.
From ssh://my.git.domain/reapO
   32d61dc..05287d6  master     -> origin/master
Updating 32d61dc..05287d6
Fast-forward
 subdir/some.file       |    2 +-
 .../somepath/by.tes    |    3 ++-
 .../somepath/data      |   11 +++++++++++
 3 files changed, 14 insertions(+), 2 deletions(-)

$ git status
# On branch master
nothing to commit (working directory clean)

$ git fetch
remote: Finding sources: 100% (25/25)
remote: Total 25 (delta 10), reused 25 (delta 10)
Unpacking objects: 100% (25/25), done.
From ssh://my.git.domain/reapO
   32d61dc..05287d6  master     -> origin/master

$ git status
# On branch master
# Your branch is behind 'origin/master' by 3 commits, and can be fast-forwarded.
#
nothing to commit (working directory clean)

'gtp' deve essere eseguito nella radice del repository locale, dove si trova .git.
AX Labs

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.