
# Αναφορά CLI

Το Pitmaster περιλαμβάνει ένα CLI που αντικατοπτρίζει ένα υποσύνολο εντολών git. Λειτουργεί στο αποθετήριο του τρέχοντος καταλόγου εργασίας.

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

Σε εγκατάσταση από Composer, το script είναι `./vendor/bin/pitmaster`· από το 0.2.11 εντοπίζει εκεί τον autoloader του έργου. Σε checkout του ίδιου του αποθετηρίου Pitmaster, εκτελέστε `./bin/pitmaster` μετά το `composer install`. Τα παρακάτω παραδείγματα χρησιμοποιούν το `pitmaster` και για τις δύο διαδρομές. Αν εκτελεστεί χωρίς ορίσματα, εμφανίζει τη λίστα εντολών.

Οι αναθεωρήσεις επιλύονται όπως στο `Repository::resolve()`: `HEAD`, ονόματα κλάδων και ετικετών, πλήρη ονόματα ref, πλήρεις κατακερματισμοί και εκφράσεις `~N` / `^N`. Δεν γίνονται δεκτοί συντομευμένοι κατακερματισμοί. Οι εντολές clone, fetch και push είναι διαθέσιμες μόνο μέσω του PHP API.

## Εντολές

### `log`

Εμφανίζει το ιστορικό των commit, με πρώτο το νεότερο.

```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 (`-n N`, `-nN`, `--max-count N`, `--max-count=N`, `-N`) προστέθηκαν στο 0.2.11. Ένας σκέτος αριθμός είναι η συντομογραφία του Pitmaster για το όριο. Το πρώτο άλλο όρισμα είναι φίλτρο διαδρομής· οτιδήποτε ακολουθεί το `--` αντιμετωπίζεται ως διαδρομή. Κάθε άλλο όρισμα που ξεκινά με `-` εμφανίζει το `fatal: unrecognized argument: <arg>` και τερματίζει με 128.

Η έξοδος περιλαμβάνει το `commit <hash>` (κίτρινο), μια γραμμή `Merge:` για commit συγχώνευσης, το `Author:` με την ακατέργαστη ταυτότητα (όνομα, email, χρονική σήμανση και ζώνη ώρας) και το μήνυμα του commit με εσοχή. Το `--oneline` εμφανίζει το `abc1234 Subject`. Το φίλτρο διαδρομής αντιστοιχίζει μία ακριβή διαδρομή αρχείου και εξετάζει μόνο τα πιο πρόσφατα πέντε commit του ορίου ([#7](https://github.com/inline0/pitmaster/issues/7)).

### `show`

Εμφανίζει τις λεπτομέρειες του commit και τις διαφορές σε σχέση με τον πρώτο γονέα.

```bash
# Show HEAD
pitmaster show

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

Εμφανίζει τα μεταδεδομένα του commit (με γραμμή `Date:`) και στη συνέχεια μια ενοποιημένη διαφορά. Για σχολιασμένη ετικέτα, προηγούνται η κεφαλίδα και το μήνυμα της ετικέτας. Χρησιμοποιούνται χρώματα μόνο όταν το stdout είναι τερματικό. Τα commit συγχώνευσης εμφανίζονται χωρίς διαφορά.

### `cat-file`

Εκτυπώνει το ακατέργαστο περιεχόμενο ενός αντικειμένου git.

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

Δέχεται πλήρη κατακερματισμό. Εκτυπώνει το αποθηκευμένο περιεχόμενο του αντικειμένου: blobs, commit και ετικέτες ως κείμενο, δέντρα σε δυαδική μορφή. Σε αντίθεση με το `git cat-file -p`, τα δέντρα δεν εκτυπώνονται σε ευανάγνωστη μορφή.

### `status`

Εμφανίζει την κατάσταση του δέντρου εργασίας.

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

Έξοδος:

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

Τα αρχεία που έχουν προστεθεί στο staging εμφανίζονται με πράσινο, ενώ όσα δεν έχουν προστεθεί, δεν έχουν συγχωνευτεί ή δεν παρακολουθούνται εμφανίζονται με κόκκινο. Κατά τη διάρκεια συγχώνευσης με διενέξεις εμφανίζεται ενότητα `Unmerged paths:`. Σε αποσυνδεδεμένο HEAD εμφανίζεται `HEAD detached`, ενώ ένα καθαρό δέντρο εμφανίζει `nothing to commit, working tree clean`. Το `--porcelain=v2` εμφανίζει την έξοδο του `Repository::statusPorcelainV2()`.

### `diff`

Εμφανίζει τις αλλαγές μεταξύ του index και του δέντρου εργασίας (αλλαγές που δεν έχουν προστεθεί στο 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
```

Η έξοδος είναι έγχρωμη ενοποιημένη διαφορά, ακόμη κι όταν το stdout δεν είναι τερματικό. Για τροποποιημένα αρχεία κειμένου αντιστοιχεί στο `git diff`· τα νέα, διαγραμμένα, δυαδικά, μετονομασμένα και αρχεία με αλλαγμένη λειτουργία μορφοποιούνται διαφορετικά (βλ. [Diff](https://pitmaster.inline0.dev/el/docs/operations/diff)). Το `diff --cached` δεν εμφανίζει τίποτα πριν από το πρώτο commit ([#5](https://github.com/inline0/pitmaster/issues/5)).

### `add`

Προσθέτει αρχεία στο staging για το επόμενο commit.

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

Κάθε αρχείο διαβάζεται από το δέντρο εργασίας, γράφεται ως αντικείμενο blob και ενημερώνεται το index. Τα ορίσματα είναι διαδρομές αρχείων· οι κατάλογοι και το `.` δεν επεκτείνονται.

### `commit`

Δημιουργεί commit από τα αρχεία που έχουν προστεθεί στο staging.

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

Έξοδος:

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

Απαιτείται το `-m`, εκτός αν ολοκληρώνεται μια διακοπείσα συγχώνευση, επιλογή commit, αναίρεση ή επανατοποθέτηση, οπότε χρησιμοποιείται το προετοιμασμένο μήνυμα. Ο συντάκτης και ο δημιουργός του commit καθορίζονται από μεταβλητές περιβάλλοντος, σταθερές και το `.git/config`, όπως περιγράφεται στην ενότητα [Getting Started](https://pitmaster.inline0.dev/el/docs/getting-started).

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

Έξοδος κατά την εμφάνιση λίστας:

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

Η δημιουργία εμφανίζει `Created branch <name>`, η διαγραφή εμφανίζει `Deleted branch <name>`. Τα `-d` και `-D` λειτουργούν το ίδιο: δεν ελέγχουν αν ο κλάδος έχει συγχωνευτεί και αρνούνται και τα δύο να διαγράψουν τον κλάδο που έχει γίνει checkout.

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

Η δημιουργία εμφανίζει `Created tag <name>`.

### `checkout`

Αλλάζει κλάδο ή αποσυνδέει το 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
```

Ενημερώνει το HEAD, το index και το δέντρο εργασίας ώστε να αντιστοιχούν στον στόχο και εμφανίζει `Switched to '<target>'`. Αρνείται να προχωρήσει όταν υπάρχουν τοπικές αλλαγές ή αρχεία που δεν παρακολουθούνται σε διαδρομές που διαφέρουν μεταξύ των δύο δέντρων. Οι μη δεσμευμένες αλλαγές σε άλλα παρακολουθούμενα αρχεία αντικαθίστανται από το περιεχόμενο του στόχου, όπου το git θα τις διατηρούσε ([#2](https://github.com/inline0/pitmaster/issues/2))· κάντε πρώτα commit ή stash.

### `merge`

Συγχωνεύει έναν ή περισσότερους κλάδους στο τρέχον HEAD ή συνεχίζει/εγκαταλείπει μια συγχώνευση που βρίσκεται σε εξέλιξη.

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

Έξοδος σε περίπτωση επιτυχίας:

```
Merge successful.
```

Έξοδος σε περίπτωση διένεξης (στο stderr, κωδικός εξόδου 1):

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

Το `-s` δέχεται τα `ours`, `ort` και `recursive`· τα `ort` και `recursive` χρησιμοποιούν και τα δύο την προεπιλεγμένη συγχώνευση. Με το `-s`, το CLI εμφανίζει το `Merge successful.` και τερματίζει με 0 ακόμη κι όταν η συγχώνευση διακόπηκε λόγω διενέξεων ([#21](https://github.com/inline0/pitmaster/issues/21)), επομένως ελέγξτε το `status` μετά. Το `merge --continue` χωρίς συγχώνευση σε εξέλιξη τερματίζει με 128. Η συγχώνευση κλάδου που έχει ήδη συγχωνευτεί δημιουργεί άλλο ένα commit συγχώνευσης ([#6](https://github.com/inline0/pitmaster/issues/6)) και οι μη δεσμευμένες αλλαγές σε παρακολουθούμενα αρχεία αντικαθίστανται, όπως και με το `checkout`.

### `cherry-pick`

Εφαρμόζει ένα commit πάνω στο τρέχον HEAD ή συνεχίζει/εγκαταλείπει μια διένεξη που βρίσκεται σε εξέλιξη.

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

Δεν εμφανίζει τίποτα σε περίπτωση επιτυχίας. Τα `--continue` και `--abort` χωρίς επιλογή commit σε εξέλιξη τερματίζουν με 128.

### `revert`

Δημιουργεί commit αναίρεσης ή συνεχίζει/εγκαταλείπει μια διένεξη που βρίσκεται σε εξέλιξη.

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

Δεν εμφανίζει τίποτα σε περίπτωση επιτυχίας. Τα `--continue` και `--abort` χωρίς αναίρεση σε εξέλιξη τερματίζουν με 128.

### `rebase`

Επανατοποθετεί τον τρέχοντα κλάδο πάνω σε άλλη αναφορά.

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

Δεν εμφανίζει τίποτα σε περίπτωση επιτυχίας. Τα `--continue`, `--skip` και `--abort` χωρίς επανατοποθέτηση σε εξέλιξη εμφανίζουν το `fatal: no rebase in progress` και τερματίζουν με 128.

### `bisect`

Εντοπίζει με δυαδική αναζήτηση το commit που εισήγαγε μια αλλαγή.

```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` και `bad` εμφανίζουν τον πλήρη κατακερματισμό του επόμενου υποψηφίου, στον οποίο γίνεται checkout. Όταν απομείνει ένας μόνο ύποπτος, εμφανίζεται ξανά ο ίδιος κατακερματισμός: αυτό το commit είναι το πρώτο κακό commit. Σε αντίθεση με το git, δεν εμφανίζεται σύνοψη «is the first bad commit».

### `stash`

Αποθηκεύει και επαναφέρει αλλαγές στον κατάλογο εργασίας.

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

Το μήνυμα είναι το όρισμα μετά το `push` ή το `save`· το `-m` δεν υποστηρίζεται και θα αποθηκευόταν ως μήνυμα. Τα `pop`, `apply` και `drop` χρησιμοποιούν πάντα το `stash@{0}`. Εμφανίζουν τα `Saved working directory to stash abc1234`, `Applied and dropped stash`, `Applied stash` και `Dropped stash`.

Έξοδος λίστας stash:

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

Όταν υπάρχουν περισσότερες από μία εγγραφές, τα `drop` και `pop` προς το παρόν αφήνουν την εγγραφή στη λίστα ([#10](https://github.com/inline0/pitmaster/issues/10)), ενώ το `apply` αντικαθιστά μη δεσμευμένες αλλαγές σε αρχεία που δεν επηρεάζονται από το stash ([#11](https://github.com/inline0/pitmaster/issues/11)).

### `blame`

Εμφανίζει τη συνεισφορά ανά γραμμή ενός αρχείου στο HEAD.

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

Έξοδος:

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

Κάθε γραμμή εμφανίζει τους πρώτους 8 χαρακτήρες του κατακερματισμού commit και τους πρώτους 30 χαρακτήρες της ταυτότητας του συντάκτη (`Name <email> timestamp timezone`), χωρίς συμπλήρωση.

### `grep`

Αναζητά περιεχόμενο αρχείων στο τρέχον δέντρο HEAD.

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

Έξοδος:

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

Οι επιλογές πρέπει να προηγούνται του μοτίβου:

- `-i`, `--ignore-case`: αντιστοίχιση χωρίς διάκριση πεζών-κεφαλαίων
- `-E`, `--extended-regexp`, `--regex`: αντιμετωπίζει το μοτίβο ως κανονική έκφραση PCRE

Η έξοδος είναι απλό `path:line:content` χωρίς χρώματα.

### `reflog`

Εμφανίζει τις εγγραφές reflog, με πρώτη τη νεότερη.

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

Η προεπιλεγμένη μορφή είναι `%gd: %gs` (`HEAD@{0}: commit: Add feature`). Υποστηριζόμενα placeholders: `%gd` και `%gD` (επιλογέας), `%gs` (μήνυμα), `%H` και `%h` (πλήρης και σύντομος νέος κατακερματισμός). Τα όρια δέχονται `-n N`, `-nN` και `--max-count N`· το `-n 0` εμφανίζει όλες τις εγγραφές.

Τα αποθετήρια που δημιουργούνται από το `pitmaster init` δεν καταγράφουν reflog, εκτός αν το `core.logallrefupdates` οριστεί σε `true` στο `.git/config` ([#8](https://github.com/inline0/pitmaster/issues/8)), επομένως το `reflog` δεν εμφανίζει τίποτα εκεί μέχρι να γίνει αυτό.

### `refs`

Εμφανίζει όλες τις αναφορές μαζί με τους κατακερματισμούς τους.

```bash
pitmaster refs
```

Έξοδος:

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

Οι κατακερματισμοί εμφανίζονται ολόκληροι.

### `reset`

Επαναφέρει το HEAD σε συγκεκριμένο 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
```

Απαιτείται αναθεώρηση. Έξοδος:

```
HEAD is now at abc1234
```

### `init`

Αρχικοποιεί ένα νέο αποθετήριο. Είναι η μόνη εντολή που δεν απαιτεί υπάρχον αποθετήριο.

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

Έξοδος:

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

Το `--object-format` δέχεται το `sha1` (προεπιλογή) και το `sha256`.

## Κωδικοί εξόδου

| Κωδικός | Σημασία |
|------|---------|
| 0 | Επιτυχία |
| 1 | Σφάλμα εντολής: σφάλμα χρήσης, άγνωστη εντολή, αποτυχημένη λειτουργία (`error: <message>`) ή συγχώνευση που διακόπηκε λόγω διενέξεων |
| 128 | Δεν είναι αποθετήριο git (`fatal: <message>`), μη αναγνωρισμένο όρισμα `log` ή `--continue` / `--abort` / `--skip` χωρίς λειτουργία σε εξέλιξη |
