2014-09-01 15 views
13

Come sono i comandi git log -p, git show e git diff correlati e perché uno dovrebbe essere usato su un altro?git log -p vs. git show vs git diff

dato un pronti contro termine con i seguenti 4 commit:

commitd - ultimo commettere
commitc
commitb
coomita - iniziale commettere

Quali sono le differenze tra i seguenti comandi git ?:

git log -p commitb commitd 
git show commitb commitd 
git diff commitb commitd 

git log -p commitd commitb 
git show commitd commitb 
git diff commitd commitb 

git log -p commitb..commitd 
git show commitb..commitd 
git diff commitb..commitd 

git log -p commitd..commitb 
git show commitd..commitb 
git diff commitd..commitb 

git log -p commitb...commitd 
git show commitb...commitd 
git diff commitb...commitd 

git log -p commitd...commitb 
git show commitd...commitb 
git diff commitd...commitb 
+0

ho aperto più finestre di terminale e corse tutti i comandi, ma non ho potuto trarre generalizzazioni che avesse senso. Dopo aver provato a capirlo da solo per un paio di giorni e senza fortuna con il mio google-fu ho pensato che mi mancasse qualcosa così ho postato la domanda qui. –

+1

Vedere [la documentazione di gitrevisions] (https://www.kernel.org/pub/software/scm/git/docs/gitrevisions.html). Se sai qualcosa sulla teoria dei grafi, dovrebbe aiutare molto; in caso contrario, potrebbe essere abbastanza opaco. Inoltre, sembra che le pagine man di kernel.org (che ho linkato a) non siano più aggiornate ... – torek

+1

@torek grazie per l'eccellente referenza. Non riesco a convincere la teoria dei grafi al di fuori del sapere che Git usa un DAG ma vorrei che le risorse per principianti là fuori iniziassero con una spiegazione dei dettagli perché non mi sento sicuro al 100% che so cosa fare nel mio quotidiano interazioni con Git, anche se ho già affrontato le basi diverse volte. –

risposta

20

git log A B mostra la cronologia di entrambi i commit A e B (in pratica generando un set unione della cronologia di ciascun commit). Di solito si desidera , che può anche essere scritto come git log ^B A (mostrare tutto raggiungibile da A, ma non (^) da B). Questo intervallo può anche essere vuoto (ad esempio, B..A sarebbe vuoto, poiché ogni commit raggiungibile da B è anche raggiungibile da A). Pertanto, non si ottiene alcun output da git log se utilizzato con gli argomenti "errati".

git show è un comando molto versatile e produce output diversi a seconda dei suoi argomenti. Puoi passare uno o più commit e ti mostrerà le informazioni di commit (paternità, timestamp, messaggio di commit, diff da commit precedente). I range di commit come a..d verranno risolti e ogni commit verrà mostrato individualmente. Puoi anche passare un percorso e git show ti mostrerà il contenuto del file. È inoltre possibile specificare un file a una determinata revisione con la sintassi commit:path/to/file. Se si passa una directory, git show visualizzerà le informazioni di commit dell'ultimo commit che modifica quella directory.

git diff generalmente prevede due alberi o due file da confrontare. (Può anche non accettare argomenti e confrontare invece l'indice/area di stadiazione). Un commit è automaticamente unwrapped nell'albero corrispondente (un oggetto tree descrive un determinato stato del repository). La sintassi A..B è in silenzio deliberato di A B per il caso diff e mostrerà le modifiche necessarie per ottenere da impegnarsi/albero A-B

La gamma A...B significa "ogni commit raggiungibile da A o B, ma non da entrambi".

  • Quando viene utilizzato con git log vi mostrerà quei impegna ed è per lo più senso solo quando viene utilizzato con rami divergevano, vale a dire "spettacolo ogni che è diverso tra i due, ma nascondere quelle commit che entrambi i rami hanno in comune".
  • Per git diff questa sintassi è zucchero sintattico per git diff $(git merge-base A B) B, vale a dire "cambiamenti nel B quanto la storia del A discostato.
  • Con git show vi sarà semplicemente ottenere impegnarsi informazioni per ogni singola impegnarsi in tale intervallo.

Se qualcosa non è ancora chiaro, fammelo sapere nei commenti.


ecco l'output del repository in cui hai postato tua domanda iniziale:

$ git init 
Initialized empty Git repository in ... 
$ cd SO 
$ ls 
$ echo a > a 
$ git add a 
$ git commit 
[master (root-commit) 7b66fe5] initial commit 
1 file changed, 1 insertion(+) 
create mode 100644 a 
$ git tag a 
$ echo b >> a 
$ echo b > b 
$ git add a b 
$ git commit 
[master ee884fe] commit b 
2 files changed, 2 insertions(+) 
create mode 100644 b 
$ git tag b 
$ echo c >> a 
$ echo c >> b 
$ echo c > c 
$ git add a b c 
$ git commit 
[master 8abaaff] commit c 
3 files changed, 3 insertions(+) 
create mode 100644 c 
$ git tag c 
$ echo d >> a 
$ echo d > b 
$ git add a b 
$ git commit 
[master 08adc85] commit d 
2 files changed, 2 insertions(+), 2 deletions(-) 
$ git tag d 
$ git log -p b d -- 
commit 08adc8512e63588e6f01533b2a0f762342521b05 
Author: ... 
Date: Mon Sep 1 17:22:06 2014 +0200 

    commit d 

diff --git a/a b/a 
index de98044..d68dd40 100644 
--- a/a 
+++ b/a 
@@ -1,3 +1,4 @@ 
a 
b 
c 
+d 
diff --git a/b b/b 
index 9ddeb5c..4bcfe98 100644 
--- a/b 
+++ b/b 
@@ -1,2 +1 @@ 
-b 
-c 
+d 

commit 8abaaff681be0bcaa16c946feb2989959348c9f4 
Author: ... 
Date: Mon Sep 1 17:21:40 2014 +0200 

    commit c 

diff --git a/a b/a 
index 422c2b7..de98044 100644 
--- a/a 
+++ b/a 
@@ -1,2 +1,3 @@ 
a 
b 
+c 
diff --git a/b b/b 
index 6178079..9ddeb5c 100644 
--- a/b 
+++ b/b 
@@ -1 +1,2 @@ 
b 
+c 
diff --git a/c b/c 
new file mode 100644 
index 0000000..f2ad6c7 
--- /dev/null 
+++ b/c 
@@ -0,0 +1 @@ 
+c 

commit ee884fea5d0266280845348175ac0af5083a9bbf 
Author: ... 
Date: Mon Sep 1 17:21:05 2014 +0200 

    commit b 

diff --git a/a b/a 
index 7898192..422c2b7 100644 
--- a/a 
+++ b/a 
@@ -1 +1,2 @@ 
a 
+b 
diff --git a/b b/b 
new file mode 100644 
index 0000000..6178079 
--- /dev/null 
+++ b/b 
@@ -0,0 +1 @@ 
+b 

commit 7b66fe5999039c53ffbe5a5ffe07c13a5c213455 
Author: ... 
Date: Mon Sep 1 17:20:39 2014 +0200 

    initial commit 

diff --git a/a b/a 
new file mode 100644 
index 0000000..7898192 
--- /dev/null 
+++ b/a 
@@ -0,0 +1 @@ 
+a 
$ git show b d -- 
commit ee884fea5d0266280845348175ac0af5083a9bbf 
Author: ... 
Date: Mon Sep 1 17:21:05 2014 +0200 

    commit b 

diff --git a/a b/a 
index 7898192..422c2b7 100644 
--- a/a 
+++ b/a 
@@ -1 +1,2 @@ 
a 
+b 
diff --git a/b b/b 
new file mode 100644 
index 0000000..6178079 
--- /dev/null 
+++ b/b 
@@ -0,0 +1 @@ 
+b 

commit 08adc8512e63588e6f01533b2a0f762342521b05 
Author: ... 
Date: Mon Sep 1 17:22:06 2014 +0200 

    commit d 

diff --git a/a b/a 
index de98044..d68dd40 100644 
--- a/a 
+++ b/a 
@@ -1,3 +1,4 @@ 
a 
b 
c 
+d 
diff --git a/b b/b 
index 9ddeb5c..4bcfe98 100644 
--- a/b 
+++ b/b 
@@ -1,2 +1 @@ 
-b 
-c 
+d 
$ git diff b d -- 
diff --git a/a b/a 
index 422c2b7..d68dd40 100644 
--- a/a 
+++ b/a 
@@ -1,2 +1,4 @@ 
a 
b 
+c 
+d 
diff --git a/b b/b 
index 6178079..4bcfe98 100644 
--- a/b 
+++ b/b 
@@ -1 +1 @@ 
-b 
+d 
diff --git a/c b/c 
new file mode 100644 
index 0000000..f2ad6c7 
--- /dev/null 
+++ b/c 
@@ -0,0 +1 @@ 
+c 
$ git log -p d b -- 
commit 08adc8512e63588e6f01533b2a0f762342521b05 
Author: ... 
Date: Mon Sep 1 17:22:06 2014 +0200 

    commit d 

diff --git a/a b/a 
index de98044..d68dd40 100644 
--- a/a 
+++ b/a 
@@ -1,3 +1,4 @@ 
a 
b 
c 
+d 
diff --git a/b b/b 
index 9ddeb5c..4bcfe98 100644 
--- a/b 
+++ b/b 
@@ -1,2 +1 @@ 
-b 
-c 
+d 

commit 8abaaff681be0bcaa16c946feb2989959348c9f4 
Author: ... 
Date: Mon Sep 1 17:21:40 2014 +0200 

    commit c 

diff --git a/a b/a 
index 422c2b7..de98044 100644 
--- a/a 
+++ b/a 
@@ -1,2 +1,3 @@ 
a 
b 
+c 
diff --git a/b b/b 
index 6178079..9ddeb5c 100644 
--- a/b 
+++ b/b 
@@ -1 +1,2 @@ 
b 
+c 
diff --git a/c b/c 
new file mode 100644 
index 0000000..f2ad6c7 
--- /dev/null 
+++ b/c 
@@ -0,0 +1 @@ 
+c 

commit ee884fea5d0266280845348175ac0af5083a9bbf 
Author: ... 
Date: Mon Sep 1 17:21:05 2014 +0200 

    commit b 

diff --git a/a b/a 
index 7898192..422c2b7 100644 
--- a/a 
+++ b/a 
@@ -1 +1,2 @@ 
a 
+b 
diff --git a/b b/b 
new file mode 100644 
index 0000000..6178079 
--- /dev/null 
+++ b/b 
@@ -0,0 +1 @@ 
+b 

commit 7b66fe5999039c53ffbe5a5ffe07c13a5c213455 
Author: ... 
Date: Mon Sep 1 17:20:39 2014 +0200 

    initial commit 

diff --git a/a b/a 
new file mode 100644 
index 0000000..7898192 
--- /dev/null 
+++ b/a 
@@ -0,0 +1 @@ 
+a 
$ git show d b -- 
commit 08adc8512e63588e6f01533b2a0f762342521b05 
Author: ... 
Date: Mon Sep 1 17:22:06 2014 +0200 

    commit d 

diff --git a/a b/a 
index de98044..d68dd40 100644 
--- a/a 
+++ b/a 
@@ -1,3 +1,4 @@ 
a 
b 
c 
+d 
diff --git a/b b/b 
index 9ddeb5c..4bcfe98 100644 
--- a/b 
+++ b/b 
@@ -1,2 +1 @@ 
-b 
-c 
+d 

commit ee884fea5d0266280845348175ac0af5083a9bbf 
Author: ... 
Date: Mon Sep 1 17:21:05 2014 +0200 

    commit b 

diff --git a/a b/a 
index 7898192..422c2b7 100644 
--- a/a 
+++ b/a 
@@ -1 +1,2 @@ 
a 
+b 
diff --git a/b b/b 
new file mode 100644 
index 0000000..6178079 
--- /dev/null 
+++ b/b 
@@ -0,0 +1 @@ 
+b 
$ git diff d b -- 
diff --git a/a b/a 
index d68dd40..422c2b7 100644 
--- a/a 
+++ b/a 
@@ -1,4 +1,2 @@ 
a 
b 
-c 
-d 
diff --git a/b b/b 
index 4bcfe98..6178079 100644 
--- a/b 
+++ b/b 
@@ -1 +1 @@ 
-d 
+b 
diff --git a/c b/c 
deleted file mode 100644 
index f2ad6c7..0000000 
--- a/c 
+++ /dev/null 
@@ -1 +0,0 @@ 
-c 
$ git log -p b..d -- 
commit 08adc8512e63588e6f01533b2a0f762342521b05 
Author: ... 
Date: Mon Sep 1 17:22:06 2014 +0200 

    commit d 

diff --git a/a b/a 
index de98044..d68dd40 100644 
--- a/a 
+++ b/a 
@@ -1,3 +1,4 @@ 
a 
b 
c 
+d 
diff --git a/b b/b 
index 9ddeb5c..4bcfe98 100644 
--- a/b 
+++ b/b 
@@ -1,2 +1 @@ 
-b 
-c 
+d 

commit 8abaaff681be0bcaa16c946feb2989959348c9f4 
Author: ... 
Date: Mon Sep 1 17:21:40 2014 +0200 

    commit c 

diff --git a/a b/a 
index 422c2b7..de98044 100644 
--- a/a 
+++ b/a 
@@ -1,2 +1,3 @@ 
a 
b 
+c 
diff --git a/b b/b 
index 6178079..9ddeb5c 100644 
--- a/b 
+++ b/b 
@@ -1 +1,2 @@ 
b 
+c 
diff --git a/c b/c 
new file mode 100644 
index 0000000..f2ad6c7 
--- /dev/null 
+++ b/c 
@@ -0,0 +1 @@ 
+c 
$ git show b..d -- 
commit 08adc8512e63588e6f01533b2a0f762342521b05 
Author: ... 
Date: Mon Sep 1 17:22:06 2014 +0200 

    commit d 

diff --git a/a b/a 
index de98044..d68dd40 100644 
--- a/a 
+++ b/a 
@@ -1,3 +1,4 @@ 
a 
b 
c 
+d 
diff --git a/b b/b 
index 9ddeb5c..4bcfe98 100644 
--- a/b 
+++ b/b 
@@ -1,2 +1 @@ 
-b 
-c 
+d 

commit 8abaaff681be0bcaa16c946feb2989959348c9f4 
Author: ... 
Date: Mon Sep 1 17:21:40 2014 +0200 

    commit c 

diff --git a/a b/a 
index 422c2b7..de98044 100644 
--- a/a 
+++ b/a 
@@ -1,2 +1,3 @@ 
a 
b 
+c 
diff --git a/b b/b 
index 6178079..9ddeb5c 100644 
--- a/b 
+++ b/b 
@@ -1 +1,2 @@ 
b 
+c 
diff --git a/c b/c 
new file mode 100644 
index 0000000..f2ad6c7 
--- /dev/null 
+++ b/c 
@@ -0,0 +1 @@ 
+c 
$ git diff b..d -- 
diff --git a/a b/a 
index 422c2b7..d68dd40 100644 
--- a/a 
+++ b/a 
@@ -1,2 +1,4 @@ 
a 
b 
+c 
+d 
diff --git a/b b/b 
index 6178079..4bcfe98 100644 
--- a/b 
+++ b/b 
@@ -1 +1 @@ 
-b 
+d 
diff --git a/c b/c 
new file mode 100644 
index 0000000..f2ad6c7 
--- /dev/null 
+++ b/c 
@@ -0,0 +1 @@ 
+c 
$ git log -p d..b -- 
$ git show d..b -- 
$ git diff d..b -- 
diff --git a/a b/a 
index d68dd40..422c2b7 100644 
--- a/a 
+++ b/a 
@@ -1,4 +1,2 @@ 
a 
b 
-c 
-d 
diff --git a/b b/b 
index 4bcfe98..6178079 100644 
--- a/b 
+++ b/b 
@@ -1 +1 @@ 
-d 
+b 
diff --git a/c b/c 
deleted file mode 100644 
index f2ad6c7..0000000 
--- a/c 
+++ /dev/null 
@@ -1 +0,0 @@ 
-c 
$ git log -p b...d -- 
commit 08adc8512e63588e6f01533b2a0f762342521b05 
Author: ... 
Date: Mon Sep 1 17:22:06 2014 +0200 

    commit d 

diff --git a/a b/a 
index de98044..d68dd40 100644 
--- a/a 
+++ b/a 
@@ -1,3 +1,4 @@ 
a 
b 
c 
+d 
diff --git a/b b/b 
index 9ddeb5c..4bcfe98 100644 
--- a/b 
+++ b/b 
@@ -1,2 +1 @@ 
-b 
-c 
+d 

commit 8abaaff681be0bcaa16c946feb2989959348c9f4 
Author: ... 
Date: Mon Sep 1 17:21:40 2014 +0200 

    commit c 

diff --git a/a b/a 
index 422c2b7..de98044 100644 
--- a/a 
+++ b/a 
@@ -1,2 +1,3 @@ 
a 
b 
+c 
diff --git a/b b/b 
index 6178079..9ddeb5c 100644 
--- a/b 
+++ b/b 
@@ -1 +1,2 @@ 
b 
+c 
diff --git a/c b/c 
new file mode 100644 
index 0000000..f2ad6c7 
--- /dev/null 
+++ b/c 
@@ -0,0 +1 @@ 
+c 
$ git show b...d -- 
commit 08adc8512e63588e6f01533b2a0f762342521b05 
Author: ... 
Date: Mon Sep 1 17:22:06 2014 +0200 

    commit d 

diff --git a/a b/a 
index de98044..d68dd40 100644 
--- a/a 
+++ b/a 
@@ -1,3 +1,4 @@ 
a 
b 
c 
+d 
diff --git a/b b/b 
index 9ddeb5c..4bcfe98 100644 
--- a/b 
+++ b/b 
@@ -1,2 +1 @@ 
-b 
-c 
+d 

commit 8abaaff681be0bcaa16c946feb2989959348c9f4 
Author: ... 
Date: Mon Sep 1 17:21:40 2014 +0200 

    commit c 

diff --git a/a b/a 
index 422c2b7..de98044 100644 
--- a/a 
+++ b/a 
@@ -1,2 +1,3 @@ 
a 
b 
+c 
diff --git a/b b/b 
index 6178079..9ddeb5c 100644 
--- a/b 
+++ b/b 
@@ -1 +1,2 @@ 
b 
+c 
diff --git a/c b/c 
new file mode 100644 
index 0000000..f2ad6c7 
--- /dev/null 
+++ b/c 
@@ -0,0 +1 @@ 
+c 
$ git diff b...d -- 
diff --git a/a b/a 
index 422c2b7..d68dd40 100644 
--- a/a 
+++ b/a 
@@ -1,2 +1,4 @@ 
a 
b 
+c 
+d 
diff --git a/b b/b 
index 6178079..4bcfe98 100644 
--- a/b 
+++ b/b 
@@ -1 +1 @@ 
-b 
+d 
diff --git a/c b/c 
new file mode 100644 
index 0000000..f2ad6c7 
--- /dev/null 
+++ b/c 
@@ -0,0 +1 @@ 
+c 
$ git log -p d...b -- 
commit 08adc8512e63588e6f01533b2a0f762342521b05 
Author: ... 
Date: Mon Sep 1 17:22:06 2014 +0200 

    commit d 

diff --git a/a b/a 
index de98044..d68dd40 100644 
--- a/a 
+++ b/a 
@@ -1,3 +1,4 @@ 
a 
b 
c 
+d 
diff --git a/b b/b 
index 9ddeb5c..4bcfe98 100644 
--- a/b 
+++ b/b 
@@ -1,2 +1 @@ 
-b 
-c 
+d 

commit 8abaaff681be0bcaa16c946feb2989959348c9f4 
Author: ... 
Date: Mon Sep 1 17:21:40 2014 +0200 

    commit c 

diff --git a/a b/a 
index 422c2b7..de98044 100644 
--- a/a 
+++ b/a 
@@ -1,2 +1,3 @@ 
a 
b 
+c 
diff --git a/b b/b 
index 6178079..9ddeb5c 100644 
--- a/b 
+++ b/b 
@@ -1 +1,2 @@ 
b 
+c 
diff --git a/c b/c 
new file mode 100644 
index 0000000..f2ad6c7 
--- /dev/null 
+++ b/c 
@@ -0,0 +1 @@ 
+c 
$ git show d...b -- 
commit 08adc8512e63588e6f01533b2a0f762342521b05 
Author: ... 
Date: Mon Sep 1 17:22:06 2014 +0200 

    commit d 

diff --git a/a b/a 
index de98044..d68dd40 100644 
--- a/a 
+++ b/a 
@@ -1,3 +1,4 @@ 
a 
b 
c 
+d 
diff --git a/b b/b 
index 9ddeb5c..4bcfe98 100644 
--- a/b 
+++ b/b 
@@ -1,2 +1 @@ 
-b 
-c 
+d 

commit 8abaaff681be0bcaa16c946feb2989959348c9f4 
Author: ... 
Date: Mon Sep 1 17:21:40 2014 +0200 

    commit c 

diff --git a/a b/a 
index 422c2b7..de98044 100644 
--- a/a 
+++ b/a 
@@ -1,2 +1,3 @@ 
a 
b 
+c 
diff --git a/b b/b 
index 6178079..9ddeb5c 100644 
--- a/b 
+++ b/b 
@@ -1 +1,2 @@ 
b 
+c 
diff --git a/c b/c 
new file mode 100644 
index 0000000..f2ad6c7 
--- /dev/null 
+++ b/c 
@@ -0,0 +1 @@ 
+c 
$ git diff d...b -- 
$ 
+0

Bene, ad eccezione, 'git log AB' non esegue' A..B': gli argomenti di 'git log' sono trattati allo stesso modo di quelli di' git rev-list', in termini di generazione del set di revisioni da ispezionare, e questo è in effetti l'unione dei due set. (Altrimenti tutto è corretto anche se ci sono casi in cui sia 'A..B' che' B..A' non sono vuoti.) – torek

+0

@torek: grazie per l'avviso. Ho corretto il primo paragrafo. Spero che non rimangano errori :) – knittl

+0

@knittl grazie mille per la risposta dettagliata –