
# CLI Başvurusu

Pitmaster, git komutlarının bir alt kümesini yansıtan bir CLI içerir. Geçerli çalışma dizinindeki depo üzerinde çalışır.

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

Bir Composer kurulumunda betik `./vendor/bin/pitmaster` konumundadır; 0.2.11 nedeniyle projenin otomatik yükleyicisini orada bulur. Doğrudan Pitmaster deposunun ödeme kopyasındaysanız, `composer install` sonrasında `./bin/pitmaster` komutunu çalıştırın. Aşağıdaki örneklerde her iki yol için de `pitmaster` kullanılır. Bağımsız değişken olmadan çalıştırıldığında komut listesini yazdırır.

Revizyonlar `Repository::resolve()` gibi çözümlenir: `HEAD`, dal ve etiket adları, tam ref adları, tam karmalar ve `~N` / `^N` ifadeleri. Kısaltılmış karmalar kabul edilmez. Klonlama, getirme ve gönderme işlemleri yalnızca PHP API üzerinden kullanılabilir.

## Komutlar

### `log`

En yeniden başlayarak commit geçmişini gösterir.

```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 limit gösterimleri (`-n N`, `-nN`, `--max-count N`, `--max-count=N`, `-N`), 0.2.11 sürümünde eklendi. Tek başına bir sayı, Pitmaster için limitin kısa yazımıdır. İlk diğer bağımsız değişken bir yol filtresidir; `--` sonrasındaki her şey yol olarak ele alınır. `-` ile başlayan diğer tüm bağımsız değişkenler `fatal: unrecognized argument: <arg>` yazdırır ve 128 ile çıkar.

Çıktı, `commit <hash>` (sarı), birleştirme commit'leri için `Merge:` satırını, ham kimliği (ad, e-posta, zaman damgası ve saat dilimi) içeren `Author:` değerini ve girintili commit mesajını içerir. `--oneline`, `abc1234 Subject` yazdırır. Yol filtresi tam bir dosya yoluyla eşleşir ve limit commit'lerinin en yeni beş katını inceler ([#7](https://github.com/inline0/pitmaster/issues/7)).

### `show`

Commit ayrıntılarını ve ilk üst öğeye göre farkı gösterir.

```bash
# Show HEAD
pitmaster show

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

Commit meta verilerini (`Date:` satırıyla) ve ardından birleşik farkı görüntüler. Açıklamalı bir etiket için önce etiket başlığı ve mesajı gelir. Renkler yalnızca standart çıktı bir terminal olduğunda kullanılır. Birleştirme commit'leri fark olmadan gösterilir.

### `cat-file`

Bir git nesnesinin ham içeriğini yazdırır.

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

Tam bir karma alır. Nesnenin saklanan içeriğini yazdırır: blob'ları, commit'leri ve etiketleri metin olarak; ağaçları ise ikili biçimlerinde gösterir. `git cat-file -p` aksine ağaçlar biçimlendirilerek yazdırılmaz.

### `status`

Çalışma ağacı durumunu gösterir.

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

Çıktı:

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

Hazırlanmış dosyalar yeşil; hazırlanmamış, birleştirilmemiş ve izlenmeyen dosyalar kırmızı gösterilir. Çakışmalı bir birleştirme sırasında `Unmerged paths:` bölümü görünür. Ayrık HEAD, `HEAD detached` yazdırır; temiz bir ağaç ise `nothing to commit, working tree clean` yazdırır. `--porcelain=v2`, `Repository::statusPorcelainV2()` çıktısını yazdırır.

### `diff`

Dizin ile çalışma ağacı arasındaki değişiklikleri (hazırlanmamış değişiklikleri) gösterir.

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

Çıktı, standart çıktı bir terminal olmasa da renklendirilmiş birleşik farktır. Değiştirilmiş metin dosyaları için `git diff` ile eşleşir; yeni, silinmiş, ikili, yeniden adlandırılmış ve modu değişmiş dosyalar farklı biçimlendirilir (bkz. [Fark](https://pitmaster.inline0.dev/tr/docs/operations/diff)). İlk commit'ten önce `diff --cached` hiçbir şey yazdırmaz ([#5](https://github.com/inline0/pitmaster/issues/5)).

### `add`

Sonraki commit için dosyaları hazırlayın.

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

Her dosya çalışma ağacından okunur, blob nesnesi olarak yazılır ve dizin güncellenir. Bağımsız değişkenler dosya yollarıdır; dizinler ve `.` genişletilmez.

### `commit`

Hazırlanan dosyalardan bir commit oluşturur.

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

Çıktı:

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

`-m` gereklidir; ancak hazırlanmış mesajın kullanıldığı, durdurulmuş birleştirme, kiraz toplama, geri alma veya yeniden tabanlama tamamlanırken gerekli değildir. Yazar ve commit'i oluşturan kişi; ortam değişkenlerinden, sabitlerden ve `.git/config` içinden, [Başlarken](https://pitmaster.inline0.dev/tr/docs/getting-started) bölümünde açıklandığı gibi belirlenir.

### `branch`

Dalları listeler veya yeni bir dal oluşturur.

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

Listeleme çıktısı:

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

Oluşturma `Created branch <name>`, silme `Deleted branch <name>` yazdırır. `-d` ve `-D` aynı şekilde çalışır: hiçbiri dalın birleştirilmiş olup olmadığını kontrol etmez ve ikisi de kullanıma alınmış dalı silmeyi reddeder.

### `tag`

Etiketleri listeler veya yeni bir etiket oluşturur.

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

Oluşturma `Created tag <name>` yazdırır.

### `checkout`

Dalları değiştirir veya HEAD'i ayırır.

```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'i, dizini ve çalışma ağacını hedefle eşleşecek şekilde günceller ve `Switched to '<target>'` yazdırır. İki ağaç arasında farklı olan yollarda yerel değişiklikler veya izlenmeyen dosyalar varsa işlemi reddeder. Diğer izlenen dosyalardaki commit edilmemiş değişikliklerin üzerine, git bunları koruyacak olsa da hedefin içeriği yazılır ([#2](https://github.com/inline0/pitmaster/issues/2)); önce commit edin veya stash'e alın.

### `merge`

Bir veya daha fazla dalı geçerli HEAD ile birleştirir ya da devam eden bir birleştirme çakışmasını sürdürür/iptal eder.

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

Başarılı olduğunda çıktı:

```
Merge successful.
```

Çakışma olduğunda çıktı (stderr'e, çıkış kodu 1):

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

`-s`, `ours`, `ort` ve `recursive` kabul eder; `ort` ile `recursive` ikisi de varsayılan birleştirmeyi kullanır. `-s` ile CLI, birleştirme çakışmalar nedeniyle durduğunda bile `Merge successful.` yazdırır ve 0 ile çıkar ([#21](https://github.com/inline0/pitmaster/issues/21)); bu yüzden sonrasında `status` kontrol edin. Devam eden bir birleştirme yokken `merge --continue`, 128 ile çıkar. Zaten birleştirilmiş bir dalı birleştirmek yeni bir birleştirme commit'i oluşturur ([#6](https://github.com/inline0/pitmaster/issues/6)); izlenen dosyalardaki commit edilmemiş değişikliklerin üzerine de `checkout` ile aynı şekilde yazılır.

### `cherry-pick`

Geçerli HEAD üzerine bir commit uygular ya da devam eden bir çakışmayı sürdürür/iptal eder.

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

Başarılı olduğunda hiçbir şey yazdırmaz. Devam eden bir kiraz toplama işlemi yokken `--continue` ve `--abort`, 128 ile çıkar.

### `revert`

Bir geri alma commit'i oluşturur ya da devam eden bir çakışmayı sürdürür/iptal eder.

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

Başarılı olduğunda hiçbir şey yazdırmaz. Devam eden bir geri alma işlemi yokken `--continue` ve `--abort`, 128 ile çıkar.

### `rebase`

Geçerli dalı başka bir ref üzerine yeniden tabanlar.

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

Başarılı olduğunda hiçbir şey yazdırmaz. Devam eden bir yeniden tabanlama işlemi yokken `--continue`, `--skip` ve `--abort`, `fatal: no rebase in progress` yazdırır ve 128 ile çıkar.

### `bisect`

Bir değişikliği başlatan commit'i ikili aramayla bulur.

```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` ve `bad`, kullanıma alınan sonraki adayın tam karmasını yazdırır. Tek bir şüpheli kaldığında aynı karma yeniden yazdırılır: o commit ilk hatalı commit'tir. git aksine, "ilk hatalı commit budur" özeti yazdırılmaz.

### `stash`

Çalışma dizini değişikliklerini kaydeder ve geri yükler.

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

Mesaj, `push` veya `save` sonrasındaki bağımsız değişkendir; `-m` desteklenmez ve mesaj olarak saklanır. `pop`, `apply` ve `drop` her zaman `stash@{0}` kullanır. Şunları yazdırırlar: `Saved working directory to stash abc1234`, `Applied and dropped stash`, `Applied stash` ve `Dropped stash`.

Stash listesi çıktısı:

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

Birden fazla girdi olduğunda `drop` ve `pop` girdiyi şimdilik listede bırakır ([#10](https://github.com/inline0/pitmaster/issues/10)); `apply` ise stash'in dokunmadığı dosyalardaki commit edilmemiş değişikliklerin üzerine yazar ([#11](https://github.com/inline0/pitmaster/issues/11)).

### `blame`

HEAD'deki bir dosyanın satır satır yazarlığını gösterir.

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

Çıktı:

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

Her satır, commit karmasının ilk 8 karakterini ve yazar kimliğinin (`Name <email> timestamp timezone`) ilk 30 karakterini doldurma olmadan gösterir.

### `grep`

Geçerli HEAD ağacındaki dosya içeriklerinde arama yapar.

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

Çıktı:

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

Seçenekler desenden önce gelmelidir:

- `-i`, `--ignore-case`: büyük/küçük harfe duyarsız eşleştirme
- `-E`, `--extended-regexp`, `--regex`: deseni PCRE düzenli ifadesi olarak ele alır

Çıktı, renkler olmadan düz `path:line:content` metnidir.

### `reflog`

En yeniden başlayarak reflog girdilerini gösterir.

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

Varsayılan biçim `%gd: %gs` (`HEAD@{0}: commit: Add feature`) şeklindedir. Desteklenen yer tutucular: seçici için `%gd` ve `%gD`, mesaj için `%gs`, tam ve kısa yeni karma için `%H` ve `%h`. Limitler `-n N`, `-nN` ve `--max-count N` kabul eder; `-n 0` tüm girdileri yazdırır.

`core.logallrefupdates`, `.git/config` içinde `true` olarak ayarlanmadıkça `pitmaster init` tarafından oluşturulan depolar reflog kaydetmez ([#8](https://github.com/inline0/pitmaster/issues/8)); bu nedenle `reflog`, ayarlanana kadar orada hiçbir şey yazdırmaz.

### `refs`

Tüm ref'leri karmalarıyla birlikte listeler.

```bash
pitmaster refs
```

Çıktı:

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

Karmalar tam olarak yazdırılır.

### `reset`

HEAD'i belirli bir commit'e sıfırlar.

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

Bir revizyon gereklidir. Çıktı:

```
HEAD is now at abc1234
```

### `init`

Yeni bir depo başlatır. Mevcut bir depo gerektirmeyen tek komut budur.

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

Çıktı:

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

`--object-format`, `sha1` (varsayılan) ve `sha256` kabul eder.

## Çıkış kodları

| Kod | Anlam |
|------|---------|
| 0 | Başarılı |
| 1 | Komut hatası: kullanım hatası, bilinmeyen komut, başarısız işlem (`error: <message>`) veya çakışmalar nedeniyle durmuş bir birleştirme |
| 128 | git deposu değil (`fatal: <message>`), tanınmayan bir `log` bağımsız değişkeni ya da devam eden işlem yokken `--continue` / `--abort` / `--skip` |
