
# Referensi CLI

Pitmaster menyertakan CLI yang mencerminkan sebagian perintah git. Ini beroperasi pada repositori di direktori kerja saat ini.

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

Dari instalasi Composer, skripnya adalah `./vendor/bin/pitmaster`; sejak 0.2.11, skrip ini menemukan autoloader proyek di sana. Di checkout repositori Pitmaster itu sendiri, jalankan `./bin/pitmaster` setelah `composer install`. Contoh di bawah menggunakan `pitmaster` untuk kedua jalur. Menjalankannya tanpa argumen akan mencetak daftar perintah.

Revisi ditentukan seperti `Repository::resolve()`: `HEAD`, nama branch dan tag, nama ref lengkap, hash lengkap, serta ekspresi `~N` / `^N`. Hash singkat tidak diterima. Clone, fetch, dan push hanya tersedia melalui PHP API.

## Perintah

### `log`

Tampilkan riwayat commit, dari yang terbaru.

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

Ejaan batas git (`-n N`, `-nN`, `--max-count N`, `--max-count=N`, `-N`) ditambahkan di 0.2.11. Angka tanpa awalan adalah singkatan Pitmaster sendiri untuk batas. Argumen lain pertama menjadi filter jalur; semua argumen setelah `--` dianggap sebagai jalur. Argumen lain apa pun yang dimulai dengan `-` akan mencetak `fatal: unrecognized argument: <arg>` dan keluar dengan 128.

Output mencakup `commit <hash>` (kuning), baris `Merge:` untuk commit merge, `Author:` dengan identitas mentah (nama, email, cap waktu, dan zona waktu), serta pesan commit yang diindentasi. `--oneline` mencetak `abc1234 Subject`. Filter jalur mencocokkan satu jalur file persis dan hanya memeriksa lima kali jumlah batas commit terbaru ([#7](https://github.com/inline0/pitmaster/issues/7)).

### `show`

Tampilkan detail commit dan diff terhadap parent pertama.

```bash
# Show HEAD
pitmaster show

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

Menampilkan metadata commit (dengan baris `Date:`) diikuti diff terpadu. Untuk tag beranotasi, header dan pesan tag ditampilkan terlebih dahulu. Warna hanya digunakan saat stdout adalah terminal. Commit merge ditampilkan tanpa diff.

### `cat-file`

Cetak konten mentah objek git.

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

Menerima hash lengkap. Mencetak konten tersimpan objek: blob, commit, dan tag sebagai teks, sedangkan tree dalam bentuk binernya. Berbeda dengan `git cat-file -p`, tree tidak dicetak dalam format yang mudah dibaca.

### `status`

Tampilkan status working tree.

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

Keluaran:

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

File yang sudah di-stage ditampilkan dengan warna hijau, sedangkan file yang belum di-stage, belum digabungkan, dan tidak dilacak ditampilkan dengan warna merah. Bagian `Unmerged paths:` muncul saat terjadi konflik merge. HEAD yang terlepas mencetak `HEAD detached`, dan tree yang bersih mencetak `nothing to commit, working tree clean`. `--porcelain=v2` mencetak output dari `Repository::statusPorcelainV2()`.

### `diff`

Tampilkan perubahan antara indeks dan working tree (perubahan yang belum di-stage).

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

Output berupa diff terpadu berwarna, termasuk saat stdout bukan terminal. Format ini cocok dengan `git diff` untuk file teks yang diubah; file baru, dihapus, biner, berganti nama, dan berubah mode diformat secara berbeda (lihat [Diff](https://pitmaster.inline0.dev/id/docs/operations/diff)). `diff --cached` tidak mencetak apa pun sebelum commit pertama ([#5](https://github.com/inline0/pitmaster/issues/5)).

### `add`

Stage file untuk commit berikutnya.

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

Setiap file dibaca dari working tree, ditulis sebagai objek blob, lalu indeks diperbarui. Argumen berupa jalur file; direktori dan `.` tidak diperluas.

### `commit`

Buat commit dari file yang sudah di-stage.

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

Keluaran:

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

`-m` wajib diisi, kecuali saat menyelesaikan merge, cherry-pick, revert, atau rebase yang terhenti; dalam kasus tersebut, pesan yang sudah disiapkan akan digunakan. Author dan committer ditentukan dari variabel lingkungan, konstanta, dan `.git/config`, sesuai penjelasan di [Memulai](https://pitmaster.inline0.dev/id/docs/getting-started).

### `branch`

Daftarkan branch atau buat branch baru.

```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 untuk daftar:

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

Pembuatan mencetak `Created branch <name>`, penghapusan mencetak `Deleted branch <name>`. `-d` dan `-D` berperilaku sama: keduanya tidak memeriksa apakah branch sudah digabungkan, dan menolak menghapus branch yang sedang di-checkout.

### `tag`

Daftarkan tag atau buat tag baru.

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

Pembuatan mencetak `Created tag <name>`.

### `checkout`

Beralih branch atau lepaskan 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
```

Memperbarui HEAD, indeks, dan working tree agar sesuai dengan target, lalu mencetak `Switched to '<target>'`. Operasi ditolak jika ada perubahan lokal atau file yang tidak dilacak pada jalur yang berbeda antara kedua tree. Perubahan yang belum di-commit pada file terlacak lainnya akan ditimpa dengan konten target, padahal git akan mempertahankannya ([#2](https://github.com/inline0/pitmaster/issues/2)); commit atau stash perubahan tersebut terlebih dahulu.

### `merge`

Gabungkan satu atau beberapa branch ke HEAD saat ini, atau lanjutkan/batalkan konflik merge yang sedang berlangsung.

```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 jika berhasil:

```
Merge successful.
```

Output jika terjadi konflik (di stderr, kode keluar 1):

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

`-s` menerima `ours`, `ort`, dan `recursive`; `ort` dan `recursive` sama-sama menggunakan merge default. Dengan `-s`, CLI mencetak `Merge successful.` dan keluar dengan 0 meskipun merge berhenti karena konflik ([#21](https://github.com/inline0/pitmaster/issues/21)), jadi periksa `status` sesudahnya. `merge --continue` tanpa merge yang sedang berlangsung akan keluar dengan 128. Menggabungkan branch yang sudah digabung akan membuat commit merge lain ([#6](https://github.com/inline0/pitmaster/issues/6)), dan perubahan yang belum di-commit pada file terlacak akan ditimpa seperti pada `checkout`.

### `cherry-pick`

Terapkan commit di atas HEAD saat ini, atau lanjutkan/batalkan konflik yang sedang berlangsung.

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

Tidak mencetak apa pun jika berhasil. `--continue` dan `--abort` tanpa cherry-pick yang sedang berlangsung akan keluar dengan 128.

### `revert`

Buat commit revert, atau lanjutkan/batalkan konflik yang sedang berlangsung.

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

Tidak mencetak apa pun jika berhasil. `--continue` dan `--abort` tanpa revert yang sedang berlangsung akan keluar dengan 128.

### `rebase`

Rebase branch saat ini ke ref lain.

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

Tidak mencetak apa pun jika berhasil. `--continue`, `--skip`, dan `--abort` tanpa rebase yang sedang berlangsung akan mencetak `fatal: no rebase in progress` dan keluar dengan 128.

### `bisect`

Temukan commit yang memperkenalkan perubahan dengan pencarian biner.

```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`, dan `bad` mencetak hash lengkap kandidat berikutnya, yang kemudian di-checkout. Jika hanya tersisa satu kandidat yang dicurigai, hash yang sama dicetak lagi: commit itulah commit buruk pertama. Berbeda dari git, ringkasan "adalah commit buruk pertama" tidak dicetak.

### `stash`

Simpan dan pulihkan perubahan direktori kerja.

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

Pesan adalah argumen setelah `push` atau `save`; `-m` tidak didukung dan akan disimpan sebagai pesan. `pop`, `apply`, dan `drop` selalu menggunakan `stash@{0}`. Ketiganya mencetak `Saved working directory to stash abc1234`, `Applied and dropped stash`, `Applied stash`, dan `Dropped stash`.

Output daftar stash:

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

Jika ada lebih dari satu entri, `drop` dan `pop` saat ini membiarkan entri tetap ada dalam daftar ([#10](https://github.com/inline0/pitmaster/issues/10)), dan `apply` menimpa perubahan yang belum di-commit pada file yang tidak disentuh stash ([#11](https://github.com/inline0/pitmaster/issues/11)).

### `blame`

Tampilkan atribusi penulis per baris untuk file di HEAD.

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

Keluaran:

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

Setiap baris menampilkan 8 karakter pertama hash commit dan 30 karakter pertama identitas penulis (`Name <email> timestamp timezone`), tanpa padding.

### `grep`

Cari isi file di pohon HEAD saat ini.

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

Keluaran:

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

Opsi harus ditulis sebelum pola:

- `-i`, `--ignore-case`: pencocokan tanpa membedakan huruf besar dan kecil
- `-E`, `--extended-regexp`, `--regex`: perlakukan pola sebagai ekspresi reguler PCRE

Output berupa `path:line:content` biasa tanpa warna.

### `reflog`

Tampilkan entri reflog, yang terbaru lebih dulu.

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

Format default adalah `%gd: %gs` (`HEAD@{0}: commit: Add feature`). Placeholder yang didukung: `%gd` dan `%gD` (pemilih), `%gs` (pesan), `%H` dan `%h` (hash baru lengkap dan pendek). Batas menerima `-n N`, `-nN`, dan `--max-count N`; `-n 0` mencetak semua entri.

Repositori yang dibuat oleh `pitmaster init` tidak merekam reflog kecuali `core.logallrefupdates` diatur ke `true` dalam `.git/config` ([#8](https://github.com/inline0/pitmaster/issues/8)), sehingga `reflog` tidak mencetak apa pun di sana sampai pengaturan itu diterapkan.

### `refs`

Cantumkan semua ref beserta hash-nya.

```bash
pitmaster refs
```

Keluaran:

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

Hash dicetak secara lengkap.

### `reset`

Atur ulang HEAD ke commit tertentu.

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

Revisi wajib diisi. Output:

```
HEAD is now at abc1234
```

### `init`

Inisialisasi repositori baru. Hanya perintah ini yang tidak memerlukan repositori yang sudah ada.

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

Keluaran:

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

`--object-format` menerima `sha1` (default) dan `sha256`.

## Kode keluar

| Kode | Arti |
|------|---------|
| 0 | Berhasil |
| 1 | Kesalahan perintah: kesalahan penggunaan, perintah tidak dikenal, operasi gagal (`error: <message>`), atau merge yang terhenti karena konflik |
| 128 | Bukan repositori git (`fatal: <message>`), argumen `log` tidak dikenal, atau `--continue` / `--abort` / `--skip` tanpa operasi yang sedang berlangsung |
