قاموس 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.

المراجع الرسمية ومواد إضافية للقراءة