GIT

GIT napsal původně Linus Torvalds pro správu zdrojových kódů linuxového jádra. Z licenčních důvodů museli opustit projekt BitKeeper a ruční řešení revizí už nepřicházelo vzhledem k množství změn v úvahu.

GIT je decentralizovaný což znamená, že není jeden hlavní repozitář, ke kterému se ostatní “kopie” pouze odvolávají, ale každý klon je považován za plnohodnotný repozitář. Všichni mají vždy k dispozici plnou kopii projektu včetně historie - ale mohou mít i několik různých “plných kopií”. Správce projektu obvykle sehrává z různých repozitářů změny do hlavního repozitáře a rozhoduje o jejich pořadí a prioritách.

Poznámka

Jak to je v Cleerio: Přes uvedené výše, u většiny projektů používáme jeden centrální repozitář, do kterého nahráváme postupně naše změny. Nepoužíváme vlastní kopie celého projektu a navzájem si neklonujeme různé veřejné klony projektu. Příklad: jachym vždycky bude stahovat změny z a posílat změny do repozitáře označeného jako origin na serveru gitlab.geo/gp2-lib/. Nikdy si neudělá kopii od pavel nebo chrudos. Ale: jachym bude vždycky pracovat minimálně se dvěma klony projektu: s origin (tedy tím, co je na serveru) a s lokální kopií.

Intenzivně používáme možnost větvení a zpětné sehrávání - každý vývojář je odpovědný za kód, který posílá do hlavní větve. Kód je ale vyvíjen separátně ve větvích a do hlavní větve masteru jde až po odladění a když je jisté, že nevzniknou konflikty.

Vytvoření prázdného lokálního repozitáře

Poznámka

Předpokládáme, že máte nainstalován systém GIT do vašeho počítače.

Pro takové to domácí verzování stačí, když si v adresáři s vaším projektem založíte repozitář.

$ mkdir muj_projekt
$ cd muj_projekt
$ git init

Příkaz git init budete potřebovat po celou dobu životnosti projektu jenom jednou - na jeho začátku. A pak ho zapomenete.

Když si nevíte rady, zkuste nápovědu

$ git --help

A dostane se vám vyčerpávající odpovědi:

usage: git [--version] [--help] [-C <path>] [-c name=value]
           [--exec-path[=<path>]] [--html-path] [--man-path] [--info-path]
           [-p | --paginate | --no-pager] [--no-replace-objects] [--bare]
           [--git-dir=<path>] [--work-tree=<path>] [--namespace=<name>]
           <command> [<args>]

These are common Git commands used in various situations:

start a working area (see also: git help tutorial)
   clone      Clone a repository into a new directory
   init       Create an empty Git repository or reinitialize an existing one

work on the current change (see also: git help everyday)
   add        Add file contents to the index
   mv         Move or rename a file, a directory, or a symlink
   reset      Reset current HEAD to the specified state
   rm         Remove files from the working tree and from the index

examine the history and state (see also: git help revisions)
   bisect     Use binary search to find the commit that introduced a bug
   grep       Print lines matching a pattern
   log        Show commit logs
   show       Show various types of objects
   status     Show the working tree status

grow, mark and tweak your common history
   branch     List, create, or delete branches
   checkout   Switch branches or restore working tree files
   commit     Record changes to the repository
   diff       Show changes between commits, commit and working tree, etc
   merge      Join two or more development histories together
   rebase     Forward-port local commits to the updated upstream head
   tag        Create, list, delete or verify a tag object signed with GPG

collaborate (see also: git help workflows)
   fetch      Download objects and refs from another repository
   pull       Fetch from and integrate with another repository or a local branch
   push       Update remote refs along with associated objects

'git help -a' and 'git help -g' list available subcommands and some
concept guides. See 'git help <command>' or 'git help <concept>'
to read about a specific subcommand or concept.

Co vlastně udělal příkaz git init ? Vytvořil lokální adresář .git s kompletní historií projektu a nějakou tou konfigurací.

Stav vašeho aktuálního lokálního repozitáře získáte příkazem git status status může vypadat různě, např.

$ git status
On branch master
Your branch is ahead of 'origin/master' by 1 commit.
  (use "git push" to publish your local commits)
nothing to commit, working directory clean

nebo (tyto soubory nejsou v repozitáři a můžu je přidat):

$ git status
    On branch prep
    Your branch is up-to-date with 'origin/prep'.
    Untracked files:
(use "git add <file>..." to include in what will be committed)

    node_modules_ol3/
    package.json.orig
    src/gs/app/gp2.js.orig
    src/gs/layout/layout.js.orig
    src/gs/module/datagrid.js.orig
    src/gs/module/datagrid.js.rej
    ...

Status je dobré číst. Pokud změníme nějaký soubor, ukáže nám to status:

$ git status
On branch master
Your branch is ahead of 'origin/master' by 1 commit.
  (use "git push" to publish your local commits)
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   git.rst

no changes added to commit (use "git add" and/or "git commit -a")

Změny mohu uložit do revize pomocí git commit. Mohu buď vyjmenovat soubor který chci uložit nebo použít přepínač -a, který uloží změny ve všech registrovaných souborech. Další užitečná volba je -m, která přidá komentář ke commitu. Pokud nepoužiji volbu -m, spustí se textový editor podle nastavení systému, do kterého je potřeba komentář zadat:

$ git commit -a -m"Doplnění sekce práce s gitem"
[master 1a99084] Doplnění sekce práce s gitem
1 file changed, 48 insertions(+), 2 deletions(-)

git status prozradí, že změny byly uloženy, ale že lokální kopie mého repozitáře je od 2 commity napřed před verzí na serveru origin:

$ git status
On branch master
Your branch is ahead of 'origin/master' by 2 commits.
  (use "git push" to publish your local commits)
nothing to commit, working directory clean

Příkaz git show může ukázat, co bylo konkrétní změnou v poslední (nebo libovolné) revizi (commitu):

$ git show
commit 1a9908487f5eebbeaad253e835cabb33ca18a8cd
Author: Jachym Cepicky <jachym.cepicky@gmail.com>
Date:   Mon Sep 19 16:37:50 2016 +0200

    Doplnění sekce práce s gitem

diff --git a/git.rst b/git.rst
index 93cab2e..557bd32 100644
--- a/git.rst
+++ b/git.rst
@@ -97,7 +97,53 @@ A dostane se vám vyčerpávající odpovědi::
     concept guides. See 'git help <command>' or 'git help <concept>'
     to read about a specific subcommand or concept.

-Vytvoření prázdného lokálního repozitáře
-========================================
 Co vlastně udělal příkaz `git init` ? Vytvořil lokální adresář `.git` s
 kompletní historií projektu a nějakou tou konfigurací.
+
+Stav vašeho aktuálního lokálního repozitáře získáte příkazem `git status` status
+může vypadat různě, např. ::
+

Každá revize má unikátní identifikátor, který mohu kdykoliv v budoucnu použít a vrátit se k němu, často stačí pouze pár unikátních prvních znaků:

$ git show 1a9908487f
commit 1a9908487f5eebbeaad253e835cabb33ca18a8cd
Author: Jachym Cepicky <jachym.cepicky@gmail.com>
Date:   Mon Sep 19 16:37:50 2016 +0200

    Doplnění sekce práce s gitem

diff --git a/git.rst b/git.rst
index 93cab2e..557bd32 100644

Nový soubor a adresář můžeme přidat (registrovat) v repozitáři příkazem git add:

$ git add cheatsheet.rst
$ git status

On branch master
Your branch is ahead of 'origin/master' by 2 commits.
  (use "git push" to publish your local commits)
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        new file:   cheatsheet.rst

A to je vlastně celé workflow: Pracujete, děláte změny v souborech, ucelené bloky změn ukládáte do repozitáře do samostatných revizí (git commit), nové soubory registrujete v repozitáři jak přicházejí (pomocí git add).