# تعارض‌های ادغام

> وقتی دو شاخه همان خط‌ها را تغییر داده‌اند. zev هر تعارض را با طرف شما، پایه و طرف دیگر نشان می‌دهد، با یک دستور و بی‌ویرایشگر حلشان می‌کند، و می‌گذارد همین حالا کامیتشان کنید و بعداً حل کنید. هر گام برای اسکریپت‌ها و عامل‌های هوش مصنوعی داده است.

Source: https://zaryn.xyz/docs/fa/conflicts

تعارض وقتی پیش می‌آید که دو شاخه همان خط‌ها را تغییر داده‌اند و 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).
