git add

Die veränderten Dateien im Working Tree übermitteln wir mittels git add an den Index.

Im einfachsten Fall könnte man git add -A (für --all) oder auch git add . (aktuelles Verzeichnis) nutzen. Dabei verliert man aber beim späterem Nachvollziehen von durchgeführten Schritten auch ein wenig an Details.

Da man häufig an Ordner-Strukturen arbeitet bietet sich an: git add Chapter\ (das staged alle Dateien des entsprechenden Ordners)

Wenn man das schrittweise, feingetunte add - commit vernachlässigt hat, dann kann man die entsprechenden Änderungen auch teilweise in den Index schieben und somit dann auch teilweise commiten.

git add –patch - schrittweises/teilweises einchecken von Änderungen

Mit der Option --patch bzw. -p gelangt man in den interaktiven Modus von git add. Auf diese Weise kann man dann Teile von Bearbeitungen an Dateien in den Index hinzufügen.

Gründe:

  • Entwicklungsgeschichte besser erkennbar

  • Während der Arbeit die kleinteiligen Commits vernachlässigt

Beispiel aus gitbu.ch: Datei hello.pl

hello.pl - Version 01
# Hello World! in Perl
print "Hello World!\n";

Wird geändert zu:

hello.pl - Version 02
#!/usr/bin/perl
# Hello World! in Perl
# Author: Valentin Haenel
use strict;
print "Hello World!\n";

Anm.: an dieser Stelle auch mal - zur Erinnerung - die Aufrufe git diff vs. git diff --staged vergleichen bzw. analysieren.

Kommen wir zum Patch-Mode von git add:

$ git add --patch
diff --git a/hello.pl b/hello.pl
index c6f28d5..1e50e10 100644
--- a/hello.pl
+++ b/hello.pl
@@ -1,2 +1,5 @@
+#!/usr/bin/perl
 # Hello World! in Perl
+# Author: Joe B.
+use strict;
 print "Hello World!\n";
Stage this hunk [y,n,q,a,d,s,e,?]?s

Wir versuchen den Hunk zu teilen (s für split) und erhalten die folgende Möglichkeit:

Split into 2 hunks.
@@ -1 +1,2 @@
 +#!/usr/bin/perl
 # Hello World! in Perl
Stage this hunk [y,n,q,a,d,j,J,g,/,e,?]? y
@@ -1,2 +2,4 @@
 # Hello World! in Perl
+# Author: Joe B.
+use strict;
 print "Hello World!\n";
Stage this hunk [y,n,q,a,d,K,g,/,e,?]? n

Wir haben also den ersten Teil übernommen und den zweiten Teil nicht für den Index übernommen!

Hier ein Vergleich von git diff Aufrufen:

$ git diff --staged
diff --git a/hello.pl b/hello.pl
index c6f28d5..d2cc6dc 100644
--- a/hello.pl
+++ b/hello.pl
@@ -1,2 +1,3 @@
+#!/usr/bin/perl
 # Hello World! in Perl
 print "Hello World!\n";

Und im Working Tree haben wir noch weitere Zeilen:

$ git diff
diff --git a/hello.pl b/hello.pl
index d2cc6dc..1e50e10 100644
--- a/hello.pl
+++ b/hello.pl
@@ -1,3 +1,5 @@
 #!/usr/bin/perl
 # Hello World! in Perl
+# Author: Joe B.
+use strict;
 print "Hello World!\n";