
# Referenca CLI

Pitmaster vključuje CLI, ki posnema podnabor ukazov git. Deluje z repozitorijem v trenutnem delovnem imeniku.

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

Pri namestitvi Composer je skript na mestu `./vendor/bin/pitmaster`; od 0.2.11 tam poišče nalagalnik projekta. V odjavi samega repozitorija Pitmaster poženite `./bin/pitmaster` po `composer install`. Spodnji primeri za obe poti uporabljajo `pitmaster`. Če ga zaženete brez argumentov, izpiše seznam ukazov.

Revizije se razrešujejo kot pri `Repository::resolve()`: `HEAD`, imena vej in oznak, polna imena referenc, polne zgoščene vrednosti ter izrazi `~N` / `^N`. Skrajšane zgoščene vrednosti niso sprejete. Kloniranje, prenos sprememb in potiskanje so na voljo samo prek PHP API.

## Ukazi

### `log`

Prikaže zgodovino potrditvenih zapisov, od najnovejšega naprej.

```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
```

Zapisi omejitve git (`-n N`, `-nN`, `--max-count N`, `--max-count=N`, `-N`) so bili dodani v 0.2.11. Golo število je lastna okrajšava Pitmaster za omejitev. Prvi drugi argument je filter poti; vse po `--` se obravnava kot pot. Vsak drug argument, ki se začne z `-`, izpiše `fatal: unrecognized argument: <arg>` in konča z izhodno kodo 128.

Izhod vključuje `commit <hash>` (rumeno), vrstico `Merge:` za združitvene potrditvene zapise, `Author:` z neobdelano identiteto (ime, e-pošta, časovni žig in časovni pas) ter zamaknjeno sporočilo potrditvenega zapisa. `--oneline` izpiše `abc1234 Subject`. Filter poti se ujema z eno natančno potjo datoteke in pregleda samo zadnjih pet potrditvenih zapisov, določenih z omejitvijo ([#7](https://github.com/inline0/pitmaster/issues/7)).

### `show`

Prikaže podrobnosti potrditvenega zapisa in razliko glede na prvega prednika.

```bash
# Show HEAD
pitmaster show

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

Prikaže metapodatke potrditvenega zapisa (z vrstico `Date:`), nato pa poenoteno razliko. Pri označeni oznaki sta najprej glava oznake in sporočilo. Barve so uporabljene samo, kadar je standardni izhod terminal. Združitveni potrditveni zapisi so prikazani brez razlike.

### `cat-file`

Izpiše neobdelano vsebino objekta git.

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

Sprejme polno zgoščeno vrednost. Izpiše shranjeno vsebino objekta: blobe, potrditvene zapise in oznake kot besedilo, drevesa pa v binarni obliki. Za razliko od `git cat-file -p` dreves ne izpiše v berljivi obliki.

### `status`

Prikaže stanje delovnega drevesa.

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

Izhod:

```
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
```

Datoteke v pripravi so prikazane zeleno, nepripravljene, nerazrešene in nesledene pa rdeče. Med združitvijo s spori se prikaže razdelek `Unmerged paths:`. Pri odklopljenem HEAD izpiše `HEAD detached`, pri čistem drevesu pa `nothing to commit, working tree clean`. `--porcelain=v2` izpiše rezultat ukaza `Repository::statusPorcelainV2()`.

### `diff`

Prikaže spremembe med indeksom in delovnim drevesom (nepripravljene spremembe).

```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
```

Izhod je obarvana poenotena razlika, tudi kadar standardni izhod ni terminal. Za spremenjene besedilne datoteke se ujema z `git diff`; nove, izbrisane, binarne, preimenovane datoteke in datoteke s spremenjenim načinom so oblikovane drugače (glejte [Razlika](https://pitmaster.inline0.dev/sl/docs/operations/diff)). `diff --cached` pred prvim potrditvenim zapisom ne izpiše ničesar ([#5](https://github.com/inline0/pitmaster/issues/5)).

### `add`

Pripravi datoteke za naslednji potrditveni zapis.

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

Vsaka datoteka se prebere iz delovnega drevesa, zapiše kot objekt blob, nato pa se posodobi indeks. Argumenti so poti datotek; imeniki in `.` se ne razširijo.

### `commit`

Ustvari potrditveni zapis iz pripravljenih datotek.

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

Izhod:

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

`-m` je obvezen, razen pri dokončanju ustavljene združitve, izbire potrditvenega zapisa, povrnitve ali ponovne osnovitve, ko se uporabi pripravljeno sporočilo. Avtor in potrjevalec se določita iz spremenljivk okolja, konstant in `.git/config`, kot je opisano v razdelku [Uvod](https://pitmaster.inline0.dev/sl/docs/getting-started).

### `branch`

Izpiše veje ali ustvari novo vejo.

```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
```

Izhod pri izpisu:

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

Ustvarjanje izpiše `Created branch <name>`, brisanje pa `Deleted branch <name>`. `-d` in `-D` delujeta enako: nobeden ne preveri, ali je veja združena, oba pa zavrneta izbris trenutno odjavljene veje.

### `tag`

Izpiše oznake ali ustvari novo oznako.

```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"
```

Ustvarjanje izpiše `Created tag <name>`.

### `checkout`

Preklopi veje ali odklopi 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
```

Posodobi HEAD, indeks in delovno drevo, da ustrezajo cilju, ter izpiše `Switched to '<target>'`. Zavrne izvedbo, če so lokalne spremembe ali nesledene datoteke na poteh, ki se razlikujejo med obema drevesoma. Nepotrjene spremembe v drugih sledenih datotekah prepiše z vsebino cilja; git bi jih ohranil ([#2](https://github.com/inline0/pitmaster/issues/2)). Najprej jih potrdite ali shranite v začasno shrambo.

### `merge`

Združi eno ali več vej v trenutni HEAD ali nadaljuje oziroma prekine združevanje obstoječega spora.

```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
```

Izhod ob uspehu:

```
Merge successful.
```

Izhod ob sporu (na stderr, izhodna koda 1):

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

`-s` sprejema `ours`, `ort` in `recursive`; `ort` in `recursive` uporabljata privzeto združitev. Z `-s` CLI izpiše `Merge successful.` in konča z izhodno kodo 0 tudi, ko se združevanje ustavi zaradi sporov ([#21](https://github.com/inline0/pitmaster/issues/21)), zato nato preverite `status`. `merge --continue` brez potekajoče združitve konča z izhodno kodo 128. Združitev že združene veje ustvari še en združitveni potrditveni zapis ([#6](https://github.com/inline0/pitmaster/issues/6)), nepotrjene spremembe v sledenih datotekah pa se prepišejo enako kot pri `checkout`.

### `cherry-pick`

Uveljavi potrditveni zapis na trenutnem HEAD ali nadaljuje oziroma prekine potekajoči spor.

```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
```

Ob uspehu ne izpiše ničesar. `--continue` in `--abort` brez potekajoče izbire potrditvenega zapisa končata z izhodno kodo 128.

### `revert`

Ustvari povrnitveni potrditveni zapis ali nadaljuje oziroma prekine potekajoči spor.

```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
```

Ob uspehu ne izpiše ničesar. `--continue` in `--abort` brez potekajoče povrnitve končata z izhodno kodo 128.

### `rebase`

Ponovno osnovi trenutno vejo na drugi referenci.

```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
```

Ob uspehu ne izpiše ničesar. `--continue`, `--skip` in `--abort` brez potekajoče ponovne osnovitve izpišejo `fatal: no rebase in progress` in končajo z izhodno kodo 128.

### `bisect`

Z binarnim iskanjem poišče potrditveni zapis, ki je uvedel spremembo.

```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
```

`start`, `good` in `bad` izpišejo polno zgoščeno vrednost naslednje kandidatke, ki je odjavljena. Ko ostane samo en sumljivi potrditveni zapis, se ista zgoščena vrednost izpiše znova: ta potrditveni zapis je prvi slab. Za razliko od git se povzetek »is the first bad commit« ne izpiše.

### `stash`

Shrani in obnovi spremembe delovnega imenika.

```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
```

Sporočilo je argument za `push` ali `save`; `-m` ni podprt in bi bil shranjen kot sporočilo. `pop`, `apply` in `drop` vedno uporabljajo `stash@{0}`. Izpišejo `Saved working directory to stash abc1234`, `Applied and dropped stash`, `Applied stash` in `Dropped stash`.

Izhod seznama začasno shranjenih sprememb:

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

Če je več kot en vnos, `drop` in `pop` trenutno pustita vnos na seznamu ([#10](https://github.com/inline0/pitmaster/issues/10)), `apply` pa prepiše nepotrjene spremembe v datotekah, ki se jih začasna shramba ne dotika ([#11](https://github.com/inline0/pitmaster/issues/11)).

### `blame`

Prikaže avtorstvo posameznih vrstic datoteke v HEAD.

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

Izhod:

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

Vsaka vrstica prikazuje prvih 8 znakov zgoščene vrednosti potrditvenega zapisa in prvih 30 znakov identitete avtorja (`Name <email> timestamp timezone`), brez dopolnjevanja.

### `grep`

Išče po vsebini datotek v drevesu trenutnega HEAD.

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

Izhod:

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

Možnosti morajo biti navedene pred vzorcem:

- `-i`, `--ignore-case`: ne razlikuje med velikimi in malimi črkami
- `-E`, `--extended-regexp`, `--regex`: vzorec obravnava kot regularni izraz PCRE

Izhod je navadno besedilo `path:line:content` brez barv.

### `reflog`

Prikaže vnose Reflog, od najnovejšega naprej.

```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"
```

Privzeta oblika je `%gd: %gs` (`HEAD@{0}: commit: Add feature`). Podprti nadomestni nizi: `%gd` in `%gD` (izbirnik), `%gs` (sporočilo), `%H` in `%h` (polna in kratka nova zgoščena vrednost). Omejitve sprejemajo `-n N`, `-nN` in `--max-count N`; `-n 0` izpiše vse vnose.

Repozitoriji, ki jih ustvari `pitmaster init`, ne beležijo dnevnikov Reflog, razen če je v `.git/config` `core.logallrefupdates` nastavljeno na `true` ([#8](https://github.com/inline0/pitmaster/issues/8)); zato `reflog` tam ne izpiše ničesar, dokler to ni nastavljeno.

### `refs`

Izpiše vse reference z njihovimi zgoščenimi vrednostmi.

```bash
pitmaster refs
```

Izhod:

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

Zgoščene vrednosti se izpišejo v celoti.

### `reset`

Ponastavi HEAD na določen potrditveni zapis.

```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
```

Obvezna je revizija. Izhod:

```
HEAD is now at abc1234
```

### `init`

Inicializira nov repozitorij. To je edini ukaz, za katerega ne potrebujete obstoječega repozitorija.

```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
```

Izhod:

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

`--object-format` sprejema `sha1` (privzeto) in `sha256`.

## Izhodne kode

| Koda | Pomen |
|------|---------|
| 0 | Uspešno |
| 1 | Napaka ukaza: napačna uporaba, neznan ukaz, neuspešna operacija (`error: <message>`) ali združitev, ustavljena zaradi sporov |
| 128 | Repozitorij ni git (`fatal: <message>`), neprepoznan argument `log` ali `--continue` / `--abort` / `--skip` brez potekajoče operacije |
