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 - 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

Due build.number wird also automatisch verändert. Die Versionsnummer bleibt gleich. Sie kann durch den Befehl git tag -a geändert werden.

Release numbering - modifiziert

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.