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
Geänderte Dateien anzeigen
git status
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
- Eine globale
.gitignore
Datei anlegen
touch ~/.gitignore_global
- GIT Konfiguration ändern
git config --global core.excludesfile ~/.gitignore_global
- Excludefile bearbeiten
# Beispiel tmp/
- Dateien aus dem Repo entfernen
git rm --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
oder
git commit --amend "neue Beschreibung"
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 modifiziert mit Hilfe eines Scripts.
Release numbering - modified
Das folgende Script commit.sh ändert die Versionierung nach eigenen Vorstellungen. Die PATCH Nummer wird automatisch um 1 erhöht.
Vor dem erstmaligen Aufruf dieses Scripts muss, wie oben beschrieben, mit dem Kommando git tag -a eine Versionsnummer festgelegt werden.
#!/bin/bash # commit.sh if [ $# -gt 0 ] ; then commitText="$*" else read -p "Commit description: " commitText fi while [ ! -d .git ] ; do cd .. done projectDir=$(pwd) echo "------------------" echo $(pwd) git add . git commit -m "$commitText" 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=$(echo $NUMBER | cut -f 3 -d ".") PATCH=$(expr $PATCH + 1) git tag -a $MAJOR.$MINOR.$PATCH -m "$commitText" echo "Version: $MAJOR.$MINOR.$PATCH"
Zuerst wird ein Commit durchgeführt.
Dann werden aus dem vorhanden git-tag die Bestandteile der Versionsnummer extrahiert. Die PATCH-Nummer wird um 1 erhöht.
Anschließend wird ein neuer git-tag erzeugt mit der neuen Versionsnummer als Parameter.
Commits anzeigen
- Normale LOG Ansicht
git log
- Eine Zeile pro Commit
git log --pretty=oneline
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.