GIT

Aus Mediawiki Ferdinand Gruber
Zur Navigation springen Zur Suche springen

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

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

Alle Änderungen commiten, dann

git checkout master
git merge "testbranch"

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

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

Änderungen anzeigen nach dem Commit

Anzeigen der letzten Commits

git log --oneline

Id kopieren und einfügen

Unterschiede anzeigen mit dem Befehl diff oder mit Hilfe von z.B. KDiff3

git diff <Commit Id>
git difftool <Commit Id>
  • Eine Datei in verschiedenen Branches vergleichen
git diff master branch_test datei.php
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/*

Änderungen

Änderungen vor dem Commit verwerfen

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

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.

Troubles

  • Pfadspezifikation 'xxxxx' stimmt mit keinen Git bekannten Dateien überein
git add .