پالت فرمان

دنبال فرمانی برای اجرا بگردید…

ZarynZaryn
میزبانی کد و کنترل نسخه·۵ دقیقه مطالعه·

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

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