====== Git osnove ====== FIXME Bilješke s Git radionice [[http://radiona.org/git-radionica-code-soup/|Code Soup]], Dobrice Pavlinušića. git reset ahead git commit --ammend git rebase git diff git log -f git grep [nešto] Zanimljivi projekti koji koriste git: * etckeeper http://etckeeper.branchable.com/ * git-annex (ala dropbox) https://git-annex.branchable.com/ * bak-git https://github.com/dpavlin/bak-git * promjene git sprema na razini **LINIJA** * bilo kakve datoteke/formati bazirane na linijama (kicad, SVG) * git je distribuiran, svaki repozitorij/fajlovi su prisutni na svakom drugom. * preporuča se da promjene budu manje (kako bi se potencijalno mogli iskorisititi i za druge...) * git je napravljen za kernel developere * u gitu se mogu raditi svoje naredbe * gitlab alternativa githubu kad ne zelimo imat javni rep ili ne zelimo platit ''remote'' u git terminologiji je repozitorij koji je negdje drugdje (u drugom direktoriju ili na mreži) ''clone'' kloniranje svega s remote repozitorija i kopiranje na local repozitorij ''init'' uđi u folder, initialize a repository on a new folder or existing one ''.git'' folder u kojem git sprema sve (nije backup) ... delete to destroy repository ''.gitignore'' specify files and file patterns for git to ignore (create file: ''touch .gitignore'' and add e.g. *.log) ''commit'' changes go to local repo... making safe points... ''git commit -m "description"'' dodavanje opisa uz commit, u protivnom se otvori vim editor ''push'' push changes from local to remote ''pull'' sync lokal s remote repozitorijem. povuci sve promjene s remote repozitorija koje nisu u lokalnom repozitoriju. ''rebase'' (tvoj commit stavlja kao zadnji (na vrhu) master brancha) ''pull --rebase'' ensures that your changes commited localy will always be put on top of anything you pull from remote ''rsync'' je ok način za prebacit repozitorij na drugo računao ''git fetch origin'' s remote repozitirija povuci sve promjene napravljene u međuvremenu (od zadnjeg cloniranja ili fetch-anja)... fetching povuče sve promjene u lokalni repozitorij, ali ih ne merge-a. ''git pull origin'' will automatically fetch and merge the changes from the remote branch into your current branch ''git push origin master'' we are telling git to push our changes to the remote repository known to us as origin and commit them to the master branch ''git remote add IME_DODATNOG_REPOZITORIJA http://git...'' adding additional remote repositories ''diff'' (pogledaj trenutno stanje u odnosu na master) ''git log -p'' ''git grep'' (grepa samo kroz stvari koje su u samom gitu (commitovima); kao grep ali na manjem setu fajlova) ''git grep -i'' (case insensitive) ''git status'' check status of the repository ... what files are untracked ''git add'' stage a file for commit ''pre commit hook'' (nešto što se projavi prije comminta pa se može nešto napraviti npr. izbrisati spejsove (davor!)) ''git squash'' (sve squasha u jedan commit)\\ ''git patch'' (slicno ali bez kreiranja novog brancha) ''git cherry pick'' (?) ''pre commit'' ogranicavanje usera ''HEAD'' (teoretski trenutni zadnji commit) ''git commit -m "description"''\\ ''git push'' ''git add .'' ("." stage everything in current directory)\\ ''git add *''\\ ''git add *.txt'' ''git branch IME_NOVOG_BRANCHA'' create new branch ''git checkout IME_NOVOG_BRANCHA'' ''git checkout master'' switch back to the main branch ''git merge IME_NOVOG_BRANCHA'' ... ali i potencijalni konflikti... ===== Primjer grupnog rada ===== (Dobrica je kreirao github repozitorij) git clone https://github.com/username/radiona-git-soup cd radiona-git-soup/ ls git add * git status git commit git log git commit git log git push --- nakon konflikta ''git remote add dpavlin https://github.com/dpavlin/radiona-git-soup'' ''git remote -v'' (ispisuje sve repozitorije koje mogu koristit lokalno) ''git fetch dpavlin'' (povlači i na disk spremi promjene, ali ih ne apply-a na lokalne fajlove na disku) ''git pull dpavlin master'' (pull?) ''git status'' (kad god je neka nejasnoca) ''git rm README'' (brisanje file) ''ls'' ''git diff'' (ispisivanje razlike između lokalne i remote verzije) ''git commit'' (lokalno primjeniš promjene) ''git push'' (gurni remote) ''git log --oneline --graph --decorate'' (ascii grafovi) ''git commit --amend'' (modificiraj zadnji commit koji si napravio, nadoštukaš :) ''git show SHA (hash)'' (promjene u tom commit-u) ''git revert SHA'' (makne commit) ''git rebase'' ''git reset HARD'' (trenutno smo u neobičnoj situaciji :) ''git rebase -i'' (sve komite iza nekog ce otvoriti u editoru) ''drop'' (izbaci pojedini commit) otišli smo u povijest i nešto izmjenili. a to nije uredu! napravili smo sr*nje :) SHA ovisi i o prošlim commitovima, što znači da ako nešto promjenimo (''rebase'') mjenjaju se i SHA-ove. To je razlog zasto izbjegavamo ''rebase'' ako su i drugi contributory ukljuceni. ''git push -f'' (izvlacenje iz situacije) ===== Merge-anje submodula u jedan ===== primjer f32c mkdir subodules/ cd sumbodules/ mkdir f32c/ cd f32c/ git init git submodule add https://github.com/f32c/f32c git submodule add https://github.com/f32c/arduino git status (javlja promjene) git commit git sumbodules init git submodules update git submodules foreach git diff ===== Korištenje tagova ===== Tags (human readable name za neki commit)\\ Za svaki commit mozemo dati tag koji dohvaćamo isto kao i preko SHA ===== Pre commit skripta ===== Dobrica&Davor script. Remove whitespace from end of lines. Kako se koristi? #!/bin/sh # remove whitespace from end of lines git diff --name-only --cached | while read file ; do egrep '[ ]+$' $file && cat $file | sed 's/[ \r]\+$//g' > $file.new && mv $file.new $file || exit 0 done # CR: