Cheatsheet: Branching mit Git
Noch so eine Liste mit Git Befehlen? Jain. In diesem Beitrag geht es in erster Linie um Git Befehle, die ich (teilweise) nicht jeden Tag nutze und immer wieder nachschauen müsste. Daher habe ich die Befehle hier einmal zusammengeschieben:
Git Konfiguration
Aliase anlegen
git config --global alias.branches "branch --all --verbose" git config --global alias.tree "log --graph --oneline --decorate --all"
git branches
zeigt nun alle Branches (auch remote) inkl. letzem Commit-Hash und Commit-Kommentar angit tree
zeigt nun die einzelnen Branches bunt und strukturiert an (alsogit log
in „schön“)
Merge und Push anpassen
git config --global merge.ff false git config --global pull.ff only
git merge
verwendet nun kein „Fast-forward“ mehr (es sei denn, der--ff
Parameter wird explizit übergeben) ohne dass jedesmal--no-ff
angegeben werden mussgit pull
kann nur noch verwendet werden, wenn ein „Fast-forward“ möglich ist
Git Branches
Genereller Arbeitsablauf
Generell arbeite ich mit master
und develop
als Hauptbranches. Der master
Branch ist das Produktionssystem und sollte immer sauber gehalten werden. Alle Entwicklungen werden auf dem develop
Branch durchgeführt oder auf einem vom develop
Branch abgehenden featureXYZ
Branch.
## go to branch "develop" we want to work on git checkout develop ## make sure develop branch is up-to-date (no merge here!) git rebase master ## add fancy stuff now and commit as often as you wish git commit ## push changes to remote "develop" (if you wish and available) git push ## when finished go back to "master" branch git checkout master ## add changes in "develop" branch to "master" branch via merge (with --no-ff as default) git merge develop ## push changes to remote "master" (if you wish and available) git push ## add and push tag (if you wish) git tag 1.2.0 git push origin 1.2.0
Branch umbenennen (Lokal)
## variant 1 git branch -m old-name new-name ## variant 2 git checkout old-name git branch -m new-name
Statt git branch -m
(Kurzform) kann auch git branch --move
(Langform) geschrieben werden.
Branch umbenennen (Remote)
## variant 1 git push origin origin/<old_name>:refs/heads/<new_name> :<old-name> ## variant 2 git push origin :<old_name> git push origin <new_name>:refs/heads/<new_name>
Branch löschen
## local git branch -d test ## remote git push origin --delete test
Push Konflikte beheben
Bei Fehlermeldungen a la error: „Aktualisierungen wurden zurückgewiesen, weil die Spitze Ihres aktuellen Branches hinter seinem externen Gegenstück zurückgefallen ist. Führen Sie die externen Änderungen zusammen
“ einfach mit dem Remote Branch rebasen:
## rebase local repo with origin git pull --rebase origin master ## push local changes back to origin git push origin master
Änderungen rückgängig machen
Manchmal hat man was falsches committed. Mit git reset
(siehe Git-Seite) kann man einfach zu einem früheren Commit zurück springen:
git reset --hard <commit-id>
Wenn ein Commit bereits (zu Github) gepushed wurde, kann man das so wieder korrigieren:
## undo local commit git reset --soft HEAD^ ## make changes or fix typos ## commit again git commit ## push again (and force to overwrite old commit) git push --force origin master
Git Tracking
Tracking Branch hinzufügen (Remote Branch)
## add "origin" remote to repo git remote add origin git@github.com:<user>/<repo> git push -u origin master
Tracking Informationen anzeigen
## show remote config for "origin" git remote show origin ## show remotes git remote -v
Push & Track
Branch develop
an origin/develop
pushen und gleichzeitig origin/develop
als Tracking Branch eintragen:
git checkout develop git push -u origin develop
Statt git push -u
(Kurzform) kann auch git push --set-upstream
(Langform) geschrieben werden
Tracking manuell setzen
## set single remote tracking branch "origin/master" for current repository git remote set-branches origin master ## remove remote branch "origin/bla" from current repo without deleting remote branch itself git branch -rd origin/bla ## set tracking branch "origin/master" for specific local branch "master" of this repo git branch -u origin/master [master]
Statt git branch -rd
(Kurzform) kann auch git branch --remotes --delete
(Langform) geschrieben werden
Statt git branch -u
(Kurzform) kann auch git branch --set-upstream-to
(Langform) geschrieben werden
Git Klonen
Lokales Repo klonen
## clone local repo to another local repo git clone --single-branch --local /path/to/orig /path/to/copy ## switch to old repo cd /path/to/orig ## add single git remote add origin --track master /path/to/new
Remote Fork (Github) auf Stand bringen
# clone your fork git clone git@github.com:<fork_user>/<fork_repo>.git <path> cd <path> git checkout master # add original repo as remote "upstream" git remote add upstream git@github.com:<original_user>/<original_repo>.git # merge your repo with original repo git fetch upstream git merge --ff-only upstream/master # push back changes to your remote repo git push
Git Änderungen prüfen
Alle geänderten PHP Dateien vor dem Commit auf Syntaxfehler prüfen
# check modified php files find $(git ls-files -m) -name "*.php" -exec php -l {} \; 1>/dev/null
Git Links
Weiterführende Links:
- Git Branching Workflow
- Git Rebase Workflow
- Git Forking Workflow
- Git Squash Workflow
Anregungen? Fragen? Fehler? Einfach melden!
Ich freue mich mich jederzeit über Feedback ;)