وقتی دو شاخه همان خطها را تغییر دادهاند. zev هر تعارض را با طرف شما، پایه و طرف دیگر نشان میدهد، با یک دستور و بیویرایشگر حلشان میکند، و میگذارد همین حالا کامیتشان کنید و بعداً حل کنید. هر گام برای اسکریپتها و عاملهای هوش مصنوعی داده است.
تعارض وقتی پیش میآید که دو شاخه همان خطها را تغییر دادهاند و zev نمیتواند بداند کدام نسخه را میخواهید. در Git تعارض شما را متوقف میکند: تا همهٔ فایلها حل نشدهاند نمیتوانید کامیت کنید، شاخه عوض کنید یا کار را کنار بگذارید. در zev چیزی است که میتوانید ببینید، تکهتکه و بیباز کردن ویرایشگر حلش کنید، یا همانطور که هست کامیتش کنید و بعداً سراغش بیایید.
```diagram
type: flow
title: یک تعارض، از آغاز تا پایان
---
آغاز | `zev merge main --resolve` همهٔ تعارضها را سر جایشان میگذارد | warn | ⚠️
~ zev conflicts
دیدن | هرکدام با طرف شما، پایه و طرف دیگر | | 👀
~ zev resolve
حل | برای هر فایل یا هر تعارض طرفی را برگزینید، یا با دست ویرایش کنید | | ✏️
~ zev merge --continue
پایان | ثبت شد، یا با --keep-conflicts همین حالا ثبت و بعداً حل میشود | good | ✓
? پشیمان شدید؟ `zev merge --abort` همهچیز را برمیگرداند
```
## آغاز: zev merge --resolve
`zev merge` هیچوقت شما را نیمهکاره رها نمیکند. وقتی هر دو طرف همان خطها را تغییر دادهاند، پیش از تغییر هر چیزی میایستد و این را میگوید. سپس `zev merge <branch> --resolve` هر چه ترکیبشدنی است را ترکیب و بقیه را نشانهگذاری میکند:
```bash
zev merge main --resolve
both changed app.py
both changed logo.png (not text: yours is in place; zev resolve logo.png --theirs takes 'main''s)
```
هر جای نشانهگذاریشده سه نسخه نشان میدهد، نه دو: نسخهٔ شما، آنچه خط پیش از تغییر هر دوی شما بود (**پایه**) و نسخهٔ طرف دیگر. اغلب همین پایه است که نشان میدهد کدام تغییر را نگه دارید.
```text
<<<<<<< feature
price = total * 0.9
||||||| base
price = total
=======
price = round(total, 2)
>>>>>>> main
```
## دیدن همهٔ تعارضها: zev conflicts
```bash
$ zev conflicts
Merging main into feature
✗ app.py 1 conflict(s)
#1 line 12
feature price = total * 0.9
base price = total
main price = round(total, 2)
✗ logo.png not text: both changed it (yours is in place)
```
شمارهها (`#1`، `#2`…) همانهاییاند که `--hunk` در ادامه میگیرد. `zev status` هم فایلهای دارای تعارض را فهرست میکند.
## حلشان کنید: zev resolve
برای کل فایل یا تکتک تعارضها طرفی را برگزینید، بیویرایشگر:
```bash
zev resolve app.py --theirs # همهٔ تعارضهای app.py: نسخهٔ main
zev resolve app.py --ours --hunk 2 # فقط تعارض ۲: نسخهٔ شما
zev resolve app.py --both # نسخهٔ شما، بعد نسخهٔ طرف دیگر
zev resolve logo.png --theirs # فایلهای غیرمتنی: یک نسخه را برگزینید
zev resolve --ours # همهٔ تعارضهای باقیمانده، همهجا
```
`--base` خط را همانطور نگه میدارد که پیش از هر دو تغییر بود. یا مثل Git فایل را باز کنید و خودتان ویرایشش کنید: آنچه میخواهید نگه دارید و خطهای نشانگر را پاک کنید. فایلی که دیگر نشانگری ندارد حلشده است.
وقتی همه حل شدند:
```bash
zev merge --continue
```
## الان کامیت کنید، بعداً حل کنید
گاهی تعارض در فایلی است که مال شما نیست، یا در بخشی که باید کس دیگری تصمیمش را بگیرد، و بقیهٔ ادغام نباید منتظر بماند. همانطور که هست ثبتش کنید:
```bash
zev merge --continue --keep-conflicts
kept as a conflict app.py (1 left)
```
کامیت فهرست فایلهایی را که با تعارض ثبت شدهاند با خود دارد. میتوانید شاخه عوض کنید، به کار ادامه دهید و push کنید. چیزی پنهان نمیماند: `zev log` آن کامیت را نشاندار میکند، `zev conflicts` باقیماندهها را فهرست میکند، و هر کامیت بعدی این فهرست را با خود میبرد تا نشانگرها از بین بروند:
```bash
$ zev log --oneline
9c1d2e4a Use the new price rule [1 conflict(s)]
$ zev resolve app.py --theirs # حل و برایتان stage شد
$ zev commit -m "Settle the price rule"
Resolved: app.py
```
روی Zaryn هم کامیت همین نشان را دارد، و **درخواست ادغامی که آخرین کامیتش هنوز تعارض دارد ادغام نمیشود**، پس تعارضها هیچوقت ناخواسته به `main` نمیرسند. فایلهای غیرمتنی نمیتوانند هر دو نسخه را در خود نگه دارند، پس `--keep-conflicts` اول میخواهد برای آنها یک نسخه برگزینید.
## برای اسکریپتها و عاملهای هوش مصنوعی
هر گام پاسخش را بهصورت داده میدهد. `zev conflicts --json` هر فایل و هر تعارض را با هر سه طرف میدهد؛ `--brief` همان را در چند خط: `<` برای نسخهٔ شما، `|` برای پایه و `>` برای طرف دیگر:
```bash
$ zev conflicts --brief
# merging main into feature
app.py #1 L12
< price = total * 0.9
| price = total
> price = round(total, 2)
binary logo.png
```
```json
{"merging":{"branch":"feature","with":"main"},"committed_in":null,"open":2,
"files":[{"path":"app.py","kind":"text","resolved":false,
"hunks":[{"n":1,"line":12,"lines":7,"ours_label":"feature","theirs_label":"main",
"ours":"price = total * 0.9\n","base":"price = total\n","theirs":"price = round(total, 2)\n"}]},
{"path":"logo.png","kind":"binary","resolved":false,"hunks":[]}]}
```
یک عامل تعارضها را بیباز کردن تکتک فایلها میخواند، با پایه پیش رویش تصمیم میگیرد، و هرکدام را با `zev resolve <file> --ours|--theirs|--both --hunk N` حل میکند، بهجای بازنویسی کل فایلها. `zev status --brief` فایلهای دارای تعارض را مثل `git status --porcelain` با `UU` نشان میدهد، و `zev status --json`، `zev log --json` و `zev brief` میگویند چه چیزی باز مانده. `zev undo` ادغام ثبتشده را مثل هر کامیت دیگری برمیگرداند.
## تفاوتش با Git
| | Git | zev |
|---|---|---|
| **در میانهٔ تعارض** | تا همهٔ فایلها حل نشدهاند نمیتوانید کامیت، جابهجایی شاخه یا stash کنید | همین حالا با `--keep-conflicts` کامیت کنید؛ شاخه عوض کنید، push کنید و بعداً حل کنید |
| **آنچه تعارض نشان میدهد** | دو طرف؛ پایه فقط اگر `merge.conflictStyle diff3` را تنظیم کنید | نسخهٔ شما، پایه و طرف دیگر، همیشه |
| **حل کردن** | ویرایشگر یا ابزار ادغام؛ `checkout --ours` فقط برای کل فایل | `zev resolve` برای هر فایل یا هر تعارض (`--hunk`)، همراه با `--both` و `--base` |
| **فهرست کردنشان** | `git diff --name-only --diff-filter=U`، بعد خواندن تکتک فایلها | `zev conflicts`: هر تعارض با طرفهایش، بهصورت متن، `--json` یا `--brief` |
| **پس از کامیت** | نشانگرهایی که اشتباهی کامیت شدهاند مثل هر متن دیگری به نظر میرسند | کامیت تعارضهایش را ثبت میکند؛ `zev log` نشانش میدهد و Zaryn ادغامش نمیکند |
همچنین ببینید: [شاخهها و ادغام](/docs/fa/branches)، [هر کاری را برگردانید](/docs/fa/undo)، [اسکریپتنویسی و عاملهای هوش مصنوعی](/docs/fa/automation-and-agents).
تعارض وقتی پیش میآید که دو شاخه همان خطها را تغییر دادهاند و zev نمیتواند بداند کدام نسخه را میخواهید. در Git تعارض شما را متوقف میکند: تا همهٔ فایلها حل نشدهاند نمیتوانید کامیت کنید، شاخه عوض کنید یا کار را کنار بگذارید. در zev چیزی است که میتوانید ببینید، تکهتکه و بیباز کردن ویرایشگر حلش کنید، یا همانطور که هست کامیتش کنید و بعداً سراغش بیایید.
یک تعارض، از آغاز تا پایان
⚠️
آغاز
zev merge main --resolve همهٔ تعارضها را سر جایشان میگذارد
zev conflicts
👀
دیدن
هرکدام با طرف شما، پایه و طرف دیگر
zev resolve
✏️
حل
برای هر فایل یا هر تعارض طرفی را برگزینید، یا با دست ویرایش کنید
zev merge --continue
✓
پایان
ثبت شد، یا با --keep-conflicts همین حالا ثبت و بعداً حل میشود
or
پشیمان شدید؟ zev merge --abort همهچیز را برمیگرداند
zev merge هیچوقت شما را نیمهکاره رها نمیکند. وقتی هر دو طرف همان خطها را تغییر دادهاند، پیش از تغییر هر چیزی میایستد و این را میگوید. سپس zev merge <branch> --resolve هر چه ترکیبشدنی است را ترکیب و بقیه را نشانهگذاری میکند:
Terminal
zev merge main --resolve both changed app.py both changed logo.png (not text: yours is in place; zev resolve logo.png --theirs takes 'main''s)
هر جای نشانهگذاریشده سه نسخه نشان میدهد، نه دو: نسخهٔ شما، آنچه خط پیش از تغییر هر دوی شما بود (پایه) و نسخهٔ طرف دیگر. اغلب همین پایه است که نشان میدهد کدام تغییر را نگه دارید.
Text
<<<<<<< featureprice = total * 0.9||||||| baseprice = total=======price = round(total, 2)>>>>>>> main
$ zev conflictsMerging main into feature ✗ app.py 1 conflict(s) #1 line 12 feature price = total * 0.9 base price = total main price = round(total, 2) ✗ logo.png not text: both changed it (yours is in place)
شمارهها (#1، #2…) همانهاییاند که --hunk در ادامه میگیرد. zev status هم فایلهای دارای تعارض را فهرست میکند.
برای کل فایل یا تکتک تعارضها طرفی را برگزینید، بیویرایشگر:
Terminal
zev resolve app.py --theirs # همهٔ تعارضهای app.py: نسخهٔ mainzev resolve app.py --ours --hunk 2 # فقط تعارض ۲: نسخهٔ شماzev resolve app.py --both # نسخهٔ شما، بعد نسخهٔ طرف دیگرzev resolve logo.png --theirs # فایلهای غیرمتنی: یک نسخه را برگزینیدzev resolve --ours # همهٔ تعارضهای باقیمانده، همهجا
--base خط را همانطور نگه میدارد که پیش از هر دو تغییر بود. یا مثل Git فایل را باز کنید و خودتان ویرایشش کنید: آنچه میخواهید نگه دارید و خطهای نشانگر را پاک کنید. فایلی که دیگر نشانگری ندارد حلشده است.
گاهی تعارض در فایلی است که مال شما نیست، یا در بخشی که باید کس دیگری تصمیمش را بگیرد، و بقیهٔ ادغام نباید منتظر بماند. همانطور که هست ثبتش کنید:
Terminal
zev merge --continue --keep-conflicts kept as a conflict app.py (1 left)
کامیت فهرست فایلهایی را که با تعارض ثبت شدهاند با خود دارد. میتوانید شاخه عوض کنید، به کار ادامه دهید و push کنید. چیزی پنهان نمیماند: zev log آن کامیت را نشاندار میکند، zev conflicts باقیماندهها را فهرست میکند، و هر کامیت بعدی این فهرست را با خود میبرد تا نشانگرها از بین بروند:
Terminal
$ zev log --oneline9c1d2e4a Use the new price rule [1 conflict(s)]$ zev resolve app.py --theirs # حل و برایتان stage شد$ zev commit -m "Settle the price rule"Resolved: app.py
روی Zaryn هم کامیت همین نشان را دارد، و درخواست ادغامی که آخرین کامیتش هنوز تعارض دارد ادغام نمیشود، پس تعارضها هیچوقت ناخواسته به main نمیرسند. فایلهای غیرمتنی نمیتوانند هر دو نسخه را در خود نگه دارند، پس --keep-conflicts اول میخواهد برای آنها یک نسخه برگزینید.
هر گام پاسخش را بهصورت داده میدهد. zev conflicts --json هر فایل و هر تعارض را با هر سه طرف میدهد؛ --brief همان را در چند خط: < برای نسخهٔ شما، | برای پایه و > برای طرف دیگر:
Terminal
$ zev conflicts --brief# merging main into featureapp.py #1 L12< price = total * 0.9| price = total> price = round(total, 2)binary logo.png
یک عامل تعارضها را بیباز کردن تکتک فایلها میخواند، با پایه پیش رویش تصمیم میگیرد، و هرکدام را با zev resolve <file> --ours|--theirs|--both --hunk N حل میکند، بهجای بازنویسی کل فایلها. zev status --brief فایلهای دارای تعارض را مثل git status --porcelain با UU نشان میدهد، و zev status --json، zev log --json و zev brief میگویند چه چیزی باز مانده. zev undo ادغام ثبتشده را مثل هر کامیت دیگری برمیگرداند.