Korrektur des letzten Commits (GIT)

Aus Siduction Wiki DE
Wechseln zu: Navigation, Suche

GIT-Tutorial: Übersicht

Vorbemerkung

Gar nicht so selten merkt man, dass sich in die letzten Änderungen ein Fehler eingeschlichen hat: Ein Rechtschreibfehler im Kommentar, nicht entfernter Testcode...

Für diesen Fall hat GIT einen speziellen Korrekturmechanismus: amend

Wichtig: Bitte nur im lokalen Repository Korrekturen in der Historie durchführen. Wenn der Commit schon ins Depot exportiert wurde, die Korrektur mit einem "normalen" Commit hinterherschieben.

Basis der Änderung herrichten

Wir erweitern das Projekt backup, das in Grundlagen: lokales Repository (GIT) erstellt wurde:

 cd /tmp
 git clone git://f-r-e-i.de/backup
 cd backup

Änderungen

Jetzt die Einführung einer neuen Option: --monthly: Sicherung in ein TAR-Archiv mit dem aktuellen Zeitpunkt im Namen.

 cat <<'EOS' >backup.sh
#! /bin/bash
CONF=/etc/backup/$HOST.conf
if [ ! -f $CONF ] ; then
  echo "SRC=/home\nTRG=/data/backup" > $CONF
fi
source $CONF
if [ "$1" != "--monthly" ] ; then
        cp -a $SRC $TRG
else
        TAR=/data/monthly/bup_$(date +%Y.%m.%d-%H_%M).tbz
        tar cjf $TAR $SRC
        cp -a $TAR $TRG
fi
EOS

Und es gibt noch eine neue Datei: ein Beispiel für die Konfiguration des Backups. Das ist eigentlich gegen den Grundsatz "Für jede Idee ein Commit", aber wir wollen die Vorgehensweise für eine etwas komplexere Änderung vorführen:

 cat >configuration.sample <<EOS
SRC=/opt/git
TRG=/tmp/
EOS
 git add configuration.sample

Die Änderungen brav in den Releasenotes vermerken:

 echo >>releasenotes.txt "V0.3: Option --monthly: Monatssicherung im tar-Archiv. Neu: Beispiel für Konfigurationsdatei"

Schauen wir uns an, was geändert wurde:

 git diff
diff --git a/backup.sh b/backup.sh
index 6241aec..ac84ab9 100644
--- a/backup.sh
+++ b/backup.sh
@@ -4,4 +4,10 @@ if [ ! -f $CONF ] ; then
   echo "SRC=/home\nTRG=/data/backup" > $CONF
 fi
 source $CONF
-cp -a $SRC $TRG
+if [ "$1" != "--monthly" ] ; then
+        cp -a $SRC $TRG
+else
+        TAR=/data/monthly/bup_$(date +%Y.%m.%d-%H_%M).tbz
+        tar cjf $TAR $SRC
+        cp -a $TAR $TRG
+fi
diff --git a/releasenotes.txt b/releasenotes.txt
index d077131..065ed60 100644
--- a/releasenotes.txt
+++ b/releasenotes.txt
@@ -1,2 +1,3 @@
 V0.1: Backup durch kopieren
 V0.2: Nutzen einer hostspezifischen Konfiguration
+V0.3: Option --monthly: Monatssicherung im tar-Archiv. Neu: Beispiel für Konfigurationsdatei

oder graphisch etwas ansprechender:

 git difftool

Meld diff backup v0.2 v0.3.png

Der Test ergibt: es funktioniert, also committen:

 git commit -a -m "Option --monthly, Beispiel für Konfigurationsdatei"
 gitk

Gitk amend commit 1.png

Änderung der Änderung

Zwei Punkte fallen uns jetzt ein: einmal dauert das Sichern großer Verzeichnisse durch Verwenden von bzip2 beim tar-Kommando zu lang, zum anderen gefällt uns der Name der Datei configuration.sample nicht.

Korrektur der Datei backup.sh

 perl -pi -e 's/cjf/czf/; s/tbz/tgz/' backup.sh
 cat backup.sh
#! /bin/bash
CONF=/etc/backup/$HOST.conf
if [ ! -f $CONF ] ; then
  echo "SRC=/home\nTRG=/data/backup" > $CONF
fi
source $CONF
if [ "$1" != "--monthly" ] ; then
        cp -a $SRC $TRG
else
        TAR=/data/monthly/bup_$(date +%Y.%m.%d-%H_%M).tgz
        tar czf $TAR $SRC
        cp -a $TAR $TRG
fi

Umbenennen der Datei

 mv configuration.sample backup_host.conf
 git add backup_host.conf

Ersetzen des letzten Commits

 git commit -a --amend -c HEAD
  • "--amend" bedeutet, dass der letzte Commit entfernt und der aktuell committete Zustand an dessen Stelle tritt.
  • Mit der Angabe -c HEAD erreichen wir, dass der Commit-Kommentar von HEAD (also des letzten Commits) im Editor erscheint und übernommen oder modifiziert werden kann.

Wir beenden den Editor, ohne was zu ändern und schauen uns den aktuellen Zustand an:

 gitk --all

Gitk amend commit 2.png

Wir sehen, die letzte Commit ist komplett verschwunden, der gewünschte Zustand (Option czf statt cjf, anderer Dateiname) ist committed.