
# CLI referencia

A Pitmaster egy CLI felületet tartalmaz, amely a git-parancsok egy részhalmazát tükrözi. Az aktuális munkakönyvtár tárolóján működik.

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

Composer telepítés esetén a szkript helye: `./vendor/bin/pitmaster`; 0.2.11 óta ott találja meg a projekt autoloaderét. A Pitmaster tároló saját checkoutjában futtassa a `./bin/pitmaster` parancsot a `composer install` után. Az alábbi példákban mindkét útvonalon a `pitmaster` szerepel. Argumentumok nélkül futtatva kiírja a parancslistát.

A revíziók feloldása a `Repository::resolve()` működését követi: `HEAD`, ág- és címkenevek, teljes hivatkozásnevek, teljes hashek, valamint `~N` / `^N` kifejezések. Rövidített hashek nem fogadhatók el. A klónozás, lekérés és feltöltés csak a PHP API felületen keresztül érhető el.

## Parancsok

### `log`

Véglegesítési előzmények megjelenítése, a legújabbal kezdve.

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

A git limitmegadási formái (`-n N`, `-nN`, `--max-count N`, `--max-count=N`, `-N`) a 0.2.11 verzióban jelentek meg. A puszta szám a Pitmaster saját rövidítése a limit megadására. Az első további argumentum útvonalszűrő; az `--` utáni összes argumentumot útvonalnak tekinti. Minden más, `-` karakterrel kezdődő argumentum kiírja a `fatal: unrecognized argument: <arg>` értéket, és 128 kóddal lép ki.

A kimenet tartalmazza a `commit <hash>` értéket (sárga), a merge-véglegesítések `Merge:` sorát, a nyers azonosítót (név, e-mail-cím, időbélyeg és időzóna) tartalmazó `Author:` értéket, valamint behúzva a véglegesítés üzenetét. A `--oneline` kiírja a `abc1234 Subject` értéket. Az útvonalszűrő egyetlen pontos fájlútvonalra illeszkedik, és csak a limit ötszörösének megfelelő legújabb véglegesítést vizsgálja ([#7](https://github.com/inline0/pitmaster/issues/7)).

### `show`

Véglegesítés részleteinek és az első szülőhöz viszonyított diffjének megjelenítése.

```bash
# Show HEAD
pitmaster show

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

A véglegesítés metaadatai (egy `Date:` sorral), majd egy egységes diff jelenik meg. Annotált címke esetén először a címke fejléce és üzenete jelenik meg. Színeket csak akkor használ, ha a stdout terminál. A merge-véglegesítések diff nélkül jelennek meg.

### `cat-file`

Egy git objektum nyers tartalmának kiírása.

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

Teljes hash szükséges. Kiírja az objektum tárolt tartalmát: a blobok, véglegesítések és címkék szövegként, a fák bináris formában jelennek meg. A `git cat-file -p` paranccsal ellentétben a fákat nem formázza olvashatóvá.

### `status`

A munkafa állapotának megjelenítése.

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

Kimenet:

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

A stage-elt fájlok zölden, a nem stage-elt, feloldatlan és nem követett fájlok pirossal jelennek meg. Konfliktusos merge esetén megjelenik egy `Unmerged paths:` szakasz. Leválasztott HEAD esetén a `HEAD detached` jelenik meg, tiszta fa esetén pedig a `nothing to commit, working tree clean`. A `--porcelain=v2` az `Repository::statusPorcelainV2()` kimenetét írja ki.

### `diff`

Az index és a munkafa közötti változások megjelenítése (nem stage-elt módosítások).

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

A kimenet színezett, egységes diff, akkor is, ha a stdout nem terminál. Módosított szövegfájloknál a `git diff` formátumot használja; az új, törölt, bináris, átnevezett és módmódosított fájlok formázása eltér (lásd: [Diff](https://pitmaster.inline0.dev/hu/docs/operations/diff)). Az első véglegesítés előtt a `diff --cached` nem ír ki semmit ([#5](https://github.com/inline0/pitmaster/issues/5)).

### `add`

Fájlok stage-elése a következő véglegesítéshez.

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

Minden fájlt beolvas a munkafából, blob objektumként írja ki, majd frissíti az indexet. Az argumentumok fájlútvonalak; a könyvtárak és a `.` nem kerülnek kibontásra.

### `commit`

Véglegesítés létrehozása a stage-elt fájlokból.

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

Kimenet:

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

A `-m` megadása kötelező, kivéve egy megállt merge, cherry-pick, revert vagy rebase befejezésekor, amikor az előkészített üzenetet használja. A szerző és a véglegesítő adatait a környezeti változókból, konstansokból és a `.git/config` értékből oldja fel a [Kezdő lépések](https://pitmaster.inline0.dev/hu/docs/getting-started) részben leírtak szerint.

### `branch`

Ágak listázása vagy új ág létrehozása.

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

Listázás kimenete:

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

Létrehozáskor `Created branch <name>`, törléskor `Deleted branch <name>` jelenik meg. A `-d` és `-D` azonosan működnek: egyik sem ellenőrzi, hogy az ág beolvadt-e, és mindkettő megtagadja a jelenleg checkoutolt ág törlését.

### `tag`

Címkék listázása vagy új címke létrehozása.

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

Létrehozáskor `Created tag <name>` jelenik meg.

### `checkout`

Ágak közötti váltás vagy a HEAD leválasztása.

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

Frissíti a HEAD-et, az indexet és a munkafát, hogy azok megfeleljenek a célnak, majd kiírja a `Switched to '<target>'` értéket. Megtagadja a műveletet, ha a két fában eltérő útvonalakon helyi módosítások vagy nem követett fájlok vannak. A többi követett fájl nem véglegesített módosításai felülíródnak a cél tartalmával, miközben a git megtartaná őket ([#2](https://github.com/inline0/pitmaster/issues/2)); előbb véglegesítse vagy tegye félre ezeket.

### `merge`

Egy vagy több ág beolvasztása az aktuális HEAD-be, vagy egy folyamatban lévő merge-konfliktus folytatása/megszakítása.

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

Sikeres művelet kimenete:

```
Merge successful.
```

Konfliktus esetén a kimenet (stderr, 1-es kilépési kód):

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

A `-s` elfogadja a `ours`, `ort` és `recursive` értékeket; a `ort` és `recursive` egyaránt az alapértelmezett merge-et használja. A `-s` megadásakor a CLI kiírja a `Merge successful.` értéket, és 0-val lép ki akkor is, ha a merge konfliktus miatt állt meg ([#21](https://github.com/inline0/pitmaster/issues/21)); ezért utána ellenőrizze a `status` értékét. Merge nélkül a `merge --continue` 128 kóddal lép ki. Egy már beolvadt ág merge-elése újabb merge-véglegesítést hoz létre ([#6](https://github.com/inline0/pitmaster/issues/6)), a követett fájlok nem véglegesített módosításai pedig a `checkout` működéséhez hasonlóan felülíródnak.

### `cherry-pick`

Véglegesítés alkalmazása az aktuális HEAD-re, vagy folyamatban lévő konfliktus folytatása/megszakítása.

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

Siker esetén nem ír ki semmit. Folyamatban lévő cherry-pick nélkül a `--continue` és a `--abort` 128 kóddal lép ki.

### `revert`

Visszavonó véglegesítés létrehozása, vagy folyamatban lévő konfliktus folytatása/megszakítása.

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

Siker esetén nem ír ki semmit. Folyamatban lévő revert nélkül a `--continue` és a `--abort` 128 kóddal lép ki.

### `rebase`

Az aktuális ág újraalapozása egy másik hivatkozásra.

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

Siker esetén nem ír ki semmit. Folyamatban lévő rebase nélkül a `--continue`, a `--skip` és a `--abort` kiírja a `fatal: no rebase in progress` értéket, majd 128 kóddal lép ki.

### `bisect`

Bináris kereséssel annak a véglegesítésnek a megkeresése, amely bevezette a változást.

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

A `start`, a `good` és a `bad` kiírja a következő jelölt teljes hashét, amelyet checkoutol. Ha már csak egy gyanúsított marad, ugyanaz a hash jelenik meg ismét: ez az első hibás véglegesítés. A git-től eltérően nem jelenik meg az „is the first bad commit” összegzés.

### `stash`

Munkakönyvtár-módosítások mentése és visszaállítása.

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

Az üzenet a `push` vagy `save` utáni argumentum; a `-m` nem támogatott, és üzenetként kerülne tárolásra. A `pop`, a `apply` és a `drop` mindig a `stash@{0}` értéket használja. Ezek a `Saved working directory to stash abc1234`, `Applied and dropped stash`, `Applied stash` és `Dropped stash` értékeket írják ki.

Stash-lista kimenete:

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

Ha egynél több bejegyzés van, a `drop` és a `pop` jelenleg a listában hagyja a bejegyzést ([#10](https://github.com/inline0/pitmaster/issues/10)), a `apply` pedig felülírja azoknak a fájloknak a nem véglegesített módosításait, amelyekhez a stash nem nyúl ([#11](https://github.com/inline0/pitmaster/issues/11)).

### `blame`

Fájl sorainak szerzői adatainak megjelenítése a HEAD állapotában.

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

Kimenet:

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

Minden sor a commit hash első 8 karakterét és a szerzőazonosító első 30 karakterét mutatja (`Name <email> timestamp timezone`), kitöltés nélkül.

### `grep`

Fájlok tartalmának keresése az aktuális HEAD fában.

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

Kimenet:

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

Az opcióknak a minta előtt kell szerepelniük:

- `-i`, `--ignore-case`: kis- és nagybetűkre nem érzékeny egyezés
- `-E`, `--extended-regexp`, `--regex`: a mintát PCRE reguláris kifejezésként kezeli

A kimenet egyszerű `path:line:content`, színek nélkül.

### `reflog`

A reflogbejegyzések megjelenítése, a legújabbal kezdve.

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

Az alapértelmezett formátum: `%gd: %gs` (`HEAD@{0}: commit: Add feature`). Támogatott helyőrzők: `%gd` és `%gD` (választó), `%gs` (üzenet), `%H` és `%h` (teljes és rövid új hash). A korlátok elfogadják a következőket: `-n N`, `-nN` és `--max-count N`; a `-n 0` minden bejegyzést kiír.

A `pitmaster init` által létrehozott tárolók nem rögzítenek reflogot, kivéve, ha a `.git/config` fájlban a `core.logallrefupdates` értéke `true` ([#8](https://github.com/inline0/pitmaster/issues/8)); ezért a `reflog` addig nem ír ki semmit, amíg ez nincs beállítva.

### `refs`

Az összes ref felsorolása a hozzájuk tartozó hash értékkel.

```bash
pitmaster refs
```

Kimenet:

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

A hash értékek teljes hosszukban jelennek meg.

### `reset`

A HEAD visszaállítása egy adott commitra.

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

Meg kell adni egy revíziót. Kimenet:

```
HEAD is now at abc1234
```

### `init`

Új tároló inicializálása. Ez az egyetlen parancs, amelyhez nem szükséges meglévő tároló.

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

Kimenet:

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

A `--object-format` a következőket fogadja el: `sha1` (alapértelmezett) és `sha256`.

## Kilépési kódok

| Kód | Jelentés |
|------|---------|
| 0 | Siker |
| 1 | Parancshiba: használati hiba, ismeretlen parancs, sikertelen művelet (`error: <message>`) vagy konfliktusok miatt leállt egyesítés |
| 128 | Nem git-tároló (`fatal: <message>`), fel nem ismert `log` argumentum, vagy művelet nélkül megadott `--continue` / `--abort` / `--skip` |
