Git

Aus Kognitive Robotik

Wechseln zu: Navigation, Suche


Basic operation

Checking out a repository (clone)

git clone <user>@git-server:/path/to/repo/<Repo>
<user>
Your user account
<Repo>
desired repository, e.g. project.git or test.git

Updating repository

The Right Way
git fetch origin
... identify and fix any problems ...
git merge origin/master
The Easy Way
git pull
Links

Repository hochladen

git push

Unterschiede zw. Remote- und eigenem Repository

git fetch origin
git diff master origin/master

Repository anlegen

Auf dem Server
cd /path/to/repos
mkdir project.git
cd project.git
git init --bare --shared=group
Auf dem Client
mkdir project
cd project
git init
git remote add origin <user>@git-server:/path/to/repos/project.git
git config branch.master.remote 'origin'
git config branch.master.merge 'refs/heads/master'
echo "Kurze Projektbeschreibung" > .git/description

# Dateien editieren, committen ...

git push origin master:refs/heads/master

Überblick verschaffen (status/ log)

git status                   #Zusammenfassung
git log                      #Commits mit Kommentaren
git log <file>               #nur Commits die <file> betreffen
git log --stat               #log mit Statistiken über Dateien
git shortlog                 #gekürztes log mit Gruppierung nach Autor

Unterschiede anzeigen (diff)

git diff                     #Änderungen seit "git add" oder "git rm"
git diff HEAD                #Änderungen seit letztem Commit ("git commit -a")
git diff HEAD -- <file>      #Änderungen von Datei <file>
git diff --cached            #Änderungen, welche "git commit" einpflegen würde
git diff --stat              #Änderungsstatistik
git diff HEAD^ HEAD          #Änderungen des letzten Commits
git diff HEAD~3              #Änderungen zu 3 Commits vorher
git diff <branchname>        #Änderungen gegenüber Branch <branchname>
git diff <b1> <b2>           #Änderungen zwischen Branch <b1> und <b2>

Difftool

Um Unterschiede besser zu visualisieren bietet sich der Einsatz eines Difftools an, bspw. vimdiff. Nachdem man dieses in git mittels

git config --global diff.tool vimdiff

gesetzt hat, kann man obige Befehle auch mit git difftool anstatt git diff benutzen.

Patches

git format-patch <commit>   #Erzeugt Patchfiles zwischen <commit> und aktuellem Branch
git apply <fille>           #Wendet Patch <file> auf aktuellem Branch an

Zeitreise (checkout/ reset)

git checkout -f              #alle lokalen Änderungen rückgängig machen
git checkout HEAD foo.txt    #lokale Änderungen in foo.txt rückgängig machen
git reset HEAD~2             #lässt die letzten beiden Commits verschwinden

Verzweigen (branch)

git branch                      #Branches auflisten
git branch <branch>             #Branch <branch> erstellen
git checkout <branch>           #zu Branch <branch> wechseln
git checkout -b <branch> master #erzeugt Branch <branch> mit Inhalt von master und wechselt dorthin
git branch -d <branch>          #löscht Branch <branch>, wenn dieser nach HEAD gemerged wurde
git branch -D <branch>          #löschte Branch <branch>
git push origin :<branch>       #löscht Branch <branch> auch remote

Zusammenführen (merge)

git merge <branch>           #merge Branch <branch> auf aktuellen
git merge --squash <branch>  #merge <branch> ohne commit und branch-history

auch hier bietet sich vimdiff als mergetool tool an

git config --global merge.tool vimdiff

mittels git mergetool geht es dann los, wobei

ctrl+w ctrl+w                #wechselt Fenster
do                           #diff obtain - übernimmt Änderung aus anderem Fenster
dp                           #diff put - übernimmt Änderung aus aktuellem Fenster
[c                           #previous difference
]c                           #next difference 
zo                           #open folded text
zc                           #close(fold) text

Namen vergeben

git tag <name>               #aktuellem Commit den Namen <name> geben

Aufräumen

git clean -n                #anzeigen welche Dateien gelöscht würden
git clean -f                #löschen von nicht getrackten Dateien
git gc                      #räumt unnötige Dateien auf und optimiert Repo

submodules einrichten

in der ~/.gitconfig folgende Regel erzeugen

[url "USER@git-server:/path/to/repos"]
        insteadOf = korogit://

und dann kann man immer mit

git clone korogit://MY_GIT.git

die gits auf koro auschecken. Sinn und Zweck der Übung: jetzt kann man submodules verwenden, da die URL nicht mehr benutzerspezifisch (meinName@) sind. Des Weiteren wie hier beschrieben verfahren.

git submodule add korogit://MY_GITS.git 

ist nun möglich. Nachteil: wer das Superproject clonen will braucht die oben genannte lokale Konfiguration. Man beachte das clonen ist etwas umfangreicher als bei einem normalen git.

git clone korogit;//SUPER.git
cd SUPER.git
git submodule init
git submodule update

erst jetzt lädt er Daten. Er ist allerdings in keinen Branch. Den muss man sich erst noch aussuchen...

Git-SVN

Initiieren/Clonen
  • Kurzform:
git-svn clone --stdlayout <svn-project-url>
git-svn clone --stdlayout -r HEAD <svn-project-url>
  • Ausführlich:
  1. Ordner erstellen und hinein wechseln
    mkdir project && cd project
  2. git repository erstellen
    git-svn init <svn-project-url>
  3. project aus svn ab revision <REV> auschecken
    git-svn fetch -r<REV>
  4. Arbeitsverzeichnis updaten
    git svn rebase
Updaten vom SVN-Server
git svn rebase
Committen (+Hochladen)
git svn dcommit

Clients

konfigurieren

Man sollte Name und Email setzen, sonst wird versucht diese aus den Systemeinstellungen zu entnehmen (was i.d.R. falsch ist).

git config --global user.name 'Hans Mustermann'
git config --global user.email 'hans@example.com'

Weiterhin verschönern folgende Variablen das Arbeiten

git config --global color.diff auto
git config --global color.branch auto
git config --global color.interactive auto
git config --global color.status auto
git config --global core.editor vim
git config --global merge.tool vimdiff

Mac OS X

TODO

Linux

TODO

Solaris

wget -c http://www.kernel.org/pub/software/scm/git/git-1.7.1.tar.gz
gtar -xzvf git-1.7.1.tar.gz
cd git-1.7.1
gmake prefix=$HOME NO_CURL=1 NO_TCLTK=1 all
gmake prefix=$HOME NO_CURL=1 NO_TCLTK=1 INSTALL=/usr/ucb/install install

Windows

Ganz brauchbar (da Unix-like) scheint msysgit zu sein. Lädt man sich die portable Version herunter und packt diese auf einen USB-Stick, hat man Git für Windows quasi immer dabei. Einfach (im entpackten Ordner) auf git-bash.bat klicken und man hat seine gewohnte Umgebung inkl. vim zur Verfügung. Jedoch empfiehlt es sich vorher die automatische Zeilenkonvertierung mittels

git config --global core.autocrlf false

zu deaktivieren.

Initial setup

SVN in Git konvertieren

  1. SVN-Repositories wie oben beschrieben mit git svn auschecken.
  2. Ins Git-Rootdir wechseln
    cd /path/to/repos
  3. Ausgechecktes Git-Repository klonen
    git clone --bare /path/to/svngitrepo project.git
  4. Repository für Gruppenarbeit konfigurieren
    cd project.git
    git config core.sharedrepository 1
    git config receive.denyNonFastforwards true
    find objects -type d -exec chmod 02770 {} \;
Links