Magyar Git Cheat Sheet

Már egy ideje írogatom magamnak azokat a git parancsokat és beállításokat, amiket érdemes megjegyezni és ha véletlen elfelejtenénk akkor jó ha megvan valahol leírva, ne kelljen keresgélni. Én az svn-ről szoktam át a git-re, ezért úgy gondolom azoknak akik hasonlóan cselekedtek - vagy cselekednek - különösen hasznos lehet egy ilyen gyűjtemény.
A leírás folyamatosan bűvülni fog és hamarosan elkészül hozzá a letölthető formátum is, amit szintén rendszeresen frissítek majd, ezért akit érdekel annak érdemes követnie twitter-en, mert ott fogom kommunikálni a változásokat.

És akkor jöjjön a lényeg, a git cheat sheet:

SSH kulcs generálás

Miután a git-el feltelepítettük le kell generálni az ssh kulcsokat, amiket az általunk használt repok-nak meg kell adni:

  ssh-keygen -f ~/.ssh/git.host.id_rsa
  ssh-add <path-to-private-key>
  ssh-agent

Beállítások

Ezeket a beállításokat a ~/.gitconfig fájlban kell beletenni telepítés után. Beállítjuk vele az azonosítónkat, a rivídítéseket és a színeket.

[alias]
    st = status
    ci = commit
    co = checkout
    br = branch
    df = diff
    lg = log -p
    ls = ls-files
[user]
    name = Kalman Hosszu
    email = hosszu.kalman@gmail.com
[color]
    ui = auto
[color "branch"]
    current = green bold
    local = blue
    remote = red
[color "diff"]
    meta = yellow bold
    frag = magenta bold
    old = red bold
    new = green bold
    whitespace = red reverse
[color "status"]
    added = green
    changed = blue
    untracked = red
[core]
    whitespace=fix,-indent-with-non-tab,trailing-space,cr-at-eol

Mac-en használok egy parancssort, aminek két nagyon hasznos funkciója van:

  1. tab-bal kiegészíti és felkínálja (autocompletion) a git parancsokat, tag-eket és branch-eket
  2. a promt-ba látom, hogy melyik branch-ben vagyok és történt-e benne módosítás

A kód a következő:

# Set git autocompletion and PS1 integration
if [ -f /usr/local/git/contrib/completion/git-completion.bash ]; then
    . /usr/local/git/contrib/completion/git-completion.bash
fi
GIT_PS1_SHOWDIRTYSTATE=true
 
if [ -f /opt/local/etc/bash_completion ]; then
   . /opt/local/etc/bash_completion
fi
 
# Nice prompt
PS1='\[\033[0;32m\][\t]\[\033[0m\] \u@\h:\[\033[0;33m\]\w\[\033[0;31m\]$(__git_ps1)\[\033[00m\] \$ '

A beállítások eredmény így néz ki:

Inicializálás

Ezekkel a sorokkal létre lehet hozni egy üres repót,

mkdir modulneve
cd modulneve
git init
git add README.txt
git ci -m "Initial commit"

majd hozzáadhatjuk a távoli szerverhez. Persze a git-nél nem szükséges, hogy legyen remote, lokálba is megéri használni

git remote add origin url

Branch-ek kezelése

Branch létrehozása

Branch létrehozása, majd átváltás rá:

git branch branchName
git checkout branchName

Ugyanez egy lépésben:

git checkout -b branchName

Branch elküldése a remote-ra:

git push origin branch neve

Branch-ek listázása

git branch

Branch-ek listázása a remote-on találhatóakkal együtt

git branch -a

Távoli branch-be átlépés lokálisan

git checkout -b localBranch remoteBranch

Branch törlése

Lokálisan törölhetjük

git branch -d branchName

Majd a remote-ról is ha oda is elküldtük

git push origin :branchName

Tag-ek kezelése

Tag létrehozása

A tag-et létrehozzuk

git tag tagName

Majd kétféleképpen küldhetjük el a távoli repo-ba:

git push origin tagName
git push --tags origin

Tag törlése

Kitörölhetjük lokálisan

git tag -d tagName

A remote-ról is, ha oda is feltoltuk már:

git push origin :refs/tags/tagName

Commit rendberakása

Ezt nagyon szeretem, ha elszúrtam a commit-et akkor sincsen semmi probléma, módosíthatok rajta mielőtt elküldeném a remote-ra.

Ha még szeretnék az előző commit-hoz módosítást hozzáadni akkor megtehetem a következő paranccsal:

git add filePath
git commit --amend

Ha csak az üzenetet szeretném módosítani:

git commit --amend -m "My new commit message"

Előfordulhat az a szituáció is, hogy egy ideje nem commit-oltunk. Ekkor sincs semmi vész a -p kapcsolóval felbonthatjuk hogy a fájl módosításai közül miket szeretnénk a commit-ba beletenni, így ha megírtunk 5 fgv-t, akkor azt szépen 5 (vagy több) commit-ba rendezhetjük

git add -p filePath
git commit -m "My commit message"

SVN revert megfelelője

A svn revert filePath paranccsal visszaállíthatjuk a fájlt a repoban található változatra, tehát minden változásunk eltűnik. Ezt git-ben a következőképpen tehetjük meg:

git checkout filePath

Ha az egész repót vissza akarjuk állítani akkor pedig:

git reset --hard

Merge-elés

Ha a teljes branch-et szeretnénk merge-elni, akkor azt úgy tehetjük meg, hogy átlépünk abba a branch-be, ahova szerenénk merge-elni és kiadjuk a merge parancsot:

git checkout toBranch
git merge fromBranch

tehát itt abban a branch-ben állunk ahova szeretnénk merge-elni a változtatásokat, és arra a branch-re adjuk ki a parancsot ahonnan szerenénk.

SVN merge -c REV branch megfelelője

Vagyis amikor egyetlen commit-ot szeretnénk csak merge-elni:

git cherry-pick commitHash

SVN merge -r FROM:TO branch megfelelője

Vagyis amikor a két megadott commit közötti változásokat szerenénk merge-elni:

git cherry-pick fromCommitHash^..toCommitHash

Itt nem kell megadni, hogy melyik branch-ből szeretnénk merge-elni a módosításokat, mert a commit-ok az egész repón elérhetőek

Patch készítése

A commit-ok tárolása nélkül:

git diff > fileName.patch

A commit-okat is tárolva:

git format-patch -k --stdout fromHash..HEAD > fileName.patch

Patch elfogadása

Commit-ok tárolása nélkül

git apply -v PathToPacth

Ha a második lehetőséget választottuk a patch készítésénél, akkor azt is meg lehet oldani, hogy a patch készítő commit-jei ugyanúgy megjelenjenek. Ez szerintem nagyon hasznos:

git am PathToPatch

Egyenlőre ennyi, ahogy írtam a lista folyamatosan bűvül és hamrasan elkészül az offline verzió is. Akit érdekelnek a frissítések a twitter csatornámon keresztül értesülhet róla.

Prompt

Szep hosszu prompt, lehet ezzel dolgozni? :)

Csak a fájlrendszer miatt

Csak a fájlrendszer miatt olyan hosszú az :) Én tudok vele ;)

Reset

reset parancsról nem tudom svn-ben, csak revert-ről, amúgy jó doksi :)

Fail

Benéztem, javítottam, köszi hogy szóltál!

ignore

Írhatnál még az ignore-ról is. Ahogy elkezdtem git-el foglalkozni, rögtön előjött, és nem olyan egyszerű, mint amilyennek kinéz.

SmartGit

Elkezdtem foglalkozni a git-tel, de kissé megriadtam a parancsok sokasságától. Napi szenten az SVN-t használom, de ott max az 'snv up', 'svn co', az 'svn st' meg az 'svn ci -m ""' az, amit használok, a conflictokat gui-val rendezem.

Ha valaki hozzám hasonlóan félénken közelít a git felé, annak ajánlom a SmartGit nevű progit (http://www.syntevo.com/smartgit/index.html), mely elérhető Windows, Linux és OSX alá is.

Míg parancssorból nem igazán boldogultam, mert mindenféle hibaüzenetekbe botlottam, ezzel 2 perc alatt klónoztam, amit kellett és készen áll a munkára.

Mindenkinek ajánlom!