
# CLI Reference

Pitmaster indeholder en CLI, der afspejler et udvalg af git-kommandoer. Den arbejder på repositoryet i den aktuelle arbejdsmappe.

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

Ved en Composer-installation er scriptet `./vendor/bin/pitmaster`; siden 0.2.11 finder det projektets autoloader dér. Kør `./bin/pitmaster` efter `composer install` i en checkout af selve repositoryet Pitmaster. Eksemplerne nedenfor bruger `pitmaster` til begge stier. Hvis du kører det uden argumenter, vises kommandolisten.

Revisioner findes på samme måde som `Repository::resolve()`: `HEAD`, grene- og tagnavne, fulde ref-navne, fulde hasher samt udtrykkene `~N` / `^N`. Forkortede hasher accepteres ikke. Clone, fetch og push er kun tilgængelige via PHP API.

## Kommandoer

### `log`

Vis commithistorikken med de nyeste commits 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
```

git's stavemåder for grænser (`-n N`, `-nN`, `--max-count N`, `--max-count=N`, `-N`) blev tilføjet i 0.2.11. Et rent tal er Pitmasters egen kortform for grænsen. Det første øvrige argument er et stimfilter; alt efter `--` behandles som stien. Ethvert andet argument, der begynder med `-`, viser `fatal: unrecognized argument: <arg>` og afslutter med 128.

Outputtet indeholder `commit <hash>` (gul), en `Merge:`-linje for merge-commits, `Author:` med den rå identitet (navn, e-mail, tidsstempel og tidszone) samt commitmeddelelsen med indrykning. `--oneline` viser `abc1234 Subject`. Stimfilteret matcher én nøjagtig filsti og undersøger kun de nyeste fem gange grænseværdien commits ([#7](https://github.com/inline0/pitmaster/issues/7)).

### `show`

Vis commitdetaljer og diff i forhold til den første overordnede commit.

```bash
# Show HEAD
pitmaster show

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

Viser commitmetadata (med en `Date:`-linje) efterfulgt af en samlet diff. For et annoteret tag vises tagheaderen og meddelelsen først. Farver bruges kun, når stdout er en terminal. Merge-commits vises uden diff.

### `cat-file`

Udskriv det rå indhold af et git-objekt.

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

Kræver en fuld hash. Udskriver objektets lagrede indhold: blobs, commits og tags som tekst, træer i binært format. I modsætning til `git cat-file -p` vises træer ikke i læsevenligt format.

### `status`

Vis arbejdstræets status.

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

Output:

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

Filer i staging vises med grønt, mens filer, der ikke er i staging, ikke-flettede og ikke-sporede filer vises med rødt. En `Unmerged paths:`-sektion vises under en konfliktbehæftet merge. En frigjort HEAD viser `HEAD detached`, og et rent træ viser `nothing to commit, working tree clean`. `--porcelain=v2` viser outputtet fra `Repository::statusPorcelainV2()`.

### `diff`

Vis ændringer mellem indekset og arbejdstræet (ændringer, der ikke er sat i staging).

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

Outputtet er en farvelagt samlet diff, også når stdout ikke er en terminal. Det svarer til `git diff` for ændrede tekstfiler; nye, slettede, binære, omdøbte filer og filer med ændret tilstand formateres anderledes (se [Diff](https://pitmaster.inline0.dev/da/docs/operations/diff)). `diff --cached` viser intet før det første commit ([#5](https://github.com/inline0/pitmaster/issues/5)).

### `add`

Sæt filer i staging til næste commit.

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

Hver fil læses fra arbejdstræet, skrives som et blobobjekt, og indekset opdateres. Argumenterne er filstier; mapper og `.` udvides ikke.

### `commit`

Opret et commit ud fra filerne i staging.

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

Output:

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

`-m` er påkrævet, undtagen når en stoppet merge, cherry-pick, revert eller rebase afsluttes; her bruges den forberedte meddelelse. Forfatter og committer findes ud fra miljøvariabler, konstanter og `.git/config` som beskrevet i [Kom godt i gang](https://pitmaster.inline0.dev/da/docs/getting-started).

### `branch`

Vis grene, eller opret en ny.

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

Output ved visning af grene:

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

Oprettelse viser `Created branch <name>`, sletning viser `Deleted branch <name>`. `-d` og `-D` gør det samme: Ingen af dem kontrollerer, om grenen er flettet ind, og begge afviser at slette den gren, der er tjekket ud.

### `tag`

Vis tags, eller opret et nyt.

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

Oprettelse viser `Created tag <name>`.

### `checkout`

Skift gren, eller frigør 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
```

Opdaterer HEAD, indekset og arbejdstræet, så de svarer til målet, og viser `Switched to '<target>'`. Afviser handlingen, hvis lokale ændringer eller ikke-sporede filer ligger på stier, der er forskellige mellem de to træer. Ikke-committede ændringer i andre sporede filer overskrives med måltræets indhold, hvor git ville bevare dem ([#2](https://github.com/inline0/pitmaster/issues/2)); commit eller stash dem først.

### `merge`

Flet en eller flere grene ind i den aktuelle HEAD, eller fortsæt/afbryd en igangværende konflikt i en merge.

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

Output ved succes:

```
Merge successful.
```

Output ved konflikt (på stderr, afslutningskode 1):

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

`-s` accepterer `ours`, `ort` og `recursive`; `ort` og `recursive` bruger begge standardmergen. Med `-s` viser CLI `Merge successful.` og afslutter med 0, selv når mergingen er stoppet på grund af konflikter ([#21](https://github.com/inline0/pitmaster/issues/21)), så kontrollér `status` bagefter. `merge --continue` uden en igangværende merge afslutter med 128. Fletning af en gren, der allerede er flettet ind, opretter endnu et merge-commit ([#6](https://github.com/inline0/pitmaster/issues/6)), og ikke-committede ændringer i sporede filer overskrives som ved `checkout`.

### `cherry-pick`

Anvend et commit oven på den aktuelle HEAD, eller fortsæt/afbryd en igangværende 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
```

Viser intet ved succes. `--continue` og `--abort` afslutter med 128, hvis der ikke er en igangværende cherry-pick.

### `revert`

Opret et revert-commit, eller fortsæt/afbryd en igangværende 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
```

Viser intet ved succes. `--continue` og `--abort` afslutter med 128, hvis der ikke er en igangværende revert.

### `rebase`

Rebase den aktuelle gren oven på en anden 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
```

Viser intet ved succes. `--continue`, `--skip` og `--abort` viser `fatal: no rebase in progress` og afslutter med 128, hvis der ikke er en igangværende rebase.

### `bisect`

Find det commit, der indførte en ændring, ved hjælp af binærsøgning.

```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` og `bad` viser den fulde hash for den næste kandidat, som tjekkes ud. Når der kun er én mistænkt tilbage, vises den samme hash igen: Dette commit er det første dårlige commit. I modsætning til git vises der ikke en oversigt med "is the first bad commit".

### `stash`

Gem og gendan ændringer i arbejdsbiblioteket.

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

Meddelelsen er argumentet efter `push` eller `save`; `-m` understøttes ikke og ville blive gemt som meddelelsen. `pop`, `apply` og `drop` bruger altid `stash@{0}`. De viser `Saved working directory to stash abc1234`, `Applied and dropped stash`, `Applied stash` og `Dropped stash`.

Output fra stash-listen:

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

Med mere end én post lader `drop` og `pop` i øjeblikket posten blive i listen ([#10](https://github.com/inline0/pitmaster/issues/10)), og `apply` overskriver ikke-committede ændringer i filer, som stash ikke berører ([#11](https://github.com/inline0/pitmaster/issues/11)).

### `blame`

Vis, hvem der har skrevet hver linje i en fil ved HEAD.

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

Output:

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

Hver linje viser de første 8 tegn af commit-hashen og de første 30 tegn af forfatteridentiteten (`Name <email> timestamp timezone`) uden udfyldning.

### `grep`

Søg i filindhold i det aktuelle HEAD-træ.

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

Output:

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

Valgmuligheder skal stå før mønsteret:

- `-i`, `--ignore-case`: match uden forskel på store og små bogstaver
- `-E`, `--extended-regexp`, `--regex`: behandl mønsteret som et regulært PCRE-udtryk

Output er ren `path:line:content` uden farver.

### `reflog`

Vis reflog-poster med den nyeste 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 er `%gd: %gs` (`HEAD@{0}: commit: Add feature`). Understøttede pladsholdere: `%gd` og `%gD` (vælger), `%gs` (meddelelse), `%H` og `%h` (ny hash i fuld og kort form). Grænser accepterer `-n N`, `-nN` og `--max-count N`; `-n 0` udskriver alle poster.

Repositories oprettet af `pitmaster init` registrerer ikke reflogs, medmindre `core.logallrefupdates` er sat til `true` i `.git/config` ([#8](https://github.com/inline0/pitmaster/issues/8)), så `reflog` ikke udskriver noget dér, før det er tilfældet.

### `refs`

Vis alle refs med deres hasher.

```bash
pitmaster refs
```

Output:

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

Hasherne udskrives i fuld længde.

### `reset`

Nulstil HEAD til en bestemt 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 er påkrævet. Output:

```
HEAD is now at abc1234
```

### `init`

Initialiser et nyt repository. Dette er den eneste kommando, der ikke kræver et eksisterende repository.

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

Output:

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

`--object-format` accepterer `sha1` (standard) og `sha256`.

## Afslutningskoder

| Kode | Betydning |
|------|---------|
| 0 | Succes |
| 1 | Kommandofejl: brugsfejl, ukendt kommando, mislykket handling (`error: <message>`) eller en merge, der blev stoppet på grund af konflikter |
| 128 | Ikke et git-repository (`fatal: <message>`), et argument til `log`, der ikke genkendes, eller `--continue` / `--abort` / `--skip` uden en igangværende handling |
