Git Grundlagen

Gutes Video-Einleitung (und Quelle für untenstehendes):

Learn Git in 20 Minutes → https://www.youtube.com/watch?v=Y9XZQO1n_7c

Grundbefehle

git init          Initiieren
nano .git/description     # Projektbeschreibung einfügen
git status        Status des Repository
git add <file>    Staging einer Datei
git add .         Staging aller Dateien (exkl. Ignore-Liste)
git add *.html    Staging aller *.html-Dateien
git log           Commit Historie anzeigen
git bundle create file.git --all     Gesamtes serverseitiges Repository in eine Datei packen


Nützliche Programme

git gui           Grafische Oberfläche für Commits
gitk              Grafische Oberfläche für History


Commits

Mit Texteditor

git commit        Committext-Eingabe VIM-ähnlich:

Vorgehen in VIM

  • I drücken → Wechselt zu Insert Mode
  • Comit Text eingeben
  • Esc drücken
  •  :wq eingeben (Speichern + Beenden)

Per Commandline

git commit -m 'change text'


Dateien ignorieren

Git-Ignore-Datei erstellen:

touch .gitignore

Beispielinhalt'

# Archiv-, Log- und Object-Dateien
*.a
*.o
*.log

# Emacs-Backupdateien (Alle, die mit ~ enden)
*~

# Verzeichnisse ignorieren
bin/
obj/


Entwicklungszweige

Allgemein

git branch -a               Alle zweige auflisten
git branch NewBranch        Neuen Zweig "NewBranch" erstellen
git branch -d NewBranch     Zweig "NewBranch" löschen
git branch -m NewName       Aktuellen Zweig in "NewName" umbenennen
git checkout NewBranch      Zum Zweig "NewBranch" wechseln
git checkout master         Zum Master-Zweig zurückkehren (heißt meistens so)
git merge SourceBranch      Änderungen in SourceBranch in aktuellen Branch mergen
git mergetool               Mergewerkzeug

Zweig wechseln ohne Commit

Wenn man den Zweig wechselt, ohne vorher zu adden/committen werden neue Dateien nicht dem ursprügnlichen Zweig zugeordnet. Um dies zu vermeiden, kann man einen WIP-Stack in einem Zweig anlegen, bevor man den Zweig wechselt:

git add .                   Zuerst alle Dateien adden
git stash                   Änderungen in WIP-Status dem Zweig zuordnen
git checkout <Branch2>      Wechseln
...                         Bearbeiten
git checkout <Branch1>      Zurückwechseln
git stash apply             Datein aus WIP-Status wieder zurückholen

Remote-Repositories

Allgemein

git remote                    Namen des Remote-Repositories anzeigen
git remote -v                 Namen und Pfade des Remote-Repositories anzeigen
git remote add <name> <remotepath>  Remote-Repository unter dem Namen bekannt machen 
git remote remove <name>      Rremote-Repository entfernen

Holen

git clone https://host/*.git  Klonen des *.git-Repositories vom Host
git fetch <reponame> <branch> Änderungen seit letztem clone/fetch in den aktuellen Zweig holen, ohne automatisch zu mergen
git pull <reponame> <branch>  Änderungen ins aktuelle Repository fetchen und automatisch mergen

Senden

git commit -a -m 'text'       Zuerst committen
git push <reponame> <branch>  Änderungen an Zweig in Remote-Repository übertragen/committen
git config --global push.default matching
                              Setzt push.default auf matching, was dazu führt, dass
                              git push immer an den Remote Branch mit dem gleichen Namen hochlädt
git push                      Setzt push.default voraus - siehe oben


Git-Aware Bash-Prompt

Bash erweitern um Erkennung von Git-Archiven.

emacs ~/.bashrc

Am Ende einfügen:

# Git aware bash prompt
export GIT_PS1_SHOWDIRTYSTATE=true
export GIT_PS1_SHOWUNTRACKEDFILES=true
export GIT_PS1_SHOWSTASHSTATE=true
export PS1="${PS1::$((${#PS1}-3))}\$(__git_ps1 ' [\[\e[34;1m\]%s\[\e[0m\]]')\$ "

The Seven Rules of a Great Commit Message

Source: https://chris.beams.io/posts/git-commit/#seven-rules

  1. Separate subject from body with a blank line
  2. Limit the subject line to 50 characters
  3. Capitalize the subject line
  4. Do not end the subject line with a period
  5. Use the imperative mood in the subject line
  6. Wrap the body at 72 characters
  7. Use the body to explain what and why vs. how


Use the imperative mood in the subject line

Commit subject lines should be written in the imperative mood, i.e.:

  • Clean your room
  • Close the door
  • Take the trash out

Examples:

  • Refactor function X
  • Remove deprecated classes
  • Update getting started documentation

Goal is to have the commit subject line complete the following line in a meaningful sense:

  • If applied, this commit will <your subject line here>

Examples:

  • If applied, this commit will refactor function X
  • If applied, this commit will remove deprecated classes
  • If applied, this commit will update getting started documentation