Git
Siehe auch
Die am häufigsten verwendeten Git-Kommandos
git add
git blame
git branch
git checkout
git clone
git config
git diff
git log
git mv
git pull
git push
git rm
git status
                       ┌──────┐
                       │      │
                       │   ┌──┴────────────┐             ┌───────────────┐
                       │   │               │    push     │               │
                       │   │               ├────────────►│    Remote     │
                       │   │  Comitted     │             │    (GitHub,   │
                       │   │               │             │    GitLab,    │
                       │   │               │◄────────────┤    etc.)      │
                       │   │               │    pull     │               │
                       │   └────────────┬──┘             └───────────────┘
                       │      ▲         │
                       │      │         │
                       │      │         │
                       │   commit    reset --soft HEAD^
                       │      │         │
                       │      │         │
                       │      │         ▼
                       │   ┌──┴────────────┐
                       │   │               │            ┌──────────────┐
                       │   │               │    add     │              │
                       │   │  Staged       │◄───────────┤  Untracked   │
                       │   │               │            │              │
                       │   │               │            └──────────────┘
                       │   │               │
                       │   └────────────┬──┘
                       │      ▲         │                    ───┬───
                       │      │         │                       │
                       │      │         │                       │
                       │     add     restore --staged         diff --staged
                       │      │         │                       │
                       │      │         │                       │
                       │      │         ▼                    ───┴───
                       │   ┌──┴────────────┐
┌─────────┐  stash     │   │               │
│         │◄───────────┼───┤               │
│  Stash  │            │   │  Unstaged     │
│         ├────────────┼──►│  (modified)   │
└─────────┘  stash pop │   │               │
                       │   │               │
                       │   └────────────┬──┘
                       │      ▲         │                    ───┬───
                       │      │         │                       │
                       │      │         │                       │
                       │   $EDITOR   restore                  diff
                       │      │         │                       │
                       │      │         │                       │
                       │      │         ▼                    ───┴───
                       │   ┌──┴────────────┐
                       │   │               │            ┌──────────────┐
                       │   │               │    init    │  Empty       │
                       │   │  Unstaged     │◄───────────┤  folder      │
                       │   │  (unmodified) │            │              │
                       │   │               │            └──────────────┘
                       │   │               │
                       │   └───────────────┘
                       │      ▲
                       └──────┘
Globale Git-Config setzen
Damit fängt alles an - Git global sinnvoll konfigurieren:
git config --global user.name "John Doe"
git config --global user.email "john.doe@example.com"
git config --global init.defaultBranch main
git config --global pull.rebase true
Git Cheat Sheet
Bestehendes Repo auschecken:
git clone ssh://git@git.example.com/project/repo.git
git clone --branch 2.0.13 git@git.example.com:project/repo.git /path/to/my/dir
Git History anzeigen:
git log
git log --patch 2
# which files have changed when?
git log --name-only --date=iso
Den allerersten Commit anzeigen:
git log --format="format:%ci" --reverse | head -1
Anzahl Contributor zählen:
git log --format='%an' | sort -u | wc -l
Was muss committet werden?
git status
Wo liegen die Unterschiede?
git diff
Adden und committen:
git add $FILES
git commit -m 'my commit message describing what changed (fixed #4711)'
git push
Anzahl der Commmits zählen:
git rev-list --all --count
Aktuellen Branch anzeigen:
git branch
Neuen Branch erzeugen:
git checkout -b enh/12345/php_opcache
In bestehenden Branch wechseln:
git checkout enh/12345/php_opcache
Zwei Branches vergleichen:
git --no-pager log --oneline --graph --decorate --after="2021-10-14" master..develop
Branch umbenennen, lokal und remote:
OLD_BRANCH=master
NEW_BRANCH=main
# Switch to the local branch which you want to rename
git checkout $OLD_BRANCH
# Rename the local branch
git branch --move $NEW_BRANCH
# Push the $NEW_BRANCH local branch and reset the upstream branch
git push origin --set-upstream
# Delete the $OLD_BRANCH remote branch
git push origin --delete $OLD_BRANCH
In Master committed, aber es gehört in den Branch „Develop“? Achtung: vorher alle Änderungen sichern.
git checkout develop
git cherry-pick master
git checkout master
git reset --hard origin/master
git checkout develop
Eine einzelne Datei zurücksetzen:
git checkout myfile
Alle lokalen Änderungen zurücksetzen:
git fetch --all
git reset --hard origin/master
Einen lokalen Commit vor dem endgültigen Push zurücknehmen:
# --hard: delete my changes
git reset --hard HEAD~1
# --soft: do not delete my changes, file is unstaged after that
git reset --soft HEAD~1
Einen Commit aus dem lokalen und entfernten Git-Repo löschen, aber lokal bestehen lassen:
git rm -r --cached mydir        # in SVN, "--cached" was called "--keep-local"
git commit -m 'cleaned up'
git push
Ein Git-Repo re-initialisieren, inkl. Löschen der History:
cd repo
git checkout master
git reset --hard <sha-1 of your first commit>
git commit -m 'Initial commit' --allow-empty
git remote add origin <url>
git push --force --set-upstream origin master
Switch von Passwort (https) auf SSH-Key - Parameter „url“ in .git/config ändern:
[remote "origin"]
url = ssh://git@git.example.com/project/repo.git
Mit mehreren Usern im gleichen Git-Repo arbeiten:
groupadd repousers
useradd --create-home --groups repousers user1
useradd --create-home --groups repousers user2
# existing repo
cd /path/to/repo
git init --shared=group
# Reinitialized existing shared Git repository in /path/to/repo
chgrp -R repousers /path/to/repo
chmod -R g+rw /path/to/repo
find /path/to/repo -type d -exec chmod g+s {} +
Contributing - so geht’s
Um Code zu Open Source-Projekten beizusteuern, hat sich meist folgende Vorgehensweise etabliert:
- Projekt forken. 
- Den Fork clonen: - git clone git@github.com:$USERNAME/$PROJECT.git
- Eigenen Feature-Branch erzeugen: - git checkout -b linuxfabrik/#299
- Coden. 
- Änderungen committen: - git commit -am 'Text describing soemthing (#299)'
- Änderungen in den eigenen Branch pushen: - git push origin linuxfabrik/#299
- Im geforkten Repo einen Pull Request (PR) erstellen (auf GitHub/GitLab die Web-Ansicht für den Code-Bereich neu laden). 
Tools rund um Git
- GitHub Desktop Client, Linux Fork: https://github.com/shiftkey/desktop 
- Grafischer Client: gitg 
- TUI Client: tig 
- Git-Repos nach sensiblen Informationen durchsuchen: GitLeaks (konnte in unseren Tests allerdings keine hart-codierten Passwörter im Code finden, auch wenn sie hinterlegt waren) 
- Arbeit an Git-Repos als Video visualisieren: - # one day = 0.1 sec gource --start-date '2022-01-01' --seconds-per-day 0.1 --auto-skip-seconds 1 # export as gource.mp4 video gource \ --auto-skip-seconds 1 \ --date-format %Y-%m \ --hide filenames,dirnames,usernames \ --seconds-per-day 0.033 \ --start-date '2021-02-21' \ --stop-at-end \ --output-ppm-stream - | ffmpeg -y -r 60 -f image2pipe -vcodec ppm -i - -vcodec libx264 -preset ultrafast -pix_fmt yuv420p -crf 1 -threads 0 -bf 0 gource.mp4 
- Müll eingecheckt? Mit diesem kleinen Java-Tool lässt sich das Git-Repo hervorragend aufräumen: BFG Repo-Cleaner 
Built on 2025-10-27