
# Referencia CLI

Pitmaster obsahuje CLI, ktorý odzrkadľuje podmnožinu príkazov git. Pracuje s úložiskom v aktuálnom pracovnom adresári.

```bash
./vendor/bin/pitmaster <command> [args...]
```

Pri inštalácii z Composer je skript na ceste `./vendor/bin/pitmaster`; od 0.2.11 tam vyhľadáva autoloader projektu. Pri checkoutnutí samotného úložiska Pitmaster spustite `./bin/pitmaster` po `composer install`. V príkladoch nižšie sa pre obe cesty používa `pitmaster`. Spustenie bez argumentov vypíše zoznam príkazov.

Revízie sa vyhľadávajú rovnako ako v `Repository::resolve()`: `HEAD`, názvy vetiev a značiek, úplné názvy refov, úplné hashe a výrazy `~N` / `^N`. Skrátené hashe sa neprijímajú. Klonovanie, načítanie zmien a odosielanie sú dostupné iba cez PHP API.

## Príkazy

### `log`

Zobrazí históriu commitov od najnovšieho.

```bash
# Default: last 10 commits
pitmaster log

# Limit the number of commits
pitmaster log 25
pitmaster log -n 3
pitmaster log -n3
pitmaster log --max-count 3
pitmaster log --max-count=3
pitmaster log -3

# Commits that touch one file
pitmaster log src/Repository.php
pitmaster log -- src/Repository.php

# Commits reachable from all refs, and one line per commit
pitmaster log --all
pitmaster log --oneline
```

Zápisy limitu git (`-n N`, `-nN`, `--max-count N`, `--max-count=N`, `-N`) boli pridané v 0.2.11. Samotné číslo je vlastná skrátená forma limitu v Pitmaster. Prvý ďalší argument je filter cesty; všetko po `--` sa považuje za cestu. Každý iný argument začínajúci na `-` vypíše `fatal: unrecognized argument: <arg>` a skončí s kódom 128.

Výstup obsahuje `commit <hash>` (žlté), riadok `Merge:` pre zlučovacie commity, `Author:` so surovou identitou (meno, e-mail, časová pečiatka a časové pásmo) a odsadenú správu commitu. `--oneline` vypíše `abc1234 Subject`. Filter cesty sa zhoduje s jednou presnou cestou k súboru a kontroluje iba päťnásobok limitu najnovších commitov ([#7](https://github.com/inline0/pitmaster/issues/7)).

### `show`

Zobrazí podrobnosti commitu a rozdiel oproti prvému rodičovi.

```bash
# Show HEAD
pitmaster show

# Show a specific commit
pitmaster show HEAD~3
pitmaster show v1.0.0
pitmaster show 3f2c1e0b9d6a4f8e7c5b2a1d0e9f8c7b6a5d4e3f
```

Zobrazí metadáta commitu (s riadkom `Date:`) a za nimi zjednotený rozdiel. Pri anotovanej značke sa najskôr zobrazí hlavička značky a jej správa. Farby sa používajú iba vtedy, keď je stdout terminál. Zlučovacie commity sa zobrazia bez rozdielu.

### `cat-file`

Vypíše surový obsah objektu git.

```bash
pitmaster cat-file a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2
```

Vyžaduje úplný hash. Vypíše uložený obsah objektu: bloby, commity a značky ako text, stromy v binárnej podobe. Na rozdiel od `git cat-file -p` sa stromy nevypisujú v čitateľnej forme.

### `status`

Zobrazí stav pracovného stromu.

```bash
pitmaster status
pitmaster status --porcelain=v2
```

Výstup:

```
On branch main

Changes to be committed:
	new file:   src/Feature.php

Changes not staged for commit:
	modified:   src/Existing.php

Untracked files:
	notes.txt
```

Súbory v indexe sa zobrazujú zelenou farbou, nezaznamenané, nezlúčené a nesledované červenou. Počas konfliktu zlúčenia sa zobrazí sekcia `Unmerged paths:`. Pri odpojenom HEAD sa vypíše `HEAD detached`, pri čistom pracovnom strome `nothing to commit, working tree clean`. `--porcelain=v2` vypíše výstup `Repository::statusPorcelainV2()`.

### `diff`

Zobrazí zmeny medzi indexom a pracovným stromom (nezaznamenané zmeny).

```bash
# Unstaged changes
pitmaster diff

# Staged changes (index vs HEAD)
pitmaster diff --cached
pitmaster diff --staged

# Choose the algorithm
pitmaster diff --patience
pitmaster diff --histogram
pitmaster diff --minimal
```

Výstup je farebný zjednotený rozdiel, a to aj vtedy, keď stdout nie je terminál. Pri upravených textových súboroch zodpovedá výstupu príkazu `git diff`; formát nových, odstránených, binárnych a premenovaných súborov, ako aj súborov so zmeneným režimom, je odlišný (pozrite si časť [Rozdiel](https://pitmaster.inline0.dev/sk/docs/operations/diff)). `diff --cached` pred prvým commitom nevypíše nič ([#5](https://github.com/inline0/pitmaster/issues/5)).

### `add`

Pridá súbory do indexu pre nasledujúci commit.

```bash
pitmaster add src/Feature.php
pitmaster add src/Feature.php tests/FeatureTest.php README.md
```

Každý súbor sa načíta z pracovného stromu, zapíše ako objekt blobu a aktualizuje sa index. Argumenty sú cesty k súborom; adresáre a `.` sa nerozbaľujú.

### `commit`

Vytvorí commit zo súborov v indexe.

```bash
pitmaster commit -m "Add new feature"
```

Výstup:

```
[main abc1234] Add new feature
```

Vyžaduje sa `-m`, okrem dokončenia zastaveného zlúčenia, cherry-picku, vrátenia zmien alebo rebasingu, keď sa použije pripravená správa. Autor a tvorca commitu sa určujú z premenných prostredia, konštánt a `.git/config`, ako je opísané v časti [Začíname](https://pitmaster.inline0.dev/sk/docs/getting-started).

### `branch`

Vypíše vetvy alebo vytvorí novú.

```bash
# List all branches (current marked with *)
pitmaster branch

# Create a new branch from HEAD
pitmaster branch feature/new-thing

# Delete a branch
pitmaster branch -d feature/old
pitmaster branch -D feature/old
```

Výstup pri vypisovaní:

```
  bugfix/typo
  feature/login
* main
```

Pri vytváraní sa vypíše `Created branch <name>`, pri odstraňovaní `Deleted branch <name>`. `-d` a `-D` fungujú rovnako: nekontrolujú, či je vetva zlúčená, a oba odmietnu odstrániť aktuálne checkoutnutú vetvu.

### `tag`

Vypíše značky alebo vytvorí novú.

```bash
# List all tags
pitmaster tag

# Create a lightweight tag at HEAD
pitmaster tag v1.0.0

# Create an annotated tag at HEAD
pitmaster tag v2.0.0 -m "Release version 2.0.0"
```

Pri vytváraní sa vypíše `Created tag <name>`.

### `checkout`

Prepne vetvy alebo odpojí HEAD.

```bash
# Switch to a branch
pitmaster checkout feature/login

# Detach HEAD at a tag or commit
pitmaster checkout v1.0.0
pitmaster checkout HEAD~2
```

Aktualizuje HEAD, index a pracovný strom tak, aby zodpovedali cieľu, a vypíše `Switched to '<target>'`. Odmietne operáciu, ak sú miestne zmeny alebo nesledované súbory v cestách, ktoré sa medzi stromami líšia. Nepotvrdené zmeny v ostatných sledovaných súboroch sa prepíšu obsahom cieľa; príkaz git by ich zachoval ([#2](https://github.com/inline0/pitmaster/issues/2)). Najskôr ich potvrďte alebo odložte.

### `merge`

Zlúči jednu alebo viac vetiev do aktuálneho HEAD alebo pokračuje v prebiehajúcom konflikte zlúčenia či ho preruší.

```bash
# Start a merge
pitmaster merge feature/login

# Merge with a strategy
pitmaster merge -s ours feature/login

# Octopus merge of several branches
pitmaster merge feature/a feature/b

# Continue after resolving conflicts
pitmaster add a.txt
pitmaster merge --continue

# Abort and restore the pre-merge state
pitmaster merge --abort
```

Výstup pri úspechu:

```
Merge successful.
```

Výstup pri konflikte (na stderr, kód ukončenia 1):

```
CONFLICT in: src/File.php, src/Other.php
```

`-s` prijíma `ours`, `ort` a `recursive`; `ort` a `recursive` používajú predvolené zlučovanie. Pri použití `-s` príkaz CLI vypíše `Merge successful.` a skončí s kódom 0, aj keď sa zlúčenie zastavilo pre konflikty ([#21](https://github.com/inline0/pitmaster/issues/21)), preto potom skontrolujte `status`. Príkaz `merge --continue` bez prebiehajúceho zlúčenia skončí s kódom 128. Zlúčením vetvy, ktorá už je zlúčená, vznikne ďalší zlučovací commit ([#6](https://github.com/inline0/pitmaster/issues/6)) a nepotvrdené zmeny v sledovaných súboroch sa prepíšu rovnako ako pri `checkout`.

### `cherry-pick`

Aplikuje commit na aktuálny HEAD alebo pokračuje v prebiehajúcom konflikte či ho preruší.

```bash
# Start a cherry-pick
pitmaster cherry-pick feature~1

# Continue after resolving conflicts
pitmaster add a.txt
pitmaster cherry-pick --continue

# Abort and restore HEAD
pitmaster cherry-pick --abort
```

Pri úspechu nevypíše nič. Príkazy `--continue` a `--abort` bez prebiehajúceho cherry-picku skončia s kódom 128.

### `revert`

Vytvorí commit, ktorý vráti zmeny, alebo pokračuje v prebiehajúcom konflikte či ho preruší.

```bash
# Start a revert
pitmaster revert HEAD~1

# Continue after resolving conflicts
pitmaster add a.txt
pitmaster revert --continue

# Abort and restore HEAD
pitmaster revert --abort
```

Pri úspechu nevypíše nič. Príkazy `--continue` a `--abort` bez prebiehajúceho vrátenia zmien skončia s kódom 128.

### `rebase`

Zmení základ aktuálnej vetvy na inú referenciu.

```bash
# Start a rebase
pitmaster rebase main

# Continue after resolving conflicts
pitmaster rebase --continue

# Skip the current commit
pitmaster rebase --skip

# Abort and restore the original branch tip
pitmaster rebase --abort
```

Pri úspechu nevypíše nič. Príkazy `--continue`, `--skip` a `--abort` bez prebiehajúceho rebasingu vypíšu `fatal: no rebase in progress` a skončia s kódom 128.

### `bisect`

Binárnym vyhľadávaním nájde commit, ktorý zaviedol zmenu.

```bash
# Start with a bad and a good revision; checks out and prints the first candidate
pitmaster bisect start HEAD v1.0.0

# Mark the checked-out candidate (or a given revision)
pitmaster bisect good
pitmaster bisect bad
pitmaster bisect bad HEAD~3

# End the session and return to the starting branch
pitmaster bisect reset
```

Príkazy `start`, `good` a `bad` vypíšu úplný hash ďalšieho kandidáta a vykonajú jeho checkout. Keď zostane jediný podozrivý commit, vypíše sa znova ten istý hash: daný commit je prvý chybný commit. Na rozdiel od git sa nevypíše súhrn „is the first bad commit“.

### `stash`

Uloží a obnoví zmeny pracovného adresára.

```bash
# Save current changes (push)
pitmaster stash
pitmaster stash push
pitmaster stash push "Work in progress on login"
pitmaster stash save "Work in progress on login"

# Apply and remove the top stash entry
pitmaster stash pop

# Apply without removing
pitmaster stash apply

# List stash entries
pitmaster stash list

# Drop the top stash entry
pitmaster stash drop
```

Správa je argument za `push` alebo `save`; možnosť `-m` nie je podporovaná a uložila by sa ako správa. Príkazy `pop`, `apply` a `drop` vždy používajú `stash@{0}`. Vypisujú `Saved working directory to stash abc1234`, `Applied and dropped stash`, `Applied stash` a `Dropped stash`.

Výstup zoznamu odložených zmien:

```
stash@{0}: On main: Work in progress on login
stash@{1}: WIP on main: abc1234 Add new feature
```

Ak je položiek viac, príkazy `drop` a `pop` momentálne ponechajú danú položku v zozname ([#10](https://github.com/inline0/pitmaster/issues/10)), zatiaľ čo príkaz `apply` prepíše nepotvrdené zmeny v súboroch, ktorých sa odložené zmeny netýkajú ([#11](https://github.com/inline0/pitmaster/issues/11)).

### `blame`

Zobrazí autorstvo jednotlivých riadkov súboru v HEAD.

```bash
pitmaster blame src/Repository.php
```

Výstup:

```
a1b2c3d4 (Jane Smith <jane@example.com> ) <?php
a1b2c3d4 (Jane Smith <jane@example.com> )
f5e6d7c8 (Ann Lee <ann@example.com> 1700) declare(strict_types=1);
```

Každý riadok zobrazuje prvých 8 znakov hashu commitu a prvých 30 znakov identity autora (`Name <email> timestamp timezone`), bez doplnenia medzerami.

### `grep`

Vyhľadá obsah súborov v aktuálnom strome HEAD.

```bash
pitmaster grep "function merge"
pitmaster grep -i -E "h.llo"
```

Výstup:

```
src/Repository.php:2257:    public function merge(string $branch, string $strategy = 'recursive'): MergeResult
src/Merge/ThreeWayMerge.php:23:    public static function merge(
```

Možnosti musia byť pred vzorom:

- `-i`, `--ignore-case`: vyhľadávanie bez rozlišovania malých a veľkých písmen
- `-E`, `--extended-regexp`, `--regex`: považovanie vzoru za regulárny výraz PCRE

Výstup je obyčajný `path:line:content` bez farieb.

### `reflog`

Zobrazí položky reflogu od najnovšej.

```bash
# HEAD reflog (default: 10 entries)
pitmaster reflog

# Another ref, a custom limit, and a format
pitmaster reflog show refs/heads/main
pitmaster reflog -n 5
pitmaster reflog --format="%h %gs"
```

Predvolený formát je `%gd: %gs` (`HEAD@{0}: commit: Add feature`). Podporované zástupné značky: `%gd` a `%gD` (výber), `%gs` (správa), `%H` a `%h` (úplný a krátky nový hash). Limity prijímajú `-n N`, `-nN` a `--max-count N`; `-n 0` vypíše všetky položky.

Úložiská vytvorené pomocou `pitmaster init` nezaznamenávajú reflogy, pokiaľ v `.git/config` nie je `core.logallrefupdates` nastavené na `true` ([#8](https://github.com/inline0/pitmaster/issues/8)), takže `reflog` tam dovtedy nič nevypíše.

### `refs`

Vypíše všetky refy spolu s ich hashmi.

```bash
pitmaster refs
```

Výstup:

```
abc123def456... refs/heads/main
789012abc345... refs/heads/feature/login
def456789012... refs/tags/v1.0.0
```

Hashy sa vypisujú celé.

### `reset`

Presunie HEAD na konkrétny commit.

```bash
# Mixed reset (HEAD + index, default)
pitmaster reset HEAD~1
pitmaster reset --mixed HEAD~1

# Soft reset (HEAD only)
pitmaster reset --soft HEAD~1

# Hard reset (HEAD + index + worktree)
pitmaster reset --hard HEAD~3
```

Vyžaduje sa revízia. Výstup:

```
HEAD is now at abc1234
```

### `init`

Inicializuje nové úložisko. Je to jediný príkaz, ktorý nevyžaduje existujúce úložisko.

```bash
# Initialize in the current directory
pitmaster init

# Initialize at a specific path
pitmaster init /path/to/new-project

# Create a SHA-256 repository
pitmaster init --object-format=sha256
pitmaster init /path/to/new-project --object-format=sha256
```

Výstup:

```
Initialized empty Pitmaster repository in /path/to/new-project/.git/
```

`--object-format` prijíma `sha1` (predvolené) a `sha256`.

## Návratové kódy

| Kód | Význam |
|------|---------|
| 0 | Úspech |
| 1 | Chyba príkazu: chyba pri použití, neznámy príkaz, neúspešná operácia (`error: <message>`) alebo zlúčenie zastavené pre konflikty |
| 128 | Nejde o úložisko git (`fatal: <message>`), nerozpoznaný argument `log` alebo `--continue` / `--abort` / `--skip` bez prebiehajúcej operácie |
