
# Referentie voor CLI

Pitmaster bevat een CLI die een subset van git-opdrachten nabootst. Deze werkt op de repository in de huidige werkmap.

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

Bij een installatie via Composer is het script `./vendor/bin/pitmaster`; sinds 0.2.11 vindt het daar de autoloader van het project. Voer in een checkout van de repository Pitmaster zelf `./bin/pitmaster` uit na `composer install`. In de onderstaande voorbeelden wordt `pitmaster` gebruikt voor beide paden. Als u het zonder argumenten uitvoert, wordt de opdrachtenlijst weergegeven.

Revisies worden opgelost zoals `Repository::resolve()`: `HEAD`, branchnamen en tagnamen, volledige ref-namen, volledige hashes en expressies `~N` / `^N`. Afgekorte hashes worden niet geaccepteerd. Clone, fetch en push zijn alleen beschikbaar via de PHP API.

## Opdrachten

### `log`

Toon de commitgeschiedenis, nieuwste eerst.

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

De git-limietnotaties (`-n N`, `-nN`, `--max-count N`, `--max-count=N`, `-N`) zijn toegevoegd in 0.2.11. Een los getal is de eigen verkorte notatie van Pitmaster voor de limiet. Het eerste andere argument is een padfilter; alles na `--` wordt als pad behandeld. Elk ander argument dat begint met `-` geeft `fatal: unrecognized argument: <arg>` weer en sluit af met 128.

De uitvoer bevat `commit <hash>` (geel), een `Merge:`-regel voor merge-commits, `Author:` met de onbewerkte identiteit (naam, e-mailadres, tijdstempel en tijdzone) en het ingesprongen commitbericht. `--oneline` geeft `abc1234 Subject` weer. Het padfilter komt overeen met één exact bestandspad en onderzoekt alleen de nieuwste vijf keer de limiet aan commits ([#7](https://github.com/inline0/pitmaster/issues/7)).

### `show`

Toon commitdetails en het verschil met de eerste ouder.

```bash
# Show HEAD
pitmaster show

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

Toont de commitmetadata (met een `Date:`-regel), gevolgd door een unified diff. Bij een geannoteerde tag verschijnen eerst de tagkop en het bericht. Kleuren worden alleen gebruikt wanneer stdout een terminal is. Merge-commits worden zonder diff getoond.

### `cat-file`

Druk de onbewerkte inhoud van een git-object af.

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

Accepteert een volledige hash. Drukt de opgeslagen inhoud van het object af: blobs, commits en tags als tekst, bomen in hun binaire vorm. In tegenstelling tot `git cat-file -p` worden bomen niet fraai opgemaakt.

### `status`

Toon de status van de werkboom.

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

Uitvoer:

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

Gestagede bestanden worden groen weergegeven; niet-gestagede, niet-samengevoegde en niet-getraceerde bestanden rood. Tijdens een merge met conflicten verschijnt een sectie `Unmerged paths:`. Een losgekoppelde HEAD geeft `HEAD detached` weer en een schone boom `nothing to commit, working tree clean`. `--porcelain=v2` geeft de uitvoer van `Repository::statusPorcelainV2()` weer.

### `diff`

Toon wijzigingen tussen de index en de werkboom (niet-gestagede wijzigingen).

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

De uitvoer is een gekleurde unified diff, ook wanneer stdout geen terminal is. Voor gewijzigde tekstbestanden komt deze overeen met `git diff`; nieuwe, verwijderde, binaire, hernoemde en bestanden met een gewijzigde modus worden anders opgemaakt (zie [Diff](https://pitmaster.inline0.dev/nl/docs/operations/diff)). `diff --cached` geeft niets weer vóór de eerste commit ([#5](https://github.com/inline0/pitmaster/issues/5)).

### `add`

Stage bestanden voor de volgende commit.

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

Elk bestand wordt uit de werkboom gelezen, als blobobject weggeschreven en aan de index toegevoegd. Argumenten zijn bestandspaden; mappen en `.` worden niet uitgebreid.

### `commit`

Maak een commit van de gestagede bestanden.

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

Uitvoer:

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

`-m` is vereist, behalve bij het voltooien van een gestopte merge, cherry-pick, revert of rebase; dan wordt het voorbereide bericht gebruikt. De auteur en committer worden bepaald aan de hand van omgevingsvariabelen, constanten en `.git/config`, zoals beschreven in [Aan de slag](https://pitmaster.inline0.dev/nl/docs/getting-started).

### `branch`

Toon branches of maak een nieuwe branch.

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

Uitvoer bij het weergeven:

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

Bij het aanmaken wordt `Created branch <name>` weergegeven, bij het verwijderen `Deleted branch <name>`. `-d` en `-D` werken hetzelfde: geen van beide controleert of de branch is samengevoegd, en beide weigeren de uitgecheckte branch te verwijderen.

### `tag`

Toon tags of maak een nieuwe tag.

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

Bij het aanmaken wordt `Created tag <name>` weergegeven.

### `checkout`

Wissel van branch of koppel HEAD los.

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

Werkt HEAD, de index en de werkboom bij zodat deze overeenkomen met het doel, en geeft `Switched to '<target>'` weer. Weigert wanneer lokale wijzigingen of niet-getraceerde bestanden voorkomen op paden die tussen de twee bomen verschillen. Niet-vastgelegde wijzigingen in andere getraceerde bestanden worden overschreven door de inhoud van het doel, waar git ze zou behouden ([#2](https://github.com/inline0/pitmaster/issues/2)); leg ze eerst vast of stash ze.

### `merge`

Voeg een of meer branches samen met de huidige HEAD, of ga door met een lopende merge met conflicten of breek deze af.

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

Uitvoer bij succes:

```
Merge successful.
```

Uitvoer bij conflict (op stderr, afsluitcode 1):

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

`-s` accepteert `ours`, `ort` en `recursive`; `ort` en `recursive` gebruiken beide de standaardmerge. Met `-s` geeft de CLI `Merge successful.` weer en wordt afgesloten met 0, zelfs wanneer de merge door conflicten is gestopt ([#21](https://github.com/inline0/pitmaster/issues/21)), dus controleer daarna `status`. `merge --continue` zonder lopende merge wordt afgesloten met 128. Een branch samenvoegen die al is samengevoegd, maakt nog een merge-commit aan ([#6](https://github.com/inline0/pitmaster/issues/6)), en niet-vastgelegde wijzigingen in getraceerde bestanden worden overschreven zoals bij `checkout`.

### `cherry-pick`

Pas een commit toe boven op de huidige HEAD, of ga door met een lopend conflict of breek dit af.

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

Geeft niets weer bij succes. `--continue` en `--abort` zonder lopende cherry-pick worden afgesloten met 128.

### `revert`

Maak een revert-commit of ga door met een lopend conflict of breek dit af.

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

Geeft niets weer bij succes. `--continue` en `--abort` zonder lopende revert worden afgesloten met 128.

### `rebase`

Rebase de huidige branch op een andere ref.

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

Geeft niets weer bij succes. `--continue`, `--skip` en `--abort` geven zonder lopende rebase `fatal: no rebase in progress` weer en worden afgesloten met 128.

### `bisect`

Zoek met een binaire zoekactie naar de commit die een wijziging heeft geïntroduceerd.

```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` en `bad` geven de volledige hash van de volgende kandidaat weer, die wordt uitgecheckt. Als er nog maar één verdachte over is, wordt dezelfde hash opnieuw weergegeven: die commit is de eerste slechte commit. In tegenstelling tot git wordt er geen samenvatting met "is de eerste slechte commit" weergegeven.

### `stash`

Bewaar en herstel wijzigingen in de werkmap.

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

Het bericht is het argument na `push` of `save`; `-m` wordt niet ondersteund en zou als bericht worden opgeslagen. `pop`, `apply` en `drop` gebruiken altijd `stash@{0}`. Ze geven `Saved working directory to stash abc1234`, `Applied and dropped stash`, `Applied stash` en `Dropped stash` weer.

Uitvoer van de stash-lijst:

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

Bij meer dan één item laten `drop` en `pop` het item momenteel in de lijst staan ([#10](https://github.com/inline0/pitmaster/issues/10)), en `apply` overschrijft niet-vastgelegde wijzigingen in bestanden die de stash niet raakt ([#11](https://github.com/inline0/pitmaster/issues/11)).

### `blame`

Toon per regel wie een bestand op HEAD heeft geschreven.

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

Uitvoer:

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

Elke regel toont de eerste 8 tekens van de commit-hash en de eerste 30 tekens van de auteursidentiteit (`Name <email> timestamp timezone`), zonder opvulling.

### `grep`

Zoek naar bestandsinhoud in de huidige HEAD-boom.

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

Uitvoer:

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

Opties moeten vóór het patroon staan:

- `-i`, `--ignore-case`: hoofdletterongevoelig zoeken
- `-E`, `--extended-regexp`, `--regex`: behandel het patroon als een reguliere PCRE-expressie

De uitvoer is platte `path:line:content` zonder kleuren.

### `reflog`

Toon reflog-vermeldingen, nieuwste eerst.

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

De standaardindeling is `%gd: %gs` (`HEAD@{0}: commit: Add feature`). Ondersteunde plaatsaanduidingen: `%gd` en `%gD` (selector), `%gs` (bericht), `%H` en `%h` (volledige en korte nieuwe hash). Limieten accepteren `-n N`, `-nN` en `--max-count N`; `-n 0` toont alle vermeldingen.

Repositories die zijn aangemaakt door `pitmaster init` registreren geen reflogs, tenzij `core.logallrefupdates` is ingesteld op `true` in `.git/config` ([#8](https://github.com/inline0/pitmaster/issues/8)). Daarom toont `reflog` daar niets totdat dat wel het geval is.

### `refs`

Toon alle refs met hun hashes.

```bash
pitmaster refs
```

Uitvoer:

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

Hashes worden volledig weergegeven.

### `reset`

Zet HEAD terug naar een specifieke 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
```

Een revisie is vereist. Uitvoer:

```
HEAD is now at abc1234
```

### `init`

Initialiseer een nieuwe repository. Dit is de enige opdracht waarvoor geen bestaande repository nodig is.

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

Uitvoer:

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

`--object-format` accepteert `sha1` (standaard) en `sha256`.

## Afsluitcodes

| Code | Betekenis |
|------|---------|
| 0 | Succes |
| 1 | Opdrachtfout: onjuist gebruik, onbekende opdracht, mislukte bewerking (`error: <message>`) of samenvoeging die vanwege conflicten is gestopt |
| 128 | Geen git-repository (`fatal: <message>`), een niet-herkend argument voor `log` of `--continue` / `--abort` / `--skip` terwijl er geen bewerking wordt uitgevoerd |
