Git Cheat Sheet

Create

  • Clone and Existing Repository

    $ git clone ssh://user@domain.com/repo.git
  • Create a new local repository

    $ git init
  • Clone and Existing Repository

    $ git clone ssh://user@domain.com/repo.git
  • Clone and Existing Repository

    $ git clone ssh://user@domain.com/repo.git

Local Changes

  • Changed files in your working directory

    $ git status
  • Changes to tracked files

    $ git diff
  • Add all current changes to the next commit

    $ git add .
  • Add some changes in <file> to the next commit

    $ git add -p <file>
  • Commit all local changes in tracked files

    $ git commit -a
  • Commit previously staged changes

    $ git add -p <file>
  • Add some changes in to the next commit

    $ git commit
  • Change the last commit Don‘t amend published commits!

    $ git commit --amend

Branching & Tags

  • List all existing branches

    $ git branch
  • Switch HEAD branch

    $ git checkout <branch>
  • Create a new branch based on your current HEAD

    $ git branch <new-branch> 
  • Create a new tracking branch based on a remote branch

    $ git checkout --track <remote/branch>
  • Delete a local branch

    $ git branch -d <branch>
  • Mark the current commit with a tag

    $ git tag <tag-name>

Update & Publish

  • List all currently configured remotes

    $ git remote -v
  • Show information about a remote

    $ git remote show <remote>
  • Add new remote repository, named <remote>

    $ git remote add <remote> <url> 
  • Download all changes from <remote>, but don‘t integrate into HEAD

    $ git fetch <remote>
  • Download changes and directly merge/integrate into HEAD

    $ git pull <remote> <branch>
  • Publish local changes on a remote

    $ git push <remote> <branch>
  • Delete a branch on the remote

    $ git branch -dr <remote/branch>
  • Publish your tags

    $ git push --tags

Merge & Rebase

  • Merge <branch> into your current HEAD

    $ git merge <branch>
  • Rebase your current HEAD onto <branch> Don‘t rebase published commits!

    $ git rebase <branch>
  • Abort a rebase

    $ git rebase --abort
  • Continue a rebase after resolving conflicts

    $ git rebase --continue
  • Use your configured merge tool to solve conflicts

    $ git mergetool
  • Use your editor to manually solve conflicts

    $ git add <resolved-file>
  • After resolving mark file as resolved

    $ git rm <resolved-file>

Undo

  • Discard all local changes in your working directory

    $ git reset --hard HEAD
  • Discard local changes in a specific file

    $ git checkout <file>
  • Revert a commit (by producing a new commit with contrary changes)

    $ git revert <commit>
  • Reset your HEAD pointer to a previous commit & discard all changes since then

    $ git reset --hard <commit>
  • Reset your HEAD pointer to a previous commit & preserve all changes as unstaged changes

    $ git reset <commit>
  • Reset your HEAD pointer to a previous commit & preserve uncommitted local changes

    $ git reset --keep <commit>

Git ignore patronen

Patroon
Voorbeeldovereenkomsten
Uitleg*

**/logs

logs/debug.log logs/monday/foo.bar build/logs/debug.log

Je kunt een patroon vooraf laten gaan door een dubbele asterisk zodat overeenkomsten worden gezocht met mappen in de gehele repository.

**/logs/debug.log

logs/debug.log build/logs/debug.log maar niet logs/build/debug.log

Je kunt ook een dubbele asterisk gebruiken om bestanden te matchen op basis van hun naam en de naam van hun bovenliggende map.

*.log

debug.log foo.log .log logs/debug.log

Een asterisk is een jokerteken dat overeenkomt met nul of meer tekens.

*.log !important.log

debug.log trace.log maar niet important.log logs/important.log

Door vooraan een uitroepteken te plaatsen, zal het patroon het negeren. Als een bestand overeenkomt met een patroon, maar ook met een ontkenningspatroon dat later in het bestand is gedefinieerd, wordt het niet genegeerd.

*.log !important/*.log trace.*

debug.log important/trace.log maar niet important/debug.log

Patronen die ná een ontkenningspatroon zijn gedefinieerd, zullen alle eerder ontkende bestanden opnieuw negeren.

/debug.log

debug.log maar niet logs/debug.log

Door vooraan een slash toe te voegen, worden alleen bestanden in de hoofdmap van de repository gezocht.

debug.log

debug.log logs/debug.log

Patronen komen standaard overeen met bestanden in een map

debug?.log

debug0.log debugg.log maar niet debug10.log

Een vraagteken komt overeen met precies één karakter.

debug[0-9].log

debug0.log debug1.log maar niet debug10.log

Er kunnen ook blokhaken worden gebruikt om een enkel teken uit een bepaalde reeks te matchen.

debug[01].log

debug0.log debug1.log maar niet debug2.log debug01.log

Blokhaken komen overeen met één teken uit de opgegeven set.

debug[!01].log

debug2.log maar niet debug0.log debug1.log debug01.log

Een uitroepteken kan worden gebruikt voor overeenkomsten met elk teken, behalve één uit de opgegeven set.

debug[a-z].log

debuga.log debugb.log maar niet debug1.log

Reeksen kunnen numeriek of alfabetisch zijn.

Logboeken

logs logs/debug.log logs/latest/foo.bar build/logs build/logs/debug.log

Als je geen slash voor de naam plaatst, zoekt het patroon zowel bestanden als de inhoud van mappen met die naam. In het voorbeeld links worden zowel mappen als bestanden met de naam logs genegeerd.

logs/

logs/debug.log logs/latest/foo.bar build/logs/foo.bar build/logs/latest/debug.log

Het toevoegen van een slash vooraan geeft aan dat het patroon een map is. De volledige inhoud van elke map in de repository die overeenkomt met die naam — inclusief alle bestanden en submappen — wordt genegeerd.

logs/ !logs/important.log

logs/debug.log logs/important.log

Wacht even! Zou logs/important.log niet moeten worden genegeerd in het voorbeeld links? Nee hoor! Vanwege een prestatiegerelateerde eigenaardigheid in Git kun je een bestand dat wordt genegeerd niet negeren vanwege een patroon dat overeenkomt met een map

logs/**/debug.log

logs/debug.log logs/monday/debug.log logs/monday/pm/debug.log

Een dubbele asterisk komt overeen met nul of meer mappen.

logs/*day/debug.log

logs/monday/debug.log logs/tuesday/debug.log maar niet logs/latest/debug.log

Jokertekens kunnen ook worden gebruikt in mapnamen.

logs/debug.log

logs/debug.log maar niet debug.log build/logs/debug.log

Patronen die een bestand in een bepaalde map opgeven, zijn relatief ten opzichte van de hoofdmap van de repository. (Je kunt desgewenst een slash vooraan plaatsen, maar die doet niets bijzonders.)

Last updated