GIT
Achtung: Ich bin purer Anfänger in GIT und ich notiere hier meine ersten Versuche.
- Es kann sein, dass ich manches falsch verstehe und daher diese Informationen zum Teil falsch sind.
Config
Die zentrale Konfigurationsdatei ist im Homeverzeichnis
~/.gitconfig
- Branches ohne Pager auflisten
Standardmäßig wird zur Anzeige ein Pager verwendet, z.B. less
- Um das zu verhindern:
git config --global pager.branch false
- Difftool konfigurieren
git config --global difftool.prompt false git config --global diff.tool kdiff3
- Difftool soll keine Backupdateien erzeugen
Standardmäßig erzeugt GIT nach dem Zusammenführen im Arbeitsverzeichnis eine *.orig
Datei. Folgendes Kommando verhindert dies.
git config --global mergetool.keepBackup false
Branches
Branches anzeigen. Der aktive Branch wird farblich hervorgehoben - openSuse
git branch
Einen neuer Branch beginnen
git checkout -b "testbranch"
Zum neuen Branch wechseln
git checkout "testBranch"
Eine Datei zu einem anderen Branch verschieben
git add . git commit -m "alles fertig" git checkout anderer_branch ./file.php
Einen Branch löschen
git branch -d "hotfix_1"
Branches zusammenführen
Voraussetzung: Alle Änderungen commiten, dann
git checkout master git merge "testbranch"
Merge Konflikt
Wenn nicht alle Dateien automatisch zusammengeführt werden können, so gibt es eine Meldung
- Der Editor Kate zeigt die Konflikte an. Nach durchgeführten Änderungen einen Commit machen
# Beispiel git add project/view/file.php git commit
Merge wiederholen
git merge "testbranch
Branch umbenennen
Aktueller Branch
git branch -m neuer_Name
Irgendein Branch
git branch -m alter_Name neuer_Name
Commits
Änderungen anzeigen
- vor dem Commit
git status
- nach dem letzten Commit
git log -1 --name-only
- Vergleich aktueller Status mit letztem Commit
git log
Commit Id kopieren und einfügen
git diff <commit_id>
Dateien vergleichen
- Eine bestimmte Datei in verschiedenen Branches vergleichen
git diff master branch_test datei.php
Datei in grafischem Difftool anzeigen und bearbeiten (Konfiguration siehe oben)
git difftool master branch_test datei.php
Dateien ignorieren
Im Repo eine Datei .gitignore anlegen und Dateien und Verzeichnisse eintragen, die in diesem Repo ignoriert werden sollen.
touch .gitignore
Dateien und Verzeichnisse eintragen
# Beispiel protected/runtime/ assets
Globale Konfiguraion
- Konfiguration ändern
git config --global core.excludesfile ~/.gitignore_global
- Datei anlegen und bearbeiten
touch ~/.gitignore_global
# ~/.gitignore_global *.log tmp/
Dateien entfernen
Dateien und Verzeichnisse aus dem Repo entfernen
git rm -r --cached tmp/*
Zu einem früheren Commit wechseln
Änderungen verwerfen
git restore <Datei>
Alle Änderungen im Arbeitsverzeichnis vor einem Commit rückgängig machen
git checkout HEAD *
Die Änderungen werden aus der Staging Area entfernt.
Zu einem früheren Commit zurückkehren
- Zuerst die Commits anzeigen
git log
Commits verwerfen
Zu einem bestimmten Commit zurückkehren und alle späteren Änderungen verwerfen
git reset --hard 8a0181d7b38472a04d90b64dd84a8bc62d138686
Alle Änderungen nach dem Commit 8a0181d7b38472a04d90b64dd84a8bc62d138686
sind hiermit verworfen.
In der Hierarchie zurückgehen
- Zwei Schritte zurück
git checkout HEAD~2
Man befindet sich nun im Zustand eines losgelösten HEAD.
Hier kann man einen neuen Branch beginnen
git checkout -b <branch_name>
- Zurück zu einem bestimmten Commit
Zuerst den Hash Code des Commits ermitteln
git log
Im folgenden Beispiel wird zu diesem Commit gewechselt und zugleich ein neuer Branch erzeugt
git checkout -b <branch_name> b62c8bd940c04b758ceb0583aec84479ddc56a8b
Letzte Commit Beschreibung ändern
git commit --amend
Release numbering
Die Versionen des GIT Repositories kann man mit Hilfe von tags verwalten.
Eine Versionsnummer setzt sich aus drei Zahlen zusammen:
MAJOR.MINOR.PATCH Beispiel: 1.3.7
In diesem Beispiel ist festgelegt: MAJOR = 1, MINOR = 3, PATCH = 7
Nach einem Commit kann man eine neue Versionsnummer vergeben.
tag -a 1.3.7 -m "new features"
Anzeige der Versionsnummern
git describe
1.3.7-1-gecc4a83
Die Ausgabe zeigt, dass zusätzlich zur Versionsnummer beim Commit eine build-number und der Buchstabe g gefolgt von der abgekürzten commit-Id angehängt wurde.
Vergibt man beim nächsten Commit keine neue Versionsnummer, so wird die build-number automatisch um 1 erhöht.
git describe
1.3.7-2-g0adfd20
Die build-number wird also beim Commit automatisch verändert. Die Versionsnummer bleibt gleich. Sie kann durch den Befehl git tag -a geändert werden.
Info: https://stackoverflow.com/questions/37814286/how-to-manage-the-version-number-in-git
Ich habe jedoch die Versionierung meiner Projekte modifiziert mit Hilfe eines Scripts.
Release numbering - modified
Das folgende Script commit.sh ändert die Versionierung nach eigenen Vorstellungen.
if [ $# -gt 0 ] ; then DESCRIPTION="$*" else read -p "Commit Beschreibung eingeben: " DESCRIPTION fi while [ ! -d .git ] ; do cd .. done echo "------------------" echo $(pwd) git add . git commit -m "$DESCRIPTION" if [ $(git tag | wc -l) -gt 0 ] ; then NUMBER=$(git describe | tail -n 1) NUMBER=$(echo $NUMBER | cut -f 1 -d "-") MAJOR=$(echo $NUMBER | cut -f 1 -d ".") MINOR=$(echo $NUMBER | cut -f 2 -d ".") PATCH=$(git describe | cut -f 2 -d "-" | cut -f 1 -d "-") else MAJOR=1 MINOR=0 PATCH=0 DESCRIPTION="start release numbering" git tag -a $MAJOR.$MINOR.$PATCH -m "$DESCRIPTION" fi echo "Version: $MAJOR.$MINOR.$PATCH - $DESCRIPTION"
Zuerst wird ein Commit durchgeführt.
Falls im aktuellen git-repository noch kein git-tag existiert, wird ein tag erzeugt mit git tag -a 1.0.0 -m "start release numbering".
Aus einem vorhanden git-tag werden die Bestandteile der Versionsnummer extrahiert. Die automatisch bei jedem Commit um 1 erhöhte build-number wird als PATCH Nummer verwendet.
Die so generierte Versionsnummer wird ausgegeben.
Commits anzeigen
- Normale LOG Ansicht
git log
- Eine Zeile pro Commit
git log --pretty=oneline
Repositories
Dateien anzeigen
git ls-files
Dateien excluden
Eine Datei .gitignore anlegen. Jene Dateien und Verzeichnisse hineinschreiben, die nicht getrackt werden sollen.
Dateien entfernen
git rm -r --cached assets/*
Es werden alle Dateien und Unterverzeichnisse aus /assets aus dem Repository entfernt.
Kopfzeile
Workflow
- Repo erstellen
git init
- Dateien zum Repo hinzufügen
git add .
- Commit
Nach Änderungen an Dateien, diese zum Repo hinzufügen
git add . git commit -m "Kommentar"
Submodules
Ein Verzeichnis mit mehrfach genutzten Bibliotheken kann man als Submodul zu einem Repo hinzufügen.
- Ich habe mich vorerst entschieden, meine Projekte ohne Submodules zu organisieren. Ich verwalte die gemeinsam genutzten Bibliotheken in einem eigenen GIT Repo. Um die Synchronisation kümmere ich mich manuell - ohne Verwendung von Submodules.
Include Repo anlegen
cd /srv/www/include git init git add .
Include Repo einbinden in das HauptRepo
cd /srv/www/htdocs/project mkdir includefiles git submodule add ./includefiles cd ./includefiles git add .
Arbeiten mit Submodules
- Alle GIT Befehle im Submodul Verzeichnis beziehen sich auf das Submodul.
- Nach einem Commit oder Branchwechsel im Projekt Repo muss das Submodul upgedatet werden.
git submodule update
Erst dann werden die Änderungen im Include Verzeichnis im Haupt Repo wirksam.