الدرس 19 · السجل والتكامل
افهم الدمج بالتقديم السريع
قدّم فرعًا إلى إيداع لوحة داكنة تابع موجود دون إنشاء إيداع آخر. قارن ذلك بمدخل متباعد لا يقبل التقديم.
- المستوى: متوسط
- قراءة 5 دقائق
- فيديو 5 دقائق
- آخر تحديث
- قبل هذا الدرس: ادمج فرعين تباعد سجلهما
حُفظ التقدّم في هذا المتصفح.
يحمّل التشغيل الفيديو من YouTube (وضع الخصوصية المحسّنة).
ما ستتعلمه
- تعرف شرط السلف.
- أثبت اتفاق الطرفين بعد التقديم.
- افصل تحريك المرجع عن إنشاء الإيداع.
- توقع الرفض عند التباعد.
قبل البدء
تبدأ من نسخة منفصلة من نتيجة الدرس الثامن عشر (main هو الدمج، وهو خالٍ): أنشئ scenario/ff-target عند هذا الإيداع ثم feature/dark-mode عند الإيداع نفسه؛ وتنال لوحة الألوان الداكنة إيداعًا واحدًا D على الميزة. عد إلى scenario/ff-target قبل الدمج.
سُجّل الفيديو باستخدام Git 2.52.0 وGitTree 2.0 على Ubuntu 24.04: لوحة الألوان الداكنة وإيداعها والتبديل والدمجان جرت في التطبيق؛ أما الفرعان التجريبيان والفحوص ففي الطرفية، وعُرض الرفض في التطبيق ثم في الطرفية. لم يُشغَّل شيء على macOS أو Windows، وUbuntu هو نظام Linux الوحيد المسجَّل. الحد الأدنى المقروء لـ GitTree هو Git 2.39.0.
يطلب GitTree تسجيل الدخول، ثم تشمل الخطة المجانية كل خطوات الدرس. لا مزوّد أو Pro أو اعتماد API أو خدمة إنترنت مطلوبة. الوجهة المحلية المجردة ليست GitLab أو CI. الهويات خيالية example.com؛ لا تنفذ الدرس في مستودع مصدر.
نفّذ التغييرات عبر التطبيق أو الطريق الأصلي من الحالة نفسها، لا كليهما بالتتابع. يمكن التحقق بالقراءة بعد أيهما. تُسمَّى التهيئة الطرفية أصلية، لا ميزة تطبيق مختلقة.
الفكرة وأثر الأفعال
يمكن التقديم إذا كان الهدف سلفًا للوارد. ينتقل الوسم إلى التابع دون إيداع دمج جديد.
يبقى D بهويته وأبيه؛ ما زال M القديم دمجًا بأبوين، فلا تنسب أبويه إلى عملية اليوم.
التقديم فقط شرط سياسة لا إصلاح عام؛ إن تقدم الهدف مستقلًا تباعد الطرفان ويرفض الوضع.
يتقدم الهدف والملفات إلى D وتبقى الميزة؛ لا إيداع جديدًا أو تغيير خادم.
إعداد حالة المشروع المحددة
ابدأ نسخة عادية منفصلة من المشروع كما تركه الدرس الثامن عشر. يبقى gittree-features الأصلي محفوظًا ولا تنفذ في مستودع مصدر. (سمّت خطة سابقة للدورة نقطة بداية مختلفة؛ يستخدم الفيديو نتيجة الدرس الثامن عشر بالخطوات نفسها.) ورقة الأنماط أدناه هي styles.css للمشروع مع إضافة كتلة واحدة للوحة الداكنة. الهوية محلية خيالية والتوقيع معطل.
مدخلات الملفات كاملة
احفظ في المرحلة المحددة فقط بصيغة UTF-8 وLF وسطر نهائي. لا تلصق أسوار Markdown. ترث الملفات الثابتة نقطة البداية؛ لا تستبدل الأصل بنسخة إعادة منفصلة.
styles.css — DARK
:root {
color-scheme: light;
--page: #f7f8fa;
--surface: #ffffff;
--text: #17212e;
--link: #154ab5;
--line: #bac4d0;
}
* {
box-sizing: border-box;
}
body {
margin: 0;
background: var(--page);
color: var(--text);
font: 1rem/1.6 system-ui, sans-serif;
}
a {
color: var(--link);
}
.site-header,
main,
footer {
width: min(68rem, 100% - 2rem);
margin-inline: auto;
}
.site-header {
display: flex;
flex-wrap: wrap;
justify-content: space-between;
gap: 1rem;
padding-block: 1rem;
}
.hero {
max-width: 48rem;
padding-block: 3rem;
}
h1 {
font-size: clamp(2rem, 5vw, 3.5rem);
line-height: 1.2;
}
.cards {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(min(16rem, 100%), 1fr));
gap: 1rem;
}
.feature-card {
padding: 1rem;
border: 1px solid var(--line);
border-radius: 0.75rem;
background: var(--surface);
}
section {
margin-block-end: 2rem;
}
button,
input {
font: inherit;
}
button,
input {
padding: 0.5rem 0.75rem;
}
:focus-visible {
outline: 3px solid var(--link);
outline-offset: 3px;
}
form {
display: grid;
max-width: 28rem;
gap: 0.5rem;
}
:root[data-theme="dark"] {
color-scheme: dark;
--page: #121923;
--surface: #1b2635;
--text: #edf2f8;
--link: #a4c6ff;
--line: #7388a1;
}في GitTree
لوحة الأوامر: Command+Shift+P (وCtrl+Shift+P على Ubuntu)، ثم الأمر المحدد حرفيًا. أفعال المرجع المسمّى في قائمة صفه، لا اختصار لوحة بلا وسيط.
- أعدّ الفرعين في النسخة المنفصلة واحفظ DARK على الميزة.
- أودِع styles.css وحده بالملخّص المحدد وافحص D.
- تحت محلي (Local) افتح المجلد scenario وانقر ff-target بزر الفأرة الأيمن ← التبديل إلى scenario/ff-target (Checkout scenario/ff-target)؛ وتحقق أنه ما زال عند M وخالٍ.
- تحت محلي (Local) افتح المجلد feature وانقر dark-mode بزر الفأرة الأيمن ← دمج feature/dark-mode في scenario/ff-target (Merge feature/dark-mode into scenario/ff-target)؛ وراجع المصدر والهدف في الحوار.
- في طريقة التسجيل (Record it as) اختر تقديم سريع فقط (Fast-forward only) لا إنشاء دمج دائم.
- انقر دمج (Merge) مرة واحدة وانتظر انتقال الهدف إلى D الموجود.
- قارن المعرّفات الكاملة وافحص DARK والعمل الخالي.
- اختبر الرفض في نسخة متباعدة منفصلة (افتحها من علامة تبويب جديدة (New Tab) والمستودعات الأخيرة): كرّر الدمج بـ تقديم سريع فقط (Fast-forward only) فيرفض التطبيق ويقول إن في الهدف «تغييرات ليست لديك بعد» (has changes you do not have yet). واترك الأصل دون تغيير.
لكل إيداع عادي: الملخّص (Summary) بالملخّص المحدد والوصف (Description) خالٍ؛ خيارات تعديل الإيداع الأخير (Amend Previous Commit) وتخطّي الخطّافات (Skip Hooks) وإضافة Signed-off-by (Add Signed-off-by) ومؤلف مختلف (Different Author) والدفع بعد الإيداع (Push After Commit) والسماح بإيداع فارغ (Allow Empty Commit) معطلة ودون مؤلفين مشاركين. جهّز الملفات المحددة ثم زر الإيداع ذي العدد الصحيح مرة واحدة، أو Command+Enter كبديل. درس التعديل الأخير وحده يغير خياره الصريح.
في الطرفية
في نسخة منفصلة من نتيجة الدرس الثامن عشر:
git switch --create scenario/ff-target
git switch --create feature/dark-modeضع ورقة DARK كاملة مكان styles.css ثم:
git add -- styles.css
git commit --quiet -m "feat: add the dark palette"
git switch --quiet scenario/ff-target
git merge --quiet --ff-only feature/dark-mode
git rev-parse HEAD feature/dark-mode
git log -1 --format=%s
git status --shortيعرض استعلام SHA معرّفين متطابقين فعليًا. الملخّص:
feat: add the dark paletteالحالة خالية. أثبت الفحص اتفاق الهدف مع D المقاس سابقًا لا عقدة جديدة. للمُدخل البديل أضف إيداع docs/integration-note.md مستقلًا إلى الهدف في نسخة أخرى؛ يرفض ff-only مع حفظ الفرعين. لا تغيّر السياسة سرًا.
النتيجة
حيث تنتهي: يشير الفرعان إلى D الموجود نفسه؛ تتطابق الملفات مع DARK دون عقدة دمج جديدة وmain الأصلي ثابت.
أخطاء شائعة
- وصف أي التقاء رسم بإيداع دمج جديد.
- اعتبار النسخة البديلة نقطة الأصل.
- تكرار تغيير اكتمل في التطبيق.
إن حدث خطأ
بعد الرفض افحص التاريخين واختر مسارًا مستقلًا بعد المراجعة؛ لا يغير الرفض المرجع أو الملفات.
اختبر فهمك
أجب عن كل سؤال ثم اقرأ السبب. الأسئلة المعلَّمة «مطلوب» تُحتسب لإكمال الدرس.
0 من 6 صحيحة
أجب عن الأسئلة المطلوبة إجابة صحيحة لتكمل الدرس.
جرى التحقق في هذا المتصفح.
تدريب
أثبت اتفاق الهدف مع D وكامل DARK، وتوقع رفض التباعد في نسخة منفصلة وافحص ثبات المراجع.
تأكيد منك أنت: لا يستطيع الموقع رؤية جهازك.
لإكمال الدرس، أجب عن الأسئلة المطلوبة إجابة صحيحة وأكّد تنفيذ التمرين العملي.
خلاصة
- يسمح النسب بالتقديم.
- يحفظ الوارد هويته.
- يرفض ff-only التباعد.
ذو صلة
المصطلحات الجديدة
Fast-forward — تقديم سريع; descendant — تابع; ancestor — سلف.
نص الفيديو
ترجمة التعليق الصوتي الإنجليزي للفيديو، مقطعًا بعد مقطع.
اعرض النص
- ابدأ من نقطة الحالة المحددة.
- سمِّ الفرع ونسخة الفهرس ونسخة العمل.
- أعدّ نسخة الدورة المعزولة وحدها.
- ابدأ الاسمين عند الإيداع نفسه.
- سجّل تغيير اللوحة الحقيقي.
- عد إلى الهدف الثابت.
- أكد اتجاه الدمج.
- اشترط التقديم فقط صراحةً.
- حرّك الوسم إلى التابع الموجود.
- افحص الهويات لا الرسم وحده.
- احفظ الهدف المتباعد بدل فرضه.
- ما الشرط؟
- يحدد النسب التقديم لا الأسماء أو الألوان.
- ماذا يتغير؟
- ينتقل الهدف إلى D موجود دون دفع.
- معرّف الهدف الناتج؟
- يتفق الهدف المقاس مع طرف الميزة السابق.
- أضفت إيداع هدف مستقلًا: ff-only؟
- يناقض التباعد شرط النسب.
- لـ M أبوان: دليل دمج اليوم؟
- نسب M السابق ليس إيداعًا جديدًا اليوم.
- ما دليل الإتمام؟
- يلزم إثبات المرجع والملف.
- تحقّق من النتيجة الفعلية، لا رسالة وحدها.
- توقّع نتيجة المُدخل المختلف قبل الفعل.
- احتفظ بالعمل المفيد قبل الاستعادة.
- أثبت نقطة الحالة قبل المتابعة.
- احتفظ بالنتيجة المتحققة للخطوة التالية.