
قاموس Git: المصطلحات الأساسية التي ينبغي لكل مطور معرفتها
يصبح Git أسهل بكثير عندما تكون مصطلحاته واضحة. فالأوامر التي تبدو في البداية غير مترابطة، مثل add وcommit وswitch وmerge وfetch وrebase، تعمل جميعها على عدد صغير من المفاهيم المترابطة.
يشرح هذا القاموس تلك المفاهيم بلغة عملية. وهو ليس مجرد قاموس أبجدي، بل جرى تجميع المصطلحات وفق الطريقة التي يصادفها بها المطورون: بنية المستودع، وحالات الملفات، والسجل، والفروع، والتعاون، والدمج، والاستعادة، والإصدارات، والبنية الداخلية لـGit.
يتضمن كل تعريف سياقه والأوامر المرتبطة به وسوء الفهم الشائع حوله. استخدم المقالة مرجعًا أثناء قراءة وثائق Git، أو مراجعة pull request، أو تتبع مشكلة في مستودع، أو تعلم مسار عمل غير مألوف.
كيفية استخدام قاموس Git هذا
يمكنك قراءة القاموس من البداية إلى النهاية بوصفه دورة مختصرة في Git، أو الانتقال مباشرة إلى فئة محددة:
التحكم بالإصدارات وأساسيات المستودعات.
Working tree وindex وحالات الملفات.
الالتزامات والسجل.
الفروع والمراجع.
المستودعات البعيدة والمزامنة.
الدمج وrebase والتكامل.
التراجع والاستعادة والعمل المؤقت.
العلامات والإصدارات والتحقق.
مصطلحات التعاون ومنصات الاستضافة.
البنية الداخلية لـGit والمفاهيم المتقدمة.
قد تحمل مصطلحات Git معنى عامًا في تطوير البرمجيات ومعنى دقيقًا داخل Git. تركز هذه المقالة على معناها في سياق Git.
التحكم بالإصدارات وأساسيات المستودعات
Version Control System
نظام التحكم بالإصدارات هو نظام يسجل التغييرات التي تطرأ على الملفات بمرور الوقت، بحيث يمكن فحص الحالات السابقة أو استعادتها. كما يدعم التعاون عبر تحديد التغييرات والمؤلفين والعلاقات بين النسخ.
Git نظام تحكم بالإصدارات موزع.
Distributed Version Control System
يمنح نظام التحكم بالإصدارات الموزع كل clone كامل سجل المستودع الخاص به، بدل الحاجة إلى الاتصال بخادم مركزي لكل عملية تتعلق بالسجل.
باستخدام Git، يستطيع المطورون إنشاء الالتزامات، وفحص السجل، وإنشاء الفروع، وتنفيذ عمليات دمج كثيرة محليًا.
Repository
المستودع هو مشروع يديره Git، بما يشمل ملفاته وسجل إصداراته.
يحتوي مستودع العمل المعتاد على:
ملفات المشروع الظاهرة.
مجلد مخفي باسم
.gitيحتوي على بيانات Git الوصفية والكائنات.
أوامر شائعة:
git init
git clone
git status
Local Repository
المستودع المحلي موجود على جهاز المطور. ويحتوي على الالتزامات والفروع والعلامات والإعدادات وبيانات Git الأخرى المتاحة لذلك الـclone.
إنشاء التزام محلي لا يرفعه تلقائيًا إلى أي مكان.
Remote Repository
المستودع البعيد هو مستودع Git آخر يستطيع المستودع المحلي التواصل معه. وغالبًا ما يكون مستضافًا على GitHub أوGitLab أوBitbucket أوAzure Repos أو خادم خاص.
يمكن استخدام المستودع البعيد من أجل:
التعاون.
مراجعة الشيفرة.
السجل المشترك.
نسخ العمل المسجل احتياطيًا.
تشغيل CI/CD.
Bare Repository
المستودع bare يحتوي على بيانات مستودع Git، لكنه لا يملك عادة working tree جرى checkout لها.
يُستخدم غالبًا بوصفه مستودعًا مشتركًا على الخادم.
أنشئ واحدًا باستخدام:
git init --bare project.git
Working Tree
Working tree، وتُسمى أيضًا working directory، تحتوي على الملفات التي جرى checkout لها حاليًا والمتاحة للتحرير.
وقد تختلف عن staging area وعن أحدث commit.
Working Directory
يُستخدم مصطلح working directory غالبًا مرادفًا لـworking tree. ومن الناحية الدقيقة قد يعني مجلد نظام الملفات الحالي، لكن في نقاش Git اليومي يعني عادة ملفات المشروع التي جرى checkout لها.
.git Directory
يخزن مجلد .git البيانات الداخلية للمستودع، بما فيها الكائنات والمراجع والإعدادات والسجلات وindex.
يؤدي حذفه إلى إزالة سجل Git المحلي وتحويل المجلد إلى مجلد عادي.
Clone
الـclone هو مستودع محلي جديد أُنشئ من مستودع موجود.
git clone https://example.com/team/project.git
ينسخ الـclone المعتاد سجل المستودع، وينشئ إعداد remote، وينفذ checkout لـworking tree.
Initialize
تهيئة مستودع تعني إنشاء بيانات Git الوصفية داخل مجلد.
git init
ينشئ ذلك مستودعًا محليًا جديدًا. ولا ينشئ مستودعًا بعيدًا ولا يرفع الملفات.
Working Tree وIndex وحالات الملفات
Index
Index هو اللقطة التي يقترحها Git للالتزام التالي. ويُسمى عادة staging area.
عندما يُوضع ملف في staging، يسجل Git محتواه الحالي داخل index.
Staging Area
Staging area هي طبقة التحضير بين working tree والالتزام التالي.
المسار الأساسي هو:
Working Tree
|
| git add
v
Staging Area / Index
|
| git commit
v
Repository History
Stage
وضع تغيير في staging يعني وضع محتواه الحالي داخل index حتى يمكن تضمينه في الالتزام التالي.
git add app.php
وضع الملف في staging لا ينشئ التزامًا.
Tracked File
الملف tracked هو ملف يعرفه Git من خلال index أو سجل المستودع.
يمكن أن يكون الملف tracked:
غير متغير.
Modified.
Staged.
محذوفًا.
Untracked File
الملف untracked موجود في working tree لكنه لم يُضف إلى index ولم يُسجل.
يعرضه status المختصر هكذا:
?? filename.txt
Modified File
الملف modified هو ملف tracked يختلف محتواه في working tree عن النسخة الموجودة في index.
Staged File
الملف staged يملك محتوى في index يختلف عن الالتزام الحالي.
وهو جاهز للتضمين في الالتزام التالي.
Committed File
Committed تعني أن نسخة محددة من الملف سُجلت في سجل المستودع.
يمكن تعديل الملف نفسه لاحقًا بينما تبقى النسخة المسجلة محفوظة.
Ignored File
الملف ignored هو path غير tracked يطابق قاعدة تجاهل.
قد تأتي قواعد التجاهل من:
ملف
.gitignoreداخل المستودع.ملفات تجاهل متداخلة.
ملف excludes عام.
إعداد استثناء خاص بالمستودع.
.gitignore
يعرّف ملف .gitignore أنماط الملفات غير tracked التي ينبغي لـGit تجاهلها عادة.
مثال:
.env
*.log
node_modules/
vendor/
dist/
ولا يوقف تتبع الملفات التي سبق تسجيلها.
.gitattributes
يعرّف ملف .gitattributes السلوك على مستوى المستودع للمسارات المطابقة.
يمكنه التحكم في:
تصنيف النصوص والملفات الثنائية.
نهايات الأسطر.
Diff drivers.
Merge drivers.
سلوك التصدير.
أنماط Git LFS.
Pathspec
Pathspec يخبر Git بالمسارات التي ينبغي أن يعمل عليها الأمر.
أمثلة:
git add src/
git log -- README.md
git diff -- "*.php"
قد يدعم pathspec أنماطًا وصياغة خاصة تتجاوز مسارات shell العادية.
Hunk
Hunk هو قسم من الأسطر المتغيرة المترابطة يظهر داخل diff.
يسمح staging التفاعلي باختيار hunks منفردة:
git add -p
Partial Staging
Partial staging يعني وضع بعض تغييرات الملف فقط في staging بدل نسخته كاملة داخل working tree.
يفيد ذلك عندما يحتوي ملف واحد على عدة تغييرات منطقية.
Clean Working Tree
تكون working tree نظيفة عندما لا تحتوي ملفات العمل وindex على تغييرات قابلة للتقرير مقارنة بالالتزام الحالي.
الحالة المعتادة:
nothing to commit, working tree clean
Dirty Working Tree
تحتوي working tree غير النظيفة على ملفات modified أوstaged أومحذوفة أوملفات untracked ذات صلة.
لا تعني كلمة dirty أن المستودع تالف، بل تعني فقط أن الحالة الحالية تختلف عن اللقطة المسجلة الحالية.
الالتزامات وسجل المشروع
Commit
الالتزام هو نقطة مسجلة في سجل Git. ويحتوي على مرجع إلى لقطة المشروع، وبيانات وصفية، ورسالة، وعلاقة أب واحدة أو أكثر.
أنشئ واحدًا باستخدام:
git commit -m "إضافة التحقق من بحث المهام"
Commit Object
كائن الالتزام هو كائن Git الداخلي الذي يمثل الالتزام.
ويحتوي على:
مرجع إلى tree.
مراجع إلى parent commits.
معلومات author.
معلومات committer.
رسالة الالتزام.
Commit Hash
Commit hash هو معرّف الكائن المستخدم لتحديد الالتزام.
قد يظهر كاملًا أو مختصرًا:
8f31d97
يعتمد المعرّف الدقيق على صيغة كائنات المستودع ومحتوى الالتزام.
Object ID
Object ID يحدد كائن Git مثل commit أوtree أوblob أوannotated tag.
وغالبًا ما يُختصر إلى OID.
Snapshot
اللقطة هي الحالة الكاملة للمشروع التي يمثلها التزام.
يخزن Git المحتوى بكفاءة، لذلك يمكن إعادة استخدام البيانات غير المتغيرة بدل تكرارها بلا حاجة.
Parent Commit
Parent commit هو التزام سابق يشير إليه التزام آخر.
يملك الالتزام العادي عادة parent واحدًا. ولا يملك الالتزام الأول parent. ويمكن لـmerge commit أن يملك parentين أو أكثر.
Root Commit
Root commit هو التزام من دون parent. ويبدأ خطًا من السجل.
يملك المستودع العادي غالبًا root commit واحدًا، مع أن السجلات غير المعتادة قد تحتوي على أكثر من واحد.
Merge Commit
Merge commit هو التزام يملك عدة parents، ويُنشأ عادة عند دمج سجلات متباعدة.
يسجل كلًا من اللقطة المدمجة والعلاقة بين السجلات.
Author
Author هو الشخص الذي أنشأ التغيير الذي يمثله الالتزام في الأصل.
Committer
Committer هو الشخص الذي سجل الشكل الحالي للالتزام داخل السجل.
غالبًا ما يكون author وcommitter الشخص نفسه، لكنهما قد يختلفان بعد تطبيق patch أوcherry-pick أوrebase.
Commit Message
رسالة الالتزام تشرح الغرض من الالتزام وسياقه.
وتحتوي عادة على:
عنوان مختصر.
نص توضيحي اختياري.
Trailers منظمة اختيارية.
Trailer
Trailer هي بيانات وصفية منظمة توضع قرب نهاية رسالة الالتزام.
أمثلة:
Signed-off-by: Jane Developer <jane@example.com>
Reviewed-by: Alex Maintainer <alex@example.com>
Fixes: #142
Revision
Revision هو اسم أو تعبير يشير إلى التزام أو مجموعة التزامات، بحسب الأمر.
أمثلة:
HEAD
main
v1.0.0
HEAD~2
main..feature/search
History
سجل Git هو الرسم البياني للالتزامات وعلاقات parent بينها.
افحصه باستخدام:
git log --oneline --graph --decorate --all
Reachable Commit
يكون الالتزام reachable من مرجع عندما يستطيع Git اتباع روابط parent من ذلك المرجع حتى الوصول إلى الالتزام.
تحدد reachability الالتزامات التي تظهر في كثير من عمليات log وrange.
Unreachable Commit
الالتزام unreachable هو التزام لا يمكن الوصول إليه من مراجع عادية مثل الفروع أو العلامات.
قد يبقى موجودًا مؤقتًا، ويمكن أحيانًا العثور عليه من خلال reflogs أوفحص الكائنات قبل أن يزيله التنظيف.
Commit Graph
Commit graph هو بنية السجل الموجهة التي تتكون من الالتزامات وعلاقات parent بينها.
ولا تحدده الطوابع الزمنية وحدها.
First Parent
First parent هو parent الأساسي المسجل أولًا داخل الالتزام.
بالنسبة إلى merge commit، يتبع سجل first-parent عادة الفرع الذي استقبل عملية الدمج.
git log --first-parent
Ancestor
يكون الالتزام ancestor لالتزام آخر عندما يمكن الوصول إليه باتباع روابط parent إلى الخلف من الالتزام الأحدث.
Descendant
يكون الالتزام descendant لالتزام آخر عندما يمكن الوصول إلى الالتزام الأقدم منه عبر علاقات parent.
المراجع والفروع وHEAD
Reference
Reference، ويُختصر غالبًا إلى ref، هو اسم يشير إلى object ID.
الفروع والعلامات من المراجع الشائعة.
Ref
Ref هو الاختصار الشائع لكلمة reference.
أمثلة على أسماء المراجع الكاملة:
refs/heads/main
refs/tags/v1.0.0
refs/remotes/origin/main
Branch
الفرع هو مرجع متحرك يُستخدم لتحديد خط تطوير.
عندما يُنشأ التزام على الفرع الحالي، يتحرك الفرع عادة إلى الالتزام الجديد.
Local Branch
الفرع المحلي هو فرع داخل المستودع المحلي يمكن تنفيذ checkout له وتحديثه بواسطة التزامات محلية.
أمثلة:
main
feature/task-search
fix/payment-timeout
Remote-Tracking Branch
Remote-tracking branch يسجل أحدث حالة معروفة لدى المستودع المحلي لفرع داخل مستودع بعيد.
مثال:
origin/main
تحدثه عمليات fetch، لا الالتزامات المحلية العادية.
Default Branch
الفرع الافتراضي هو الفرع الذي تختاره منصة استضافة المستودع أو عملية clone افتراضيًا.
يُسمى غالبًا main، لكن الاسم قابل للإعداد.
Feature Branch
Feature branch هو فرع مؤقت يُستخدم لتطوير ميزة واحدة أو تغيير منطقي واحد.
يُراجع عادة ويُدمج ثم يُحذف بعد التكامل.
Release Branch
Release branch يُستخدم لإعداد خط إصدار أو صيانته.
يعتمد دوره الدقيق على مسار عمل المشروع. وقد يكون مؤقتًا للاستقرار أو طويل العمر للنسخ المدعومة.
Hotfix Branch
Hotfix branch يُستخدم لإجراء إصلاح عاجل انطلاقًا من خط الشيفرة الموجود في الإنتاج أو النسخة المنشورة.
Topic Branch
Topic branch هو مصطلح عام لفرع قصير العمر يحتوي على تغيير مفاهيمي واحد، مثل ميزة أوإصلاح أوتجربة.
HEAD
HEAD يحدد الموقع الذي جرى checkout له حاليًا.
ويشير عادة بصورة رمزية إلى الفرع الحالي:
HEAD -> main -> commit
Symbolic Reference
Symbolic reference يشير إلى مرجع آخر بدل الإشارة مباشرة إلى object ID.
يعمل HEAD عادة بوصفه symbolic reference للفرع الحالي.
Detached HEAD
Detached HEAD تعني أن HEAD يشير مباشرة إلى التزام بدل فرع.
يفيد ذلك لفحص النسخ التاريخية، لكن ينبغي حفظ الالتزامات الجديدة بإنشاء فرع.
git switch --detach v1.0.0
git switch -c support/1.0
Branch Tip
Branch tip هو الالتزام الذي يشير إليه الفرع حاليًا.
Upstream Branch
Upstream branch هو فرع جرى إعداده بوصفه الفرع المرتبط بفرع محلي.
ويدعم تقارير ahead/behind والقيم الافتراضية لأوامر المزامنة.
Tracking Branch
Tracking branch هو فرع محلي جرى إعداد upstream branch له.
لا تخلطه مع remote-tracking branch.
Ahead
يكون الفرع المحلي ahead من upstream عندما يملك التزامات لا يحتوي عليها upstream.
Behind
يكون الفرع المحلي behind عن upstream عندما يملك upstream التزامات غير موجودة محليًا.
Diverged
تكون الفروع diverged عندما يحتوي كل طرف على التزامات لا يحتوي عليها الطرف الآخر.
صياغة Revision واختيار الالتزامات
HEAD^
يشير HEAD^ عادة إلى first parent الخاص بـHEAD.
بالنسبة إلى merge commit:
HEAD^1
HEAD^2
يختاران parents مختلفين.
HEAD~n
يتبع HEAD~n علاقة first-parent عدد n من المرات.
HEAD~3
تعني ثلاث خطوات first-parent قبل HEAD.
Two-Dot Range
بالنسبة إلى أوامر تتبع revisions، يختار A..B عادة الالتزامات reachable من B وليست reachable من A.
git log main..feature/search
Three-Dot Range
بالنسبة إلى git log، يختار A...B الالتزامات reachable من أحد الطرفين دون كليهما.
وبالنسبة إلى git diff، تقارن صياغة النقاط الثلاث merge base مع revision الموجود على اليمين.
Merge Base
Merge base هو أفضل ancestor مشترك بين التزامين.
git merge-base main feature/search
يُستخدم غالبًا لتحديد المكان الذي تباعدت عنده الفروع.
Peeling a Tag
Peeling يعني اتباع كائن annotated tag حتى الكائن الذي يشير إليه.
git rev-parse v1.0.0^{}
git rev-parse v1.0.0^{commit}
Reflog Selector
Reflog selector يشير إلى موقع سابق مسجل لمرجع.
HEAD@{1}
main@{yesterday}
تعتمد إتاحته على سجل reflog المحلي.
المستودعات البعيدة والمزامنة
Remote
Remote هو اسم وURL جرى إعدادهما لتمثيل مستودع آخر.
اعرض remotes:
git remote -v
origin
origin هو الاسم الافتراضي التقليدي الذي يُعطى للمستودع الذي جرى clone منه.
وليس نوعًا خاصًا من الخوادم، ويمكن إعادة تسميته.
upstream
upstream هو اسم remote شائع للمستودع الرسمي عندما يشير origin إلى fork شخصي.
إنه اتفاق تسمية، لا متطلبًا مدمجًا.
Remote URL
يخبر Remote URL برنامج Git بكيفية الاتصال بمستودع آخر.
تشمل الصيغ الشائعة:
https://example.com/team/project.git
git@example.com:team/project.git
ssh://git@example.com/team/project.git
Fetch
ينزّل fetch الكائنات ويحدث remote-tracking references من دون دمجها تلقائيًا في الفرع الحالي.
git fetch origin
Pull
ينفذ pull عملية fetch للتغييرات البعيدة ثم يدمجها وفق الإعدادات والخيارات.
قد يستخدم الدمج merge أوrebase أوسلوك fast-forward-only.
git pull --ff-only
Push
يرسل push الكائنات ويحدث المراجع داخل المستودع البعيد.
git push origin main
قد يُرفض push عندما يؤدي إلى الكتابة فوق سجل بعيد أحدث.
Refspec
Refspec يصف كيفية مطابقة المراجع بين المستودعات المحلية والبعيدة.
مثال:
refs/heads/main:refs/heads/main
تستخدم عمليات fetch وpush refspecs.
Fast-Forward Push
يكون push من نوع fast-forward عندما تكون قمة الفرع البعيد الجديدة descendant لقمة الفرع البعيد الحالية.
لا تُزال التزامات بعيدة من سجل الفرع.
Non-Fast-Forward Push
Non-fast-forward push سيستبدل قمة الفرع البعيد بالتزام لا يحتوي على القمة الحالية.
يُرفض عادة ما لم يُستخدم force.
Force Push
يحدث force push مرجعًا بعيدًا حتى عندما تفشل حماية fast-forward المعتادة.
git push --force
وقد يكتب فوق سجل مشترك.
Force with Lease
ينفذ --force-with-lease تحديث force فقط عندما يبقى المرجع البعيد مطابقًا للحالة التي يتوقعها المستودع المحلي.
git push --force-with-lease
هو أكثر أمانًا من force push العشوائي، لكنه ما يزال يعيد كتابة السجل البعيد.
Prune
تزيل عملية pruning مراجع remote-tracking القديمة التي لم تعد فروعها المقابلة موجودة على remote.
git fetch --prune
Fork
Fork هو نسخة على الخادم من مستودع تحت حساب أوnamespace آخر، وتُنشأ عادة عبر منصة الاستضافة.
تُستخدم غالبًا للمساهمات الخارجية.
Mirror
Mirror هو مستودع هدفه إعادة إنتاج مراجع مستودع آخر بصورة شاملة.
عمليات mirror clone وpush أوسع من مزامنة الفروع العادية.
الدمج والتكامل
Merge
تجمع عملية merge سجلات التطوير داخل الفرع الحالي.
git switch main
git merge feature/search
Fast-Forward Merge
تحدث fast-forward merge عندما يستطيع الفرع الحالي الانتقال مباشرة إلى قمة الفرع الآخر، لأنه لا توجد التزامات متباعدة على الفرع الحالي تحتاج إلى الدمج.
Three-Way Merge
تجمع three-way merge بين:
قمة الفرع الحالي.
قمة الفرع الآخر.
Merge base المشترك بينهما.
وتنشئ عادة merge commit عندما تكون السجلات متباعدة.
Merge Conflict
يحدث merge conflict عندما لا يستطيع Git تحديد نتيجة مدمجة آمنة تلقائيًا.
يجب على المطورين تحديد المحتوى المقصود ثم وضع النتيجة في staging.
Conflict Marker
تحدد conflict markers أقسام النص المتنافسة:
<<<<<<< HEAD
محتوى الفرع الحالي
=======
محتوى الفرع القادم
>>>>>>> feature/search
ويجب إزالتها أثناء حل التعارض.
Ours
أثناء merge عادية، تعني ours جانب الفرع الحالي.
Theirs
أثناء merge عادية، تعني theirs جانب الفرع الذي يجري دمجه.
قد يكون المنظور أقل وضوحًا في عمليات rebase، لذلك افحص دائمًا العملية الحالية.
Merge Strategy
Merge strategy هي الخوارزمية عالية المستوى التي يستخدمها Git لدمج السجلات.
يمكن اختيارها باستخدام:
git merge -s <strategy>
Strategy Option
Strategy option تعدّل السلوك داخل merge strategy محددة.
git merge -Xours feature/search
الخيار -Xours ليس هو نفسه استراتيجية الدمج المنفصلة ours.
Octopus Merge
Octopus merge تجمع أكثر من headين داخل merge commit واحد.
وتُستخدم عادة للموضوعات المستقلة التي لا تتعارض.
Squash Merge
تجمع squash merge صافي تغييرات فرع داخل التزام جديد واحد على الفرع الهدف.
ولا تحافظ على علاقة parent الأصلية لفرع الميزة كما تفعل merge commit العادية.
Rebase
تعيد rebase تشغيل الالتزامات فوق base جديدة، ما ينشئ التزامات بديلة.
git rebase main
قد تنشئ سجلًا خطيًا، لكنها تعيد كتابة معرّفات الالتزامات.
Interactive Rebase
تسمح interactive rebase بإعادة ترتيب الالتزامات المحددة أو تعديلها أو دمجها أو تغيير رسائلها أو حذفها.
git rebase -i HEAD~5
Squash
Squash للالتزامات يعني دمج عدة التزامات في التزام واحد.
قد يحدث ذلك من خلال interactive rebase أوsquash merge على منصة الاستضافة.
Fixup Commit
Fixup commit هو التزام أُنشئ ليُدمج تلقائيًا مع التزام سابق أثناء autosquash rebase.
git commit --fixup=<commit>
Autosquash
تعيد autosquash ترتيب التزامات fixup! وsquash! المعروفة بجانب أهدافها أثناء interactive rebase.
git rebase -i --autosquash main
Cherry-Pick
تطبق cherry-pick التغيير الذي قدمه التزام موجود على الفرع الحالي بوصفه التزامًا جديدًا.
git cherry-pick abc1234
تُستخدم غالبًا في backports والإصلاحات المحددة.
Backport
Backport تطبق إصلاحًا أو ميزة أحدث على خط إصدار أقدم ما يزال قيد الصيانة.
تُستخدم cherry-pick غالبًا، ثم تُختبر النتيجة على البيئة الأقدم.
Revert
تنشئ revert التزامًا جديدًا يعكس التغييرات التي قدمها التزام آخر.
git revert abc1234
وهي مناسبة للتراجع عن سجل مشترك من دون حذف الالتزام الأصلي.
التراجع والاستعادة والعمل المؤقت
Restore
يحدّث git restore محتوى working tree أوindex من مصدر آخر.
أمثلة:
git restore file.txt
git restore --staged file.txt
قد يحذف الأمر الأول العمل غير الموجود في staging. أما الثاني فيلغي staging للتغييرات مع الاحتفاظ بملف العمل.
Reset
تنقل reset مرجع الفرع، وقد تحدث أيضًا index وworking tree بحسب الوضع.
Soft Reset
تنقل soft reset الفرع مع الحفاظ على محتوى index وworking tree.
git reset --soft HEAD~1
Mixed Reset
تنقل mixed reset الفرع وتعيد ضبط index مع الحفاظ على تغييرات working tree.
وهي وضع reset الافتراضي.
Hard Reset
تنقل hard reset الفرع وتعيد ضبط كل من index وworking tree.
git reset --hard HEAD~1
وقد تدمر العمل غير المسجل.
Stash
تخزن stash التغييرات المحلية المحددة مؤقتًا، وتعيد عادة حالة عمل أنظف.
git stash push -m "WIP: بحث المهام"
Stash Entry
Stash entry هي حالة stash واحدة محفوظة يجري تحديدها عبر stash reflog:
stash@{0}
Apply
تطبيق stash يعيد تغييراتها مع الاحتفاظ بـstash entry.
git stash apply
Pop
تنفذ pop للـstash تطبيقها ثم تحذفها بعد نجاح العملية.
git stash pop
Drop
تنفيذ drop للـstash يزيل stash entry واحدة.
git stash drop stash@{1}
Clear
تنفيذ clear للـstashes يزيل جميع stash entries.
git stash clear
Reflog
يسجل reflog التحديثات المحلية للمراجع مثل HEAD وقمم الفروع.
git reflog
ويمكنه المساعدة في استعادة الالتزامات بعد reset أوrebase أوamend أوحذف فرع أوعمل detached.
Recovery Branch
Recovery branch هو فرع جديد يُنشأ لحفظ التزام عُثر عليه من خلال reflog أوفحص الكائنات.
git branch recovery HEAD@{2}
Clean
يزيل git clean الملفات untracked.
اعرض معاينة أولًا:
git clean -nd
احذف الملفات والمجلدات untracked:
git clean -fd
قد يحذف ذلك نهائيًا ملفات محلية غير محفوظة في مكان آخر.
Amend
يستبدل amend أحدث التزام بالتزام جديد يحتوي على محتوى أوبيانات وصفية محدثة.
git commit --amend
يتغير معرّف الالتزام.
العلامات والإصدارات والتحقق
Tag
العلامة هي مرجع يُستخدم لمنح اسم ثابت لكائن، وعادة يكون التزامًا.
تُستخدم العلامات غالبًا لتحديد الإصدارات والمحطات المهمة.
Lightweight Tag
تشير lightweight tag مباشرة إلى كائن.
git tag v1.0.0
ولا تملك رسالة tag منفصلة أوبيانات tagger وصفية.
Annotated Tag
تنشئ annotated tag كائن tag يحتوي على tagger وتاريخ ورسالة وتوقيع اختياري.
git tag -a v1.0.0 -m "إصدار النسخة 1.0.0"
Signed Tag
Signed tag هي annotated tag تحمل توقيعًا تشفيريًا.
git tag -s v1.0.0 -m "إصدار النسخة 1.0.0"
Release Tag
Release tag هي اتفاق في المشروع يستخدم tag لتحديد التزام جرى إصداره.
ولا يفرض Git معنى أرقام النسخ.
Semantic Versioning
Semantic Versioning هي قاعدة لتسمية الإصدارات مبنية على:
MAJOR.MINOR.PATCH
وتُستخدم كثيرًا في أسماء العلامات مثل v2.4.1، لكنها ليست مدمجة داخل Git.
Describe
ينشئ git describe اسمًا سهل القراءة لالتزام اعتمادًا على علامة قريبة.
git describe --tags --always
Verification
تتحقق verification من توقيع أوعلاقة بين كائنات.
أمثلة:
git verify-tag v1.0.0
git verify-commit abc1234
Signed Commit
يحتوي signed commit على توقيع تشفيري مرتبط بكائن الالتزام.
Sign-Off
Sign-off هي trailer نصية من نوع Signed-off-by تُضاف إلى رسالة الالتزام.
git commit --signoff
وليست هي نفسها التوقيع التشفيري.
مصطلحات التعاون ومنصات الاستضافة
Pull Request
Pull request هي ميزة تعاون في منصة الاستضافة تقترح مراجعة التغييرات ودمجها داخل فرع آخر.
وليست كائن Git أصليًا.
Merge Request
Merge request هو المصطلح الشائع في GitLab لاقتراح المراجعة والدمج. وهو مشابه مفاهيميًا لـpull request.
Code Review
مراجعة الشيفرة هي عملية فحص التغييرات المقترحة ومناقشتها قبل الدمج.
وقد تشمل:
تعليقات داخل الأسطر.
ملاحظات على التصميم.
مراجعة الاختبارات.
تحليل الأمان.
قرارات الموافقة.
Reviewer
Reviewer هو شخص يُطلب منه تقييم التغييرات المقترحة.
Approval
Approval هي حالة مراجعة في منصة الاستضافة تشير إلى أن reviewer يقبل التغيير المقترح وفق سياسة المشروع.
Draft Pull Request
تعرض draft pull request العمل للنقاش وتشغيل CI قبل أن يصبح جاهزًا للدمج.
Protected Branch
Protected branch هو فرع تتحكم به قواعد منصة الاستضافة، وقد تقيّد عمليات الدفع المباشر وforce push والحذف والدمج.
Required Check
Required check هي نتيجة آلية يجب أن تنجح قبل الدمج.
Status Check
Status check تعرض نتيجة تحقق آلي مرتبط بالتزام أوpull request.
CI
Continuous Integration تتحقق تلقائيًا من التغييرات التي يجري دمجها باستمرار من خلال build والاختبارات والتحليل والفحوص المرتبطة.
CD
قد تعني CD Continuous Delivery أوContinuous Deployment.
Continuous Delivery: يبقى البرنامج جاهزًا للإصدار، وقد يحتاج النشر إلى موافقة.
Continuous Deployment: تُنشر التغييرات المقبولة تلقائيًا.
Pipeline
Pipeline هي سلسلة آلية من الوظائف مثل الاختبار والبناء والتغليف والفحص والنشر.
Workflow
Git workflow هي عملية الفريق الخاصة بالفروع والالتزامات والمراجعة والدمج والإصدارات والصيانة.
أما workflow الخاصة بأتمتة المنصة فهي عملية آلية مُعدة. ويحدد السياق المعنى المقصود.
GitHub Flow
GitHub Flow هو مسار عمل خفيف يعتمد على فرع افتراضي محمي، وفروع قصيرة العمر، وpull requests، والمراجعة، والفحوص، والدمج المتكرر.
Git Flow
Git Flow هو نموذج فروع موجه للإصدارات يستخدم فرعي main وdevelop طويلَي العمر، إلى جانب فروع الميزات والإصدارات والإصلاحات العاجلة.
Trunk-Based Development
يركز trunk-based development على الدمج المتكرر داخل فرع رئيسي واحد، وغالبًا باستخدام فروع قصيرة جدًا وfeature flags.
Forking Workflow
يمنح Forking Workflow كل مساهم fork شخصيًا على الخادم ويستخدم pull requests باتجاه المستودع الرسمي.
CODEOWNERS
CODEOWNERS هي قاعدة في منصة الاستضافة تحدد مسؤولية المراجعة لمسارات مختارة.
وليست جزءًا من سلوك Git الأساسي.
مصطلحات Diff والفحص وتصحيح الأخطاء
Diff
Diff يصف الفروقات بين حالتين.
أمثلة:
git diff
git diff --staged
git diff v1.0.0 v1.1.0
Patch
Patch هو تمثيل نصي للتغييرات يمكن مراجعته أو تطبيقه.
Unified Diff
Unified diff هو تنسيق patch شائع يعرض أسطر السياق والإضافات أو الحذف.
تبدأ الإضافات بالرمز +، وتبدأ الأسطر المحذوفة بالرمز -.
Context Line
Context line هو سطر غير متغير يظهر حول الأسطر المتغيرة لجعل patch مفهومة وقابلة للتطبيق.
Blame
يضيف git blame إلى الأسطر معلومات الالتزامات التي غيرتها آخر مرة.
git blame app.php
ينبغي استخدامه لفهم السياق، لا لإلقاء اللوم الشخصي.
Pickaxe Search
Pickaxe search تبحث عن الالتزامات اعتمادًا على تغييرات المحتوى.
التغييرات في عدد ظهور نص دقيق:
git log -S"functionName" -p
الأسطر المتغيرة المطابقة لتعبير منتظم:
git log -G"function.*Name" -p
Bisect
ينفذ git bisect بحثًا ثنائيًا عبر الالتزامات لتحديد أول التزام أصبح عنده السلوك سيئًا.
Good Commit
أثناء bisect، يكون good commit التزامًا معروفًا بأنه لا يحتوي على المشكلة.
Bad Commit
أثناء bisect، يكون bad commit التزامًا معروفًا بأنه يحتوي على المشكلة.
Shortlog
يلخص git shortlog الالتزامات مجمعة بحسب author.
Mailmap
يربط ملف .mailmap الأسماء وعناوين البريد البديلة بهويات موحدة للمساهمين لأغراض التقارير.
Range-Diff
يقارن git range-diff نسختين من سلسلة التزامات.
ويفيد في مراجعة كيفية تغير سلسلة patches بعد rebase أوإصدار مراجعة جديد.
البنية الداخلية لـGit
Object Database
تخزن object database كائنات Git التي يجري الوصول إليها عبر object IDs.
أنواع الكائنات الشائعة:
Blob.
Tree.
Commit.
Tag.
Blob
يخزن كائن blob محتوى الملف.
ولا يخزن اسم الملف بذاته. ترتبط أسماء الملفات من خلال كائنات tree.
Tree
يمثل كائن tree لقطة شبيهة بالمجلد تربط الأسماء بـblobs أوtrees أخرى.
Tag Object
يخزن كائن tag البيانات الوصفية لـannotated tag ويشير إلى كائن آخر.
Content-Addressable Storage
يخزن Git الكائنات باستخدام معرّفات مشتقة من محتواها وتمثيل بياناتها الوصفية.
عندما يتغير الكائن يتغير معرّفه.
Plumbing Command
يكشف plumbing command عمليات Git منخفضة المستوى والمخصصة للسكربتات والأدوات ومسارات العمل الداخلية.
أمثلة:
git cat-file
git hash-object
git update-index
git write-tree
git commit-tree
Porcelain Command
يوفر porcelain command واجهة أعلى مستوى موجهة للمستخدم.
أمثلة:
git add
git commit
git switch
git merge
git status
Packfile
يخزن packfile عددًا كبيرًا من كائنات Git بصيغة مضغوطة لتحسين الكفاءة.
Loose Object
Loose object هو كائن مخزن بصورة منفردة بدل وجوده داخل packfile.
Garbage Collection
تحسن garbage collection تخزين المستودع، وقد تزيل في النهاية الكائنات unreachable.
git gc
Prune
في صيانة الكائنات، قد تعني prune إزالة الكائنات unreachable التي أصبحت قديمة بما يكفي وفق السياسة.
وهذا يختلف عن إزالة مراجع remote-tracking القديمة.
Index Entry
يسجل index entry معلومات staged مرتبطة بالمسار، ومنها mode وobject ID ورقم stage.
Index Stage
أثناء التعارض، قد يحتوي index على عدة stages:
Stage 1: Merge base.
Stage 2: Ours.
Stage 3: Theirs.
Hooks
Hooks هي برامج يجري استدعاؤها عند نقاط محددة من عمليات Git.
أمثلة:
pre-commit.commit-msg.pre-push.post-merge.
Worktree
Git worktree هي working tree إضافية مرتبطة ببيانات المستودع نفسها.
git worktree add ../project-hotfix hotfix/login
وتسمح بتنفيذ checkout لعدة فروع في مجلدات منفصلة من دون إنشاء clones كاملة مستقلة.
Submodule
يسجل submodule مستودع Git آخر عند التزام محدد داخل مستودع أب.
يفيد عندما يجب أن تبقى المشاريع مستقلة في الإصدارات، لكنه يضيف تعقيدًا إلى المزامنة وتهيئة المساهمين الجدد.
Superproject
Superproject هو مستودع يحتوي على submodule واحد أو أكثر.
Shallow Clone
Shallow clone يحتوي على سجل محدود، ويُنشأ عادة باستخدام:
git clone --depth=1 URL
تكون بعض عمليات السجل محدودة حتى يجري fetch لمزيد من السجل.
Partial Clone
Partial clone يستبعد بعض محتوى الكائنات في البداية، ثم يجلبه عند الحاجة.
ويفيد للمستودعات الكبيرة.
Sparse Checkout
Sparse checkout تحد من المسارات tracked التي تظهر في working tree.
وقد يظل المستودع يعرف المسارات التي لم يجر checkout لها حاليًا.
Git LFS
Git Large File Storage هي إضافة تخزن ملفات pointer صغيرة داخل Git، بينما تخزن المحتوى الكبير بصورة منفصلة.
تفيد للملفات الثنائية الكبيرة، لكنها تحتاج إلى دعم من الخادم والعميل.
مصطلحات سطر الأوامر والإعدادات
Option
Option يغير سلوك الأمر.
أمثلة:
--staged
--oneline
--all
-p
Argument
Argument هو قيمة تُمرر إلى أمر، مثل فرع أوالتزام أوremote أومسار.
git show v1.0.0
v1.0.0 هو argument.
Double Dash
تُستخدم -- غالبًا للفصل بين الخيارات أوrevisions والمسارات.
git log -- README.md
git diff HEAD~1 HEAD -- src/
Configuration Scope
يمكن أن توجد إعدادات Git ضمن عدة scopes:
System.
Global.
Local repository.
Worktree.
استدعاء الأمر.
تتجاوز الإعدادات الأكثر تحديدًا القابلة للتطبيق عادة الإعدادات الأوسع.
Global Configuration
توفر global configuration القيم الافتراضية لمستخدم نظام التشغيل الحالي.
git config --global user.name "Jane Developer"
Local Configuration
تطبق local configuration على مستودع واحد، وتُخزن عادة داخل .git/config.
Alias
Alias ينشئ اسمًا أقصر لأمر Git أو سلسلة أوامر.
git config --global alias.lg "log --graph --decorate --oneline --all"
Credential Helper
Credential helper يخزن أو يسترجع أو يخزن مؤقتًا أو يدير بيانات اعتماد المصادقة الخاصة بعمليات Git البعيدة.
إعدادات هوية الالتزام ليست بيانات اعتماد للمصادقة.
Pager
Pager يعرض المخرجات الطويلة شاشة واحدة في كل مرة.
تستخدم أوامر مثل git log واحدًا عادة.
اضغط q للخروج في بيئات pager الشائعة.
Diff Driver
Diff driver يخصص كيفية مقارنة Git لأنواع ملفات محددة.
Merge Driver
Merge driver يخصص كيفية دمج مسارات محددة.
Clean Filter
Clean filter يحول المحتوى عندما يدخل إلى مخزن كائنات Git عبر index.
Smudge Filter
Smudge filter يحول المحتوى عندما يُكتب داخل working tree.
تستخدم Git LFS آليات filters جزءًا من عملها.
مصطلحات Git التي يكثر الخلط بينها
Git وGitHub
Git هو نظام التحكم بالإصدارات. أما GitHub فهو منصة استضافة وتعاون مبنية حول مستودعات Git.
Stage وCommit
Stage تجهز المحتوى داخل index. أما commit فتسجل اللقطة الموجودة في staging داخل السجل.
Fetch وPull
Fetch تنزّل معلومات remote من دون دمجها. أما pull فتنفذ fetch ثم تدمج وفق السلوك المحدد.
Pull وPush
Pull تجلب التغييرات البعيدة إلى المستودع المحلي. أما push فترسل التغييرات المحلية إلى مستودع بعيد.
Branch وTag
يتحرك branch عند إنشاء التزامات جديدة. أما tag فتبقى عادة ثابتة عند كائن واحد.
Local Branch وRemote-Tracking Branch
يُستخدم local branch للتطوير المحلي. أما remote-tracking branch فتسجل آخر حالة جرى fetch لها لفرع بعيد.
Upstream Branch وupstream Remote
Upstream branch هي إعداد tracking لفرع محلي. أما remote باسم upstream فهو اتفاق تسمية شائع في مسارات fork.
Merge وRebase
تجمع merge السجلات الموجودة وقد تنشئ التزامًا متعدد parents. أما rebase فتعيد تشغيل الالتزامات وتنشئ بدائل لها.
Revert وReset
تنشئ revert التزام تراجع جديدًا. أما reset فتنقل الفرع وقد تغير index وworking tree.
Restore وReset
تركز restore على محتوى الملفات داخل working tree أوindex. أما reset فيمكنها نقل المراجع وتحديث طبقات المستودع.
Apply وPop
Stash apply تعيد التغييرات وتحتفظ بالـstash. أما pop فتعيدها وتحذفها بعد نجاح العملية.
Sign-Off وSignature
Sign-off هي trailer داخل الرسالة. أما signature فهي بيانات تشفيرية مرتبطة بالتزام أوannotated tag.
Commit Hash وBranch Name
Commit hash يحدد كائنًا واحدًا. أما اسم الفرع فهو مرجع متحرك يمكن أن يشير إلى التزامات مختلفة مع مرور الوقت.
Working Tree وRepository
Working tree هي الملفات الظاهرة التي جرى checkout لها. أما repository فتشمل سجل Git والكائنات والمراجع.
Ignored وUntracked
الملفات ignored هي مسارات untracked تطابق قواعد التجاهل. وليس كل ملف untracked ملفًا ignored.
Merge Conflict وFailed Merge
يعني conflict أن Git يحتاج إلى قرار بشري لمسارات محددة. ويمكن متابعة عملية merge بعد الحل أو إلغاؤها.
مثال عملي على مفردات Git
تأمل مسار العمل التالي:
git clone https://example.com/team/project.git
git switch -c feature/task-search
# عدّل الملفات
git status
git add -p
git commit -m "إضافة مطابقة الكلمات المفتاحية للمهام"
git fetch origin
git rebase origin/main
git push -u origin feature/task-search
المصطلحات هي:
Clone: تنشئ مستودعًا محليًا من مستودع بعيد.
Remote: المستودع الموجود على الخادم والمسمى
origin.Branch:
feature/task-searchمرجع محلي متحرك.Working tree: ملفات المشروع التي جرى تعديلها.
Status: تقرير عن المسارات tracked وuntracked وstaged وmodified.
Partial staging: يحدد
git add -pالـhunks.Commit: تسجل اللقطة الموجودة في staging.
Fetch: تحدث معلومات remote-tracking.
Rebase: تعيد تشغيل التزامات الميزة فوق base البعيدة المحدثة.
Push: تنشر الفرع المحلي.
Upstream: يضبط الخيار
-uعلاقة الفرع البعيد.
قائمة التحقق للمصطلحات الأساسية
ينبغي للمبتدئ أن يستطيع شرح:
Repository.
Working tree.
Index أوstaging area.
الملفات tracked وuntracked.
Commit.
Branch.
HEAD.Remote.
Fetch وpull وpush.
Merge وconflict.
Tag.
Stash.
Revert وreset.
وينبغي لمستخدم Git متوسط المستوى أن يفهم أيضًا:
Upstream branches.
Remote-tracking branches.
Revision ranges.
Merge bases.
Rebase وcherry-pick.
Reflog.
Annotated tags.
Force-with-lease.
Interactive staging وrebase.
وينبغي للمستخدم المتقدم أن يفهم:
أنواع الكائنات.
Reference namespaces.
Index stages.
Refspecs.
Reachability.
Plumbing commands.
Packfiles والصيانة.
Partial clone وsparse checkout.
Submodules وworktrees.
الأسئلة الشائعة
هل الالتزام هو نفسه نسخة ملف؟
لا. يمثل الالتزام لقطة للمشروع وبيانات وصفية، لا ملفًا واحدًا فقط.
هل الفرع نسخة من المشروع؟
لا. الفرع مرجع متحرك يشير إلى التزام. وتتغير working tree عند التبديل بين الفروع.
هل origin يعني GitHub دائمًا؟
لا. origin مجرد اسم تقليدي لـremote، ويمكن أن يشير إلى أي مستودع Git متوافق.
هل يرفع git add الملف؟
لا. يضع الملف في staging محليًا. ويتطلب رفع الكائنات المسجلة تنفيذ push.
هل تعني git pull التنزيل فقط؟
تنزّل عبر fetch ثم تنفذ خطوة دمج. استخدم git fetch عندما تريد التنزيل من دون دمج فوري.
هل HEAD هو أحدث التزام في المستودع كاملًا؟
لا. يحدد HEAD الموقع الذي جرى checkout له حاليًا. وقد يحتوي فرع آخر على التزامات أحدث أومختلفة.
هل معرّفات الالتزامات دائمة؟
يحافظ كائن الالتزام الموجود على معرّفه، لكن rebase وamend وcherry-pick تنشئ التزامات جديدة بمعرّفات جديدة.
هل حذف فرع يحذف التزاماته؟
يحذف مرجع الفرع. وتبقى الالتزامات ما دامت reachable من مراجع أخرى، وقد تبقى قابلة للاستعادة مؤقتًا عبر reflogs.
هل Pull Request جزء من Git؟
لا. إنها ميزة توفرها منصات استضافة المستودعات.
هل Tag هي نفسها Release؟
العلامة مرجع في Git. وقد يستخدمها المشروع لتحديد إصدار، بينما يمكن لمنصة الاستضافة إضافة ملاحظات الإصدار والملفات القابلة للتنزيل.
هل Reflog يُشارك مع Remote؟
لا. Reflogs محلية لكل clone من المستودع.
هل Merge Conflict خطأ في المستودع؟
لا. يعني فقط أن Git لا يستطيع اختيار المحتوى المدمج المقصود تلقائيًا.
لماذا توجد عدة مصطلحات لـStaging Area؟
Staging area هي الفكرة الموجهة للمستخدم. أما index فهو المصطلح التقني التقليدي. ويشير كلاهما عادة إلى اللقطة التالية المقترحة.
الخلاصة
تصف مصطلحات Git نموذجًا واحدًا مترابطًا. تحتوي working tree على الملفات الحالية، ويحتوي index على اللقطة التالية المقترحة، وتشكل الالتزامات سجل المستودع. تسمي الفروع والعلامات نقاطًا داخل هذا السجل، بينما يحدد HEAD الموقع الحالي.
تسمح remotes للمستودعات بتبادل الكائنات والمراجع من خلال fetch وpull وpush. وتغير merge وrebase وcherry-pick وrevert الطريقة التي ترتبط بها السجلات. وتساعد stash وreflog في إدارة العمل المؤقت واستعادة السجل المحلي. وتضيف منصات الاستضافة pull requests والمراجعات والحماية وCI/CD حول سلوك Git الأساسي.
أهم المصطلحات التي ينبغي إتقانها أولًا هي repository وworking tree وindex وcommit وbranch وHEAD وremote وmerge وtag. عندما تصبح هذه المفاهيم واضحة، تصير الأوامر المتقدمة أسهل لأنها مجرد عمليات مختلفة على الكائنات واللقطات والمراجع نفسها.
يكمل هذا القاموس سلسلة أساسيات Git. والخطوة الطبيعية التالية هي سلسلة مخصصة لـGitHub تغطي إنشاء المستودعات البعيدة، والمصادقة عبر HTTPS وSSH، وclone وpush وforks وpull requests وissues وreleases وحماية الفروع وصلاحيات الفرق وGitHub Actions.
المراجع الرسمية ومواد إضافية للقراءة

