Modifica dei dettagli dopo Git pull


130

Dopo un pull di Git, il suo output fornisce un riepilogo dell'importo della modifica.

Come posso vedere ogni o alcuni dei cambiamenti dettagliati dei file?

Ok, ecco la mia domanda a Jefromi:

  1. Come faccio a sapere se stavo tirando dal maestro? Tutto quello che ho fatto è "git pull".

  2. Cosa indica master e qual è la differenza tra master e HEAD, i due head predefiniti di Git?

  3. Come posso vedere la modifica dettagliata in un file specifico?

  4. Come vedo di nuovo la modifica nell'output di riepilogo dell'ultimo git pull?

  5. Qual è la differenza tra git diffe git whatchanged?


4
Bene, questa ripetuta aggiunta di nuove domande tramite le modifiche non è esattamente il modo in cui il sistema è destinato a essere utilizzato. Puoi anche rispondere facilmente a molte delle tue domande guardando le pagine man o semplicemente provando cose. Ad esempio, git diffgenera chiaramente un diff, mentre git whatchangedmostra chiaramente un elenco di informazioni di commit, ognuna contenente un elenco di quali file sono stati modificati.
Cascabel,

Probabilmente a causa della tua bassa reputazione.
TED

@TED ​​Ci vogliono solo 50 rappresentanti per lasciare commenti e 15 per votare.
Cascabel,

Sul mio laptop con Ubuntu, a volte funziona a volte no. Ho trovato temporaneamente un altro computer con Centos e sto facendo questo commento. Su entrambi i computer sto usando Firefox.
Tim

Molto strano. Potresti andare a meta e vedere se è un problema noto / segnalarlo.
Cascabel,

Risposte:


204

Supponiamo che stai tirando verso il maestro. È possibile fare riferimento alla posizione precedente di masterby master@{1}(o anche master@{10.minutes.ago}, vedere la sezione revisioni Specifica della pagina man git-rev-parse ), in modo da poter fare le cose come

  • Vedi tutte le modifiche: git diff master@{1} master

  • Vedi le modifiche a un determinato file: git diff master@{1} master <file>

  • Vedi tutte le modifiche all'interno di una determinata directory: git diff master@{1} master <dir>

  • Vedi di nuovo il riepilogo delle modifiche: git diff --stat master@{1} master

Per quanto riguarda la tua domanda su "come faccio a sapere se sono padrone" ... beh, usare i rami è una parte importante del flusso di lavoro di Git. Devi sempre essere consapevole del ramo in cui ti trovi: se hai apportato modifiche, desideri portarle nel ramo giusto! Puoi vedere un elenco di tutti i rami, con un asterisco di quello attualmente estratto, con il comando git branch. Viene inoltre stampato il nome del ramo corrente insieme all'output di git status. Consiglio vivamente di sfogliare le pagine man dei comandi da usare: è un ottimo modo per acquisire lentamente alcune conoscenze.

E la tua ultima domanda: HEADè il nome del ramo attualmente estratto. Puoi davvero usare HEADe anche HEAD@{1}in questo contesto, ma è un po 'più robusto usare i rami, poiché se vai a dare un'occhiata a un altro ramo. HEADè ora quel secondo ramo, ed HEAD@{1}è ora master- non quello che vuoi!

Per evitare di dover fare molte piccole domande come questa, probabilmente dovresti dare un'occhiata a un tutorial Git. Ce ne sono un milione sul Web, ad esempio:


5
è meglio della mia soluzione :)
Christian Oudard,

2
So che questo è vecchio, ma ... Dovrebbe essere il contrario:, git diff master@{1} masteraltrimenti il ​​cambiamento è mostrato "all'indietro", cioè inserimenti diventano cancellazioni ecc.
Ultracrepidarian

2
git diff master@{1} masternon ha funzionato per me invece ha git diff master~1 masterfatto il lavoro per me.
unrealsoul007,

5
@ unrealsoul007 Quindi la tua situazione era diversa. master ~ 1 è il commit parent del master che sta puntando al momento; vedrai il diff solo per quel commit. master @ {1} è indicato dal master di commit precedente; se per esempio hai appena tirato, quella sarebbe la posizione di maestro prima del tiro come descritto qui. Se non lo ha fatto, probabilmente hai fatto qualcos'altro da padroneggiare da quando hai tirato. Provaregit reflog master di capire cosa.
Cascabel,

@Jefromi fatal: ambiguous argument 'firstDesign@': unknown revision or path not in the working tree. Continuo a ricevere questo errore. Sebbene git reflog firstDesign abbia questo output .
unrealsoul007,

52

Di 'che fai un pull git in questo modo:

$ git pull
remote: Counting objects: 10, done.
remote: Compressing objects: 100% (6/6), done.
remote: Total 6 (delta 4), reused 0 (delta 0)
Unpacking objects: 100% (6/6), done.
From git@dev.example.com:reponame
   a407564..9f52bed  branchname   -> origin/branchname
Updating a407564..9f52bed
Fast forward
 .../folder/filename          |  209 ++++++++-----
 .../folder2/filename2        |  120 +++++++++++---------
 2 files changed, 210 insertions(+), 119 deletions(-)

Puoi vedere il diff di ciò che è cambiato usando i numeri di revisione:

$ git diff a407564..9f52bed

5
E puoi ottenere il riepilogo utilizzando " git diff --stat a407564..9f52bed" o solo per un riepilogo " git diff --summary a407564..9f52bed"
Jakub Narębski,

14
Per le versioni più recenti di git, git pull non genera più l'elenco dei file che sono stati modificati. Per farlo, devi fare `git pull --stat '
user10

6

1. Come faccio a sapere se stavo tirando a master? Tutto quello che ho fatto è "git pull".

Il comando stesso funziona in questo modo:

git pull [options] [<repository> [<refspec>…]]

e per impostazione predefinita si riferisce al ramo corrente. Puoi controllare i tuoi rami usando

git branch -a

Questo elencherà le tue filiali locali e remote come ad esempio (aggiunto un --- divisore tra locale e remoto per renderlo più chiaro)

*master
foo
bar
baz
---
origin/HEAD -> origin/master
origin/deploy
origin/foo
origin/master
origin/bar
remote2/foo
remote2/baz

Quando dai un'occhiata a un repository remoto, vedrai a cosa ti riferisci:

git remote show origin

elencherà come segue:

* remote origin
  Fetch URL: ssh://git@git.example.com:12345/username/somerepo.git
  Push  URL: ssh://git@git.example.com:12345/username/somerepo.git
  HEAD branch: master
  Remote branches:
    foo    tracked
    master tracked
  Local refs configured for 'git push':
    foo    pushes to foo    (up to date)
    master pushes to master (fast-forwardable)

Quindi è abbastanza facile essere sicuri da dove tirare e spingere.

3. come vedere la modifica dei dettagli in un file specifico?

4. come vedere di nuovo la modifica dell'output di riepilogo di last git pull?

Il modo più semplice ed elegante (imo) è:

git diff --stat master@{1}..master --dirstat=cumulative,files

Questo ti darà due blocchi di informazioni sui cambiamenti tra il tuo ultimo pull e lo stato attuale del lavoro. Esempio di output (ho aggiunto un --- divisore tra --state --dirstatoutput per renderlo più chiaro):

 mu-plugins/media_att_count.php                     |  0
 mu-plugins/phpinfo.php                             |  0
 mu-plugins/template_debug.php                      |  0
 themes/dev/archive.php                             |  0
 themes/dev/category.php                            | 42 ++++++++++++++++++
 .../page_templates/foo_template.php                |  0
 themes/dev/style.css                               |  0
 themes/dev/tag.php                                 | 44 +++++++++++++++++++
 themes/dev/taxonomy-post_format.php                | 41 +++++++++++++++++
 themes/dev/template_parts/bar_template.php         |  0
 themes/someproject/template_wrappers/loop_foo.php  | 51 ++++++++++++++++++++++
---
 11 files changed, 178 insertions(+)
  71.3% themes/dev/
  28.6% themes/someproject/template_wrappers/
 100.0% themes/
  27.2% mu-plugins/
   9.0% themes/dev/page_templates/
   9.0% themes/dev/template_parts/
  63.6% themes/dev/
   9.0% themes/someproject/template_wrappers/
  72.7% themes/

2

In questo modo è un po 'confuso, ma ti permetterà di usare strumenti grafici come gitko gitgo git-gui:

git pull
git reset HEAD@{1}
gitg (or gitk or whatever tool you like)

La risposta con il maggior numero di voti offre il modo migliore utilizzando lo strumento git, ma uso questo metodo perché posso quindi utilizzare gli strumenti con la GUI per vedere le modifiche: P

Avrei quindi il passaggio extra di fare un git checkout .e poi farlo di git pullnuovo in modo da tirare e unire correttamente, ma apprezzo la capacità di esaminare le differenze in una GUI abbastanza da affrontare i due passaggi aggiuntivi.

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.