
# CLI-viite

Pitmaster sisältää CLI, joka jäljittelee osaa git-komennoista. Se toimii nykyisen työhakemiston tietovarastossa.

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

Composer-asennuksessa komentosarja sijaitsee kohteessa `./vendor/bin/pitmaster`; versiosta 0.2.11 alkaen se löytää projektin autoloaderin sieltä. Kun olet Pitmaster-tietovaraston työkopiossa, suorita `./bin/pitmaster` komennon `composer install` jälkeen. Alla olevissa esimerkeissä käytetään arvoa `pitmaster` kummallekin polulle. Ilman argumentteja suorittaminen tulostaa komentoluettelon.

Versiot ratkaistaan kuten komennossa `Repository::resolve()`: `HEAD`, haarojen ja tunnisteiden nimet, täydet viitenimet, täydet tiivisteet sekä lausekkeet `~N` / `^N`. Lyhennettyjä tiivisteitä ei hyväksytä. Kloonaus, nouto ja lähetys ovat käytettävissä vain PHP API -rajapinnan kautta.

## Komennot

### `log`

Näyttää sitoumushistorian uusimmasta alkaen.

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

gitin rajoitusmuodot (`-n N`, `-nN`, `--max-count N`, `--max-count=N`, `-N`) lisättiin versiossa 0.2.11. Pelkkä numero on Pitmaster-komennon oma lyhennys rajoitukselle. Ensimmäinen muu argumentti suodattaa polun perusteella; kaikki kohdan `--` jälkeinen käsitellään polkuna. Mikä tahansa muu argumentti, joka alkaa merkkijonolla `-`, tulostaa `fatal: unrecognized argument: <arg>` ja päättää suorituksen koodilla 128.

Tuloste sisältää arvon `commit <hash>` (keltainen), yhdistämissitoumuksille `Merge:`-rivin, arvon `Author:` sekä raakamuotoisen tunnisteen (nimi, sähköposti, aikaleima ja aikavyöhyke) ja sisennetyn sitoumusviestin. `--oneline` tulostaa arvon `abc1234 Subject`. Polkurajaus vastaa täsmälleen yhtä tiedostopolkua ja tutkii vain rajoituksen viisinkertaisen määrän uusimpia sitoumuksia ([#7](https://github.com/inline0/pitmaster/issues/7)).

### `show`

Näyttää sitoumuksen tiedot ja erot ensimmäiseen vanhempaan.

```bash
# Show HEAD
pitmaster show

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

Näyttää sitoumuksen metatiedot (mukana `Date:`-rivi) ja sen jälkeen yhtenäisen diff-näkymän. Selittävän tunnisteen kohdalla ensin näytetään tunnisteen otsake ja viesti. Värejä käytetään vain, kun vakiotuloste on pääte. Yhdistämissitoumukset näytetään ilman diffiä.

### `cat-file`

Tulostaa git-objektin raakasisällön.

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

Ottaa vastaan täyden tiivisteen. Tulostaa objektin tallennetun sisällön: blobit, commitit ja tagit tekstinä, puut binäärimuodossa. Toisin kuin `git cat-file -p`, puita ei tulosteta siististi muotoiltuina.

### `status`

Näytä työpuun tila.

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

Tuloste:

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

Indeksiin lisätyt tiedostot näytetään vihreinä, indeksiin lisäämättömät, yhdistämättömät ja seuraamattomat punaisina. Ristiriitaisen yhdistämisen aikana näytetään `Unmerged paths:`-osio. Irrotettu HEAD tulostaa `HEAD detached`, ja puhdas puu tulostaa `nothing to commit, working tree clean`. `--porcelain=v2` tulostaa komennon `Repository::statusPorcelainV2()` tulosteen.

### `diff`

Näytä indeksin ja työpuun väliset muutokset (indeksiin lisäämättömät muutokset).

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

Tuloste on väritetty yhdistetty diff myös silloin, kun stdout ei ole pääte. Muokattujen tekstitiedostojen tuloste vastaa komentoa `git diff`; uudet, poistetut, binaariset, uudelleennimetyt ja käyttöoikeuksiltaan muuttuneet tiedostot muotoillaan eri tavoin (katso [Diff](https://pitmaster.inline0.dev/fi/docs/operations/diff)). `diff --cached` ei tulosta mitään ennen ensimmäistä committia ([#5](https://github.com/inline0/pitmaster/issues/5)).

### `add`

Lisää tiedostot indeksiin seuraavaa committia varten.

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

Jokainen tiedosto luetaan työpuusta, kirjoitetaan blob-objektiksi ja indeksi päivitetään. Argumentit ovat tiedostopolkuja; hakemistoja ja `.`-polkuja ei laajenneta.

### `commit`

Luo commit indeksiin lisätyistä tiedostoista.

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

Tuloste:

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

`-m` on pakollinen, paitsi keskeytyneen yhdistämisen, cherry-pick-toiminnon, palautuksen tai rebasen jatkamisessa, jolloin käytetään valmiiksi laadittua viestiä. Tekijä ja committaaja selvitetään ympäristömuuttujista, vakioista ja `.git/config`-arvosta, kuten [Aloitus](https://pitmaster.inline0.dev/fi/docs/getting-started)-osiossa kuvataan.

### `branch`

Luettele haarat tai luo uusi haara.

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

Luettelotuloste:

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

Luonti tulostaa `Created branch <name>`, poistaminen tulostaa `Deleted branch <name>`. `-d` ja `-D` toimivat samalla tavalla: kumpikaan ei tarkista, onko haara yhdistetty, ja molemmat kieltäytyvät poistamasta käytössä olevaa haaraa.

### `tag`

Luettele tagit tai luo uusi tagi.

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

Luonti tulostaa `Created tag <name>`.

### `checkout`

Vaihda haaraa tai irrota 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
```

Päivittää HEADin, indeksin ja työpuun vastaamaan kohdetta sekä tulostaa `Switched to '<target>'`. Komento kieltäytyy toimimasta, jos paikallisia muutoksia tai seuraamattomia tiedostoja on poluissa, jotka eroavat puiden välillä. Muissa seuratuissa tiedostoissa tekemäsi commitoimattomat muutokset korvataan kohteen sisällöllä siellä, missä git säilyttäisi ne ([#2](https://github.com/inline0/pitmaster/issues/2)); commitoi tai siirrä ne ensin sivuun.

### `merge`

Yhdistä yksi tai useampi haara nykyiseen HEADiin tai jatka/keskeytä käynnissä oleva ristiriitojen selvitys.

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

Tuloste onnistuttaessa:

```
Merge successful.
```

Tuloste ristiriitatilanteessa (stderr, poistumiskoodi 1):

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

`-s` hyväksyy arvot `ours`, `ort` ja `recursive`; `ort` ja `recursive` käyttävät molemmat oletusyhdistämistä. Kun käytössä on `-s`, CLI tulostaa `Merge successful.` ja päättyy koodiin 0, vaikka yhdistäminen olisi pysähtynyt ristiriitoihin ([#21](https://github.com/inline0/pitmaster/issues/21)), joten tarkista `status` sen jälkeen. Jos yhdistämistä ei ole käynnissä, `merge --continue` päättyy koodiin 128. Jo yhdistetyn haaran yhdistäminen luo uuden yhdistämiscommitin ([#6](https://github.com/inline0/pitmaster/issues/6)), ja seurattujen tiedostojen commitoimattomat muutokset korvataan kuten komennolla `checkout`.

### `cherry-pick`

Sovella commit nykyisen HEADin päälle tai jatka/keskeytä käynnissä oleva ristiriitojen selvitys.

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

Onnistuminen ei tuota tulostetta. `--continue` ja `--abort` päättyvät koodiin 128, jos cherry-pick ei ole käynnissä.

### `revert`

Luo kumoava commit tai jatka/keskeytä käynnissä oleva ristiriitojen selvitys.

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

Onnistuminen ei tuota tulostetta. `--continue` ja `--abort` päättyvät koodiin 128, jos palautus ei ole käynnissä.

### `rebase`

Siirrä nykyinen haara toisen viitteen päälle rebasella.

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

Onnistuminen ei tuota tulostetta. `--continue`, `--skip` ja `--abort` tulostavat `fatal: no rebase in progress` ja päättyvät koodiin 128, jos rebase ei ole käynnissä.

### `bisect`

Etsi muutoksen tuonut commit binaarihaulla.

```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` ja `bad` tulostavat seuraavan ehdokkaan täyden tiivisteen, ja ehdokas otetaan käyttöön. Kun jäljellä on vain yksi epäilty, sama tiiviste tulostetaan uudelleen: kyseessä on ensimmäinen virheellinen commit. Toisin kuin git, komento ei tulosta yhteenvetoa "on ensimmäinen virheellinen commit".

### `stash`

Tallenna ja palauta työpuun muutokset.

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

Viesti annetaan argumenttina `push`- tai `save`-komennon jälkeen; `-m` ei ole tuettu, ja se tallentuisi viestiksi. `pop`, `apply` ja `drop` käyttävät aina arvoa `stash@{0}`. Ne tulostavat arvot `Saved working directory to stash abc1234`, `Applied and dropped stash`, `Applied stash` ja `Dropped stash`.

Stash-luettelon tuloste:

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

Kun merkintöjä on useampi kuin yksi, `drop` ja `pop` jättävät merkinnän toistaiseksi luetteloon ([#10](https://github.com/inline0/pitmaster/issues/10)), ja `apply` korvaa commitoimattomat muutokset tiedostoissa, joihin stash ei vaikuta ([#11](https://github.com/inline0/pitmaster/issues/11)).

### `blame`

Näytä tiedoston rivikohtaiset tekijätiedot HEADissa.

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

Tuloste:

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

Jokaisella rivillä näytetään commit-tiivisteen 8 ensimmäistä merkkiä ja tekijän tunnisteen 30 ensimmäistä merkkiä (`Name <email> timestamp timezone`) ilman täytemerkkejä.

### `grep`

Etsi tiedostojen sisällöstä nykyisessä HEAD-puussa.

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

Tuloste:

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

Asetusten on oltava ennen hakumallia:

- `-i`, `--ignore-case`: kirjainkoosta riippumaton haku
- `-E`, `--extended-regexp`, `--regex`: käsittele hakumallia PCRE-säännöllisenä lausekkeena

Tuloste on raakaa `path:line:content`-muotoa ilman värejä.

### `reflog`

Näytä reflog-merkinnät uusimmat ensin.

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

Oletusmuoto on `%gd: %gs` (`HEAD@{0}: commit: Add feature`). Tuetut paikkamerkit: `%gd` ja `%gD` (valitsin), `%gs` (viesti), `%H` ja `%h` (uusi tiiviste kokonaan ja lyhyessä muodossa). Rajoitteina hyväksytään `-n N`, `-nN` ja `--max-count N`; `-n 0` tulostaa kaikki merkinnät.

`pitmaster init`-komennolla luodut tietovarastot eivät tallenna reflogeja, ellei asetuksen `core.logallrefupdates` arvoksi määritetä `true` tiedostossa `.git/config` ([#8](https://github.com/inline0/pitmaster/issues/8)). Siksi `reflog` ei tulosta siellä mitään, ennen kuin asetus on tehty.

### `refs`

Luettele kaikki viitteet ja niiden tiivisteet.

```bash
pitmaster refs
```

Tuloste:

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

Tiivisteet tulostetaan kokonaisina.

### `reset`

Palauta HEAD tiettyyn committiin.

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

Versio on pakollinen. Tuloste:

```
HEAD is now at abc1234
```

### `init`

Alusta uusi tietovarasto. Tämä on ainoa komento, joka ei vaadi olemassa olevaa tietovarastoa.

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

Tuloste:

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

`--object-format` hyväksyy arvot `sha1` (oletus) ja `sha256`.

## Palautuskoodit

| Koodi | Merkitys |
|------|---------|
| 0 | Onnistui |
| 1 | Komentovirhe: käyttövirhe, tuntematon komento, epäonnistunut toiminto (`error: <message>`) tai ristiriitoihin pysähtynyt yhdistäminen |
| 128 | Ei ole git-tietovarasto (`fatal: <message>`), tunnistamaton `log`-argumentti tai `--continue` / `--abort` / `--skip` ilman käynnissä olevaa toimintoa |
