
# Referens för CLI

Pitmaster innehåller en CLI som speglar en delmängd av kommandona i git. Den arbetar med arkivet i den aktuella arbetskatalogen.

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

I en installation från Composer finns skriptet på `./vendor/bin/pitmaster`; sedan 0.2.11 hittar det projektets autoloader där. I en utcheckning av själva arkivet Pitmaster kör du `./bin/pitmaster` efter `composer install`. Exemplen nedan använder `pitmaster` för båda sökvägarna. Om du kör det utan argument visas kommandolistan.

Revisioner löses upp på samma sätt som `Repository::resolve()`: `HEAD`, gren- och taggnamn, fullständiga referensnamn, fullständiga hashar samt uttrycken `~N` / `^N`. Förkortade hashar godtas inte. Kloning, hämtning och push är bara tillgängliga via PHP API.

## Kommandon

### `log`

Visa commit-historiken, med nyaste först.

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

Stavningsvarianterna för begränsning med git (`-n N`, `-nN`, `--max-count N`, `--max-count=N`, `-N`) lades till i 0.2.11. Ett ensamt tal är Pitmasters egen kortform för begränsningen. Det första övriga argumentet är ett sökvägsfilter; allt efter `--` behandlas som sökvägen. Alla andra argument som börjar med `-` skriver ut `fatal: unrecognized argument: <arg>` och avslutas med 128.

Utdata innehåller `commit <hash>` (gul), en `Merge:`-rad för merge-commits, `Author:` med den råa identiteten (namn, e-postadress, tidsstämpel och tidszon) samt commit-meddelandet med indrag. `--oneline` skriver ut `abc1234 Subject`. Sökvägsfiltret matchar en exakt filsökväg och granskar de fem senaste gångerna begränsningen gånger antalet commits ([#7](https://github.com/inline0/pitmaster/issues/7)).

### `show`

Visa commit-detaljer och skillnader mot den första föräldern.

```bash
# Show HEAD
pitmaster show

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

Visar commit-metadata (med en `Date:`-rad) följt av en enhetlig diff. För en kommenterad tagg visas taggens rubrik och meddelande först. Färger används bara när stdout är en terminal. Merge-commits visas utan diff.

### `cat-file`

Skriv ut det råa innehållet i ett git-objekt.

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

Tar en fullständig hash. Skriver ut objektets lagrade innehåll: blobbar, commits och taggar som text, träd i binärt format. Till skillnad från `git cat-file -p` skrivs träd inte ut i läsbart formaterad form.

### `status`

Visa arbetskatalogens status.

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

Utdata:

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

Fasade filer visas i grönt; ofasade, olösta och ospårade filer visas i rött. Ett avsnitt för `Unmerged paths:` visas vid en merge-konflikt. En frikopplad HEAD skriver ut `HEAD detached` och ett rent träd skriver ut `nothing to commit, working tree clean`. `--porcelain=v2` skriver utdata från `Repository::statusPorcelainV2()`.

### `diff`

Visa ändringar mellan indexet och arbetskatalogen (ofasade ändringar).

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

Utdata är en färglagd enhetlig diff, även när stdout inte är en terminal. För ändrade textfiler motsvarar den `git diff`; nya, borttagna, binära, omdöpta filer och filer med ändrat läge formateras annorlunda (se [Diff](https://pitmaster.inline0.dev/sv/docs/operations/diff)). `diff --cached` skriver inget före den första commiten ([#5](https://github.com/inline0/pitmaster/issues/5)).

### `add`

Fasa filer inför nästa commit.

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

Varje fil läses från arbetskatalogen, skrivs som ett blob-objekt och läggs till i indexet. Argumenten är filsökvägar; kataloger och `.` expanderas inte.

### `commit`

Skapa en commit av de fasade filerna.

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

Utdata:

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

`-m` krävs, utom när du slutför en avbruten merge, cherry-pick, återställning eller ombasering; då används det förberedda meddelandet. Författare och committare hämtas från miljövariabler, konstanter och `.git/config` enligt beskrivningen i [Kom igång](https://pitmaster.inline0.dev/sv/docs/getting-started).

### `branch`

Visa grenar eller skapa en ny gren.

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

Utdata vid listning:

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

När du skapar en gren skrivs `Created branch <name>` ut, och när du tar bort en gren skrivs `Deleted branch <name>` ut. `-d` och `-D` fungerar likadant: ingetdera kontrollerar om grenen har sammanfogats, och båda vägrar ta bort den utcheckade grenen.

### `tag`

Visa taggar eller skapa en ny tagg.

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

När du skapar en tagg skrivs `Created tag <name>` ut.

### `checkout`

Byt gren eller frikoppla 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
```

Uppdaterar HEAD, indexet och arbetskatalogen så att de motsvarar målet, och skriver ut `Switched to '<target>'`. Åtgärden vägras om lokala ändringar eller ospårade filer finns i sökvägar som skiljer sig mellan de två träden. Ocommittade ändringar i andra spårade filer skrivs över med målets innehåll. git skulle bevara dem ([#2](https://github.com/inline0/pitmaster/issues/2)); committa eller lägg dem i stash först.

### `merge`

Sammanfoga en eller flera grenar med aktuell HEAD, eller fortsätt/avbryt en pågående merge-konflikt.

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

Utdata vid lyckat resultat:

```
Merge successful.
```

Utdata vid konflikt (på stderr, avslutningskod 1):

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

`-s` godtar `ours`, `ort` och `recursive`; `ort` och `recursive` använder båda standardmerge. Med `-s` skriver CLI ut `Merge successful.` och avslutas med 0 även när merge stannat på grund av konflikter ([#21](https://github.com/inline0/pitmaster/issues/21)), så kontrollera `status` efteråt. `merge --continue` utan en pågående merge avslutas med 128. Om du sammanfogar en gren som redan har sammanfogats skapas ytterligare en merge-commit ([#6](https://github.com/inline0/pitmaster/issues/6)), och ocommittade ändringar i spårade filer skrivs över på samma sätt som med `checkout`.

### `cherry-pick`

Lägg en commit ovanpå aktuell HEAD, eller fortsätt/avbryt en pågående konflikt.

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

Skriver inget vid lyckat resultat. `--continue` och `--abort` avslutas med 128 om det inte pågår någon cherry-pick.

### `revert`

Skapa en återställningscommit, eller fortsätt/avbryt en pågående konflikt.

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

Skriver inget vid lyckat resultat. `--continue` och `--abort` avslutas med 128 om det inte pågår någon återställning.

### `rebase`

Basera om den aktuella grenen ovanpå en annan referens.

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

Skriver inget vid lyckat resultat. `--continue`, `--skip` och `--abort` skriver ut `fatal: no rebase in progress` och avslutas med 128 om det inte pågår någon ombasering.

### `bisect`

Hitta committen som introducerade en ändring med binärsökning.

```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` och `bad` skriver ut nästa kandidats fullständiga hash och checkar ut den. När bara en misstänkt återstår skrivs samma hash ut igen: den commiten är den första dåliga commiten. Till skillnad från git skrivs ingen sammanfattning med ”är den första dåliga commiten” ut.

### `stash`

Spara och återställ ändringar i arbetskatalogen.

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

Meddelandet är argumentet efter `push` eller `save`; `-m` stöds inte och skulle lagras som meddelandet. `pop`, `apply` och `drop` använder alltid `stash@{0}`. De skriver ut `Saved working directory to stash abc1234`, `Applied and dropped stash`, `Applied stash` och `Dropped stash`.

Utdata från stashlistan:

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

Om listan innehåller fler än en post lämnar `drop` och `pop` för närvarande posten kvar i listan ([#10](https://github.com/inline0/pitmaster/issues/10)), och `apply` skriver över ocommittade ändringar i filer som stashen inte berör ([#11](https://github.com/inline0/pitmaster/issues/11)).

### `blame`

Visa vem som har skrivit varje rad i en fil vid HEAD.

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

Utdata:

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

Varje rad visar de första 8 tecknen i commit-hashen och de första 30 tecknen i författarens identitet (`Name <email> timestamp timezone`), utan utfyllnad.

### `grep`

Sök i filinnehållet i trädet för aktuell HEAD.

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

Utdata:

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

Alternativen måste stå före mönstret:

- `-i`, `--ignore-case`: matchning utan hänsyn till skiftläge
- `-E`, `--extended-regexp`, `--regex`: tolka mönstret som ett reguljärt PCRE-uttryck

Utdata är vanlig `path:line:content` utan färger.

### `reflog`

Visa reflog-poster, med nyaste först.

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

Standardformatet är `%gd: %gs` (`HEAD@{0}: commit: Add feature`). Platshållare som stöds: `%gd` och `%gD` (väljare), `%gs` (meddelande), `%H` och `%h` (fullständig respektive kort ny hash). Begränsningar godtar `-n N`, `-nN` och `--max-count N`; `-n 0` skriver ut alla poster.

Arkiv som skapas av `pitmaster init` registrerar inte reflog-poster om inte `core.logallrefupdates` är satt till `true` i `.git/config` ([#8](https://github.com/inline0/pitmaster/issues/8)), så `reflog` skriver inget där förrän inställningen är satt.

### `refs`

Visa alla referenser med deras hashar.

```bash
pitmaster refs
```

Utdata:

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

Hashar skrivs ut i sin helhet.

### `reset`

Återställ HEAD till en specifik 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
```

En revision krävs. Utdata:

```
HEAD is now at abc1234
```

### `init`

Initiera ett nytt arkiv. Det här är det enda kommandot som inte kräver ett befintligt arkiv.

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

Utdata:

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

`--object-format` godtar `sha1` (standard) och `sha256`.

## Avslutningskoder

| Kod | Betydelse |
|------|---------|
| 0 | Lyckades |
| 1 | Kommandofel: användningsfel, okänt kommando, misslyckad åtgärd (`error: <message>`) eller en merge som stannade på grund av konflikter |
| 128 | Inte ett git-arkiv (`fatal: <message>`), ett okänt `log`-argument eller `--continue` / `--abort` / `--skip` utan någon pågående åtgärd |
