Git

Git Cheat Sheet

Damit fängt alles an - Git-Config setzen:

git config --global user.name "John Doe"
git config --global user.email "john.doe@example.com"

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

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

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_NAME

# 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-to=$NEW_BRANCH

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

.git/config
[remote "origin"]
url = ssh://git@git.example.com/project/repo.git

Mit mehreren Usern im gleichen Git-Repo arbeiten:

groupadd repousers
useradd -mG repousers user1
useradd -mG 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:

  1. Projekt forken.

  2. Den Fork clonen: git clone git@github.com:$USER/$PROJECT.git

  3. Eigenen Feature-Branch erzeugen: git checkout -b linuxfabrik/#299

  4. Neuer Remote-Endpoint: git remote add upstream https://github.com/$ORIGUSER/$ORIGPROJECT

  5. Coden.

  6. Änderungen committen: git commit -am 'Text describing soemthing (#299)'

  7. Änderungen in den eigenen Fork pushen: git push -u origin linuxfabrik/#299

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

  • 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 (1 Tag = 0.5 sec): gource --start-date '2022-01-01' --seconds-per-day 10 --auto-skip-seconds 1

Built on 2022-06-03