# zev و Git

> zev چه کارهایی می‌کند که Git نمی‌کند، چه چیزهایی یکسان می‌ماند، و هر دستور روزمرهٔ Git کنار شکل zev آن.

Source: https://zaryn.xyz/docs/fa/zev-vs-git

«Git که هست، پس چرا zev؟» چون zev کارهایی را انجام می‌دهد که Git به خود شما یا ابزارهای دیگر می‌سپارد: یک `zev undo` برای هر اشتباه، تعارض‌هایی که می‌توانید کامیتشان کنید و بعداً حل کنید، بازبینی پشته‌ای، ذخیرهٔ فایل‌های بزرگ، امضای کامیت‌ها، گواه این‌که سرور هنوز کار شما را نگه داشته، و خروجی‌ای ساخته‌شده برای اسکریپت‌ها و عامل‌های هوش مصنوعی. پاسخ کامل‌تر در [چرا zev](/docs/fa/why-zev) است. اگر Git را می‌شناسید، کار با zev را هم بلدید. دستورهای روزمره همان نام‌ها را دارند و همان کارها را می‌کنند.

```diagram
type: cards
title: آنچه یکسان می‌ماند
---
🌿 | شاخه، ادغام، rebase | branch، switch، merge، rebase، cherry-pick، stash و tag همان‌طور کار می‌کنند که انتظار دارید
📜 | تاریخچه‌ای از کامیت‌ها | هر کامیت والدش و درخت فایل‌هایی را که ذخیره کرده نام می‌برد
🔁 | push، pull، clone | برای هرکدام یک دستور، به Zaryn یا هر سرور zev و از آن
```

## آنچه zev می‌افزاید

| | Git | zev |
|---|---|---|
| **فایل‌های بزرگ** | هر نسخه یک شیء کامل تازه است؛ فایل بزرگ به Git LFS و سرور جداگانه‌اش نیاز دارد | فایل‌ها بر پایهٔ محتوا قطعه‌قطعه می‌شوند، پس یک ویرایش در push و pull فقط قطعه‌های اطرافش را می‌فرستد. [قطعه‌بندی بر پایهٔ محتوا](/docs/fa/chunking) |
| **کامیت‌های امضاشده** | پیش‌فرض خاموش؛ کلید GPG یا SSH برای هر رایانه باید راه بیفتد | هر کامیت تازه بی هیچ تنظیمی روی رایانهٔ شما امضا می‌شود. کلید را یک بار بیفزایید تا Zaryn کامیت را **تأییدشده** نشان دهد. [کامیت‌های امضاشده](/docs/fa/signed-commits) |
| **گواه نگه‌داری کار شما** | به میزبان اعتماد می‌کنید | `zev verify-storage` بررسی می‌کند که سرور واقعاً آخرین push شما را دارد، و رسیدهای امضاشدهٔ روزانه همهٔ اشیا را می‌پوشانند. [ذخیره‌سازی راستی‌آزمایی‌شده](/docs/fa/verified-storage) |
| **رمزنگاری** | هیچ: میزبان همه‌چیز را می‌خواند | مخزن‌های رمزنگاری‌شده روی رایانهٔ شما مهر می‌شوند؛ سرور چیزی را نگه می‌دارد که نمی‌تواند بخواند. [مخزن‌های رمزنگاری‌شده](/docs/fa/encrypted-repositories) |
| **برگرداندن** | یک reflog برای هر شاخه، و دستورالعمل `git reset` جدا برای هر اشتباه؛ انتخاب اشتباه کار را دور می‌ریزد | `zev undo` آخرین کامیت، ادغام، rebase، شاخهٔ پاک‌شده یا add را برمی‌گرداند و هرگز کاری را که جایی ذخیره نشده بازنویسی نمی‌کند. `zev op log` همهٔ تغییرها را فهرست می‌کند. [هر کاری را برگردانید](/docs/fa/undo) |
| **ویرایش‌هایی که دور ریختید** | `git checkout -- file` یا `git reset --hard` آن‌ها را برای همیشه پاک می‌کند | zev اول نسخه‌ای نگه می‌دارد؛ `zev recover` برشان می‌گرداند و هرگز کار تازه‌تر را بازنویسی نمی‌کند. [هر کاری را برگردانید](/docs/fa/undo) |
| **تعارض‌های ادغام** | متوقفتان می‌کنند: تا همهٔ فایل‌ها حل نشده‌اند نه کامیت، نه جابه‌جایی شاخه، نه stash؛ دو طرف نشان داده می‌شود و پایه فقط اگر تنظیمش کنید | هر تعارض با نسخهٔ شما، پایه و طرف دیگر نشان داده می‌شود؛ `zev resolve` برای هر فایل یا هر تعارض طرفی را برمی‌گزیند؛ `--keep-conflicts` همین حالا کامیت می‌کند تا بعداً حل کنید، و Zaryn تا آن وقت ادغامش نمی‌کند. [تعارض‌های ادغام](/docs/fa/conflicts) |
| **مخزنی دیگر درون مخزن شما** | زیرماژول‌ها: `--recursive` را فراموش کنید و پوشه خالی است، کد درونش روی HEAD جداشده است و بازبینی‌ها نسخه را نشان نمی‌دهند | زیرمخزن‌ها: سنجاق فایلی خواناست، clone، checkout و pull آن‌ها را می‌آورند و به‌روز می‌کنند، و کار درون آن‌ها هرگز زیر پا نمی‌رود. [زیرمخزن‌ها](/docs/fa/subrepos) |
| **تغییرهای پشته‌ای** | شاخه‌هایی که روی هم ساخته می‌شوند را خودتان دنبال می‌کنید؛ هرکدام با دست rebase می‌شود (`--onto`، وگرنه کامیت‌ها تکراری می‌شوند) و مقصد هر درخواست ادغام پس از ادغام با دست عوض می‌شود | `zev stack` زنجیره را می‌شناسد: restack همهٔ شاخه‌ها را یک‌جا و درست جابه‌جا می‌کند، push برای هرکدام درخواست ادغامی روی شاخهٔ زیرین باز می‌کند، sync پس از ادغام‌ها مرتب می‌کند. [تغییرهای پشته‌ای](/docs/fa/stacked-changes) |
| **مرحله‌بندی بخشی از یک فایل** | `git add -p`، فقط تعاملی؛ اسکریپت باید خودش وصله بسازد | `zev add -p` برای آدم‌ها، و `zev add <file> --hunk 2` برای اسکریپت‌ها و عامل‌ها، با همان شماره‌هایی که `zev diff --brief` نشان می‌دهد. [دستورها](/docs/fa/commands#zev-add) |
| **جست‌وجو در کد** | `git grep`: خط‌های جور | `zev grep` می‌گوید هر یافته در کدام تابع، کلاس یا سرفصل است، با `--at` در هر کامیتی جست‌وجو می‌کند و به‌صورت `--json` یا `--brief` پاسخ می‌دهد. [دستورها](/docs/fa/commands#zev-grep) |
| **خروجی برای اسکریپت‌ها و عامل‌ها** | `--porcelain` برای status، رشته‌های قالب برای log | `--json` و `--brief` روی status، log، diff، show و branch، یا یک بار `ZEV_OUTPUT`. [اسکریپت‌نویسی و عامل‌های هوش مصنوعی](/docs/fa/automation-and-agents) |
| **جهت‌یابی** | `ls`، `cat README`، `git log`، `git status`، یکی‌یکی | `zev brief` پروژه، تغییرهای شما، کامیت‌های اخیر، چیدمان، فایل‌های پرتغییر و شاخه‌ها را در یک فراخوانی و در بودجهٔ توکن می‌دهد. `zev diff --summary` تابع‌هایی را که هر تغییر لمس کرده نام می‌برد. [اسکریپت‌نویسی و عامل‌های هوش مصنوعی](/docs/fa/automation-and-agents) |
| **عامل‌های هوش مصنوعی** | ابزارهای دیگران | `zev mcp` مخزن‌ها، تاریخچه، issueها و CI شما را با پاسخ‌های فشرده به عامل می‌دهد. [اسکریپت‌نویسی و عامل‌های هوش مصنوعی](/docs/fa/automation-and-agents) |
| **چه چیزی در کد عوض شد** | خط‌های افزوده و حذف‌شده | `zev sdiff` تابع‌های افزوده، حذف‌شده، تغییرنام‌یافته یا با امضا یا بدنهٔ عوض‌شده را گزارش می‌کند (فعلاً برای Zig). [مقایسهٔ معنایی](/docs/fa/semantic-diff) |
| **تاریخچهٔ مدل و داده** | فقط کامیت‌ها | سنجه برای هر کامیت، ارزیابی‌هایی که اگر امتیاز پایین بیاید درخواست ادغام را نگه می‌دارند، مجموعه‌داده‌ها و تبار. [ارزیابی‌ها و تبار](/docs/fa/evals-and-lineage) |
| **کامیت‌های آسیب‌دیده** | چیزی درونی ندارد | هشدارها کامیت‌ها را آسیب‌دیده علامت می‌زنند و هر چیزی که روی آن‌ها ساخته شده را پیدا می‌کنند. [هشدارها و تبار](/docs/fa/advisories) |
| **نشانی‌دهی باز** | اشیا در `.git` یک مخزن می‌مانند | کامیت‌ها اشیای IPFS هستند که هر کسی، در Zaryn یا هر جای دیگر، می‌تواند پیدا و بررسی‌شان کند. [IPLD و منشأ](/docs/fa/ipld-provenance) |

## ساخته‌شده برای آدم‌ها و برای عامل‌های هوش مصنوعی

zev برای دو جور خواننده ساخته شده است. آدم‌ها جمله، رنگ و دستور بعدی را می‌گیرند. وقتی چیزی خراب می‌شود، پیام می‌گوید چه کنید، نه فقط کد خطا. عامل‌های هوش مصنوعی و اسکریپت‌ها همان واقعیت‌ها را به شکل داده می‌گیرند: `--json` برای تجزیهٔ دقیق و `--brief` برای کمترین توکن. داده همیشه روی stdout می‌رود و متن آدم‌ها روی stderr، پس این دو هرگز قاطی نمی‌شوند.

```bash
zev status                 # برای شما: چه عوض شده و بعد چه اجرا کنید
zev status --brief         # برای یک عامل: "# main"، سپس " M f.txt"
ZEV_OUTPUT=json zev log    # برای یک اسکریپت: یک سند JSON
```

## دستورهای Git شما در zev

| در Git می‌نوشتید | در zev |
|---|---|
| `git init` | `zev init` |
| یک مخزن Git موجود | `zev import-git`: همهٔ شاخه‌ها و برچسب‌ها، در همان پوشه ([مهاجرت از Git](/docs/fa/from-git)) |
| `git clone <url>` | `zev clone owner/name` |
| `git lfs track` / `git lfs pull` | هیچ: فایل‌های بزرگ را خود zev تکه‌تکه و ذخیره می‌کند |
| `git commit --amend` | `zev undo`، سپس دوباره کامیت |
| `git status` / `git status --porcelain` | `zev status` / `zev status --brief` |
| `git add <file>` / `git add .` | `zev add <file>` / `zev add .` |
| `git commit -m "…"` | `zev commit -m "…"` (خودکار امضا می‌شود) |
| `git log --oneline` | `zev log --oneline` یا `zev log --brief` |
| `git diff` / `git diff --staged` | `zev diff` / `zev diff --staged` |
| `git show <commit>` | `zev show <commit>` |
| `git branch` / `git branch <name>` / `git branch -d <name>` | `zev branch` / `zev branch <name>` / `zev branch -d <name>` |
| `git switch <name>` / `git switch -c <name>` | `zev switch <name>` / `zev switch -c <name>` |
| `git merge <branch>` | `zev merge <branch>` |
| `git rebase <branch>` | `zev rebase <branch>` |
| `git rebase --onto <new> <old>` | `zev rebase <new> --since <old>`، یا برای زنجیره‌ای از شاخه‌ها `zev stack restack` |
| `git diff --name-only --diff-filter=U` | `zev conflicts` (همراه با طرف‌های هر تعارض) |
| `git checkout --ours <file>` / `--theirs` | `zev resolve <file> --ours` / `--theirs` (یا `--hunk N` برای یک تعارض) |
| `git add -p` | `zev add -p`، یا `zev add <file> --hunk 1,3` بی‌پرسش |
| `git mv <from> <to>` | `zev mv <from> <to>` |
| `git grep <pattern>` | `zev grep <pattern>`، همراه با تابعی که هر یافته در آن است |
| `git submodule add <url> <path>` | `zev sub add <address> <folder>` |
| `git submodule update --init --recursive` | هیچ: clone، checkout و pull انجامش می‌دهند (با دست: `zev sub update`) |
| `git cherry-pick <commit>` | `zev cherry-pick <commit>` |
| `git stash` / `git stash pop` | `zev stash` / `zev stash pop` |
| `git tag <name>` | `zev tag <name>` |
| `git restore <file>` / `git restore --staged <file>` | `zev restore <file>` / `zev restore --staged <file>` |
| `git rm <file>` | `zev rm <file>` |
| `git blame <file>` | `zev blame <file>` |
| `git bisect` | `zev bisect` |
| `git remote add origin <url>` | `zev remote add origin <url>` |
| `git push` / `git pull` | `zev push` / `zev pull` |
| `git verify-commit <commit>` | `zev verify <commit>` |
| `git diff --stat` | `zev diff --summary` (با تابع‌های لمس‌شده) |
| `git reset --soft HEAD~1` | `zev undo` |
| `git reflog` | `zev op log` |
| `git reset --hard HEAD@{n}` | `zev op restore <n>` |

در جدول نیست؟ با `zev` در جلویش تایپش کنید: `zev git <your git command>` شکل zev را می‌گوید و اجرایش می‌کند (`-n` فقط می‌گوید). [همچنان Git تایپ کنید](/docs/fa/from-git#همچنان-git-تایپ-کنید).

به کامیت‌ها و شاخه‌ها به همان شکل اشاره می‌شود: یک هش یا پیشوندی از آن، نام شاخه یا برچسب، `HEAD`، `HEAD~2`، `main^`.

## آنچه Git دارد و zev (هنوز) ندارد

مقایسهٔ منصفانه از هر دو سو است.

| Git | در zev |
|---|---|
| کامیت‌های ادغام با دو والد | تاریخچه خطی می‌ماند: `zev merge` کامیت‌های شما را روی شاخهٔ دیگر بازپخش می‌کند، مثل `git pull --rebase` |
| `git worktree`، checkout پراکنده و کم‌عمق | هنوز نه |
| همهٔ میزبان‌ها و ابزارهای دنیا با آن حرف می‌زنند | zev با Zaryn و هر سرور zev حرف می‌زند؛ `zev import-git` مخزن Git را می‌آورد |

## وقتی Git هنوز ابزار درستی است

zev نمی‌خواهد در هر موردی برنده باشد. اگر پروژهٔ شما باید روی میزبانی باشد که فقط Git می‌فهمد یا ابزارهایش به `.git` وصل‌اند، یا اگر هیچ‌کدام از چیزهای جدول‌های بالا برایتان مهم نیست، Git به‌خوبی به کارتان می‌آید. zev برای تیم‌هایی است که می‌خواهند برگرداندن، تعارض‌هایی که متوقفشان نمی‌کند، بازبینی پشته‌ای، فایل‌های بزرگ، امضا و عامل‌های هوش مصنوعی بی سرهم‌کردن ابزارهای اضافه کار کنند.

## مهاجرت

`zev import-git` کل تاریخچهٔ یک مخزن Git را در همان پوشه به zev می‌آورد و `.git` همان‌طور که بود می‌ماند، پس تا وقتی جابه‌جا می‌شوید می‌توانید از هر دو استفاده کنید. [مهاجرت از Git](/docs/fa/from-git).

بعدی: [مهاجرت از Git](/docs/fa/from-git)، [اولین مخزن شما، قدم به قدم](/docs/fa/first-repository)، یا اگر شاخه و ادغام برایتان تازه است [کنترل نسخه به زبان تصویر](/docs/fa/version-control-in-pictures).
