Git: شرح مفصل لمرحلة التجهيز في Git وتعدد المهام
تعد ميزة «الاستخزين المؤقت» (Stashing) ميزة تُحفظ بها التغييرات التي تُجرى على مساحة العمل مؤقتًا. عندما تحتاج إلى التبديل بين الفروع لتنفيذ مهمة عاجلة، ولكنك لا ترغب في إجراء «التثبيت» (commit) للعمل غير المكتمل، فإن «الاستخزين المؤقت» هو الخيار الأفضل. ويُعد فهم كيفية استخدام ميزة «الاستخزين المؤقت» أمرًا بالغ الأهمية للقيام بمهام متعددة في عملية التطوير.
1. المفاهيم الأساسية للتخزين المؤقت
(1) ما هي منطقة التخزين المؤقت؟
تقوم عملية «الوضع في منطقة الانتظار» بحفظ التغييرات التي تم إجراؤها على مساحة العمل ومنطقة الانتظار مؤقتًا:
- حفظ مؤقت: حفظ التغييرات التي لم يتم إرسالها بعد
- تنظيف مساحة العمل: إعادة مساحة العمل إلى حالتها النظيفة
- التبديل بين الفروع: يمكنك التبديل بحرية بين الفروع
- متابعة لاحقًا: يمكنك متابعة التغييرات التي قمت بحفظها في أي وقت
graph TB
A[Changes have been made to the workspace] --> B[git stash]
B --> C[Edit and save tostash]
C --> D[The workspace is now clean]
D --> E[Switch Branches]
E --> F[git stash pop]
F --> G[Restore Changes]
style B fill:#fff3cd
style D fill:#d4edda
style G fill:#c3e6cb
(2) الفرق بين "stash" و"commit"
| ميزة | تخزين | إرسال |
|---|---|---|
| الغرض | التخزين المؤقت | السجل الدائم |
| السجل | غير موجود في سجل عمليات الالتزام | موجود في سجل عمليات الالتزام |
| الفرع | غير موجود في أي فرع | موجود في الفرع الحالي |
| الإشعارات الفورية | لا توجد إشعارات فورية | إشعارات فورية |
| حالات الاستخدام | التبديل المؤقت بين المهام | إتمام تطوير الميزات |
(3) بنية التخزين في «stash»
المخزون هو كومة:
- stash@{0}: أحدث نسخة مخزنة
- stash@{1}: العناصر التي أُضيفت مؤخرًا إلى المخزن
- stash@{n}: المخبأ رقم n+1
2. العمليات الأساسية للتخزين المؤقت
(1) حفظ التغييرات الحالية مؤقتًا
▶ مثال: إعداد التغييرات
# View Current Changes
git status
# Output:
# Changes not staged for commit:
# modified: src/auth.js
# modified: src/user.js
# Save current changes temporarily
git stash
# Output:
# Saved working directory and index state WIP on main: a1b2c3d feat: Add Feature
# View Status(The workspace is clean)
git status
# Output:
# On branch main
# nothing to commit, working tree clean
(2) عرض مرحلي مع وصف
▶ مثال: إضافة وصف
# Save for now and add a description
git stash save "WIP: User Login Feature"
# Or usepush(New Grammar)
git stash push -m "WIP: User Login Feature"
# Output:
# Saved working directory and index state On main: WIP: User Login Feature
# View the staging list
git stash list
# Output:
# stash@{0}: On main: WIP: User Login Feature
(3) تتضمن المراحل ملفات غير مُتتبَّعة
▶ مثال: يتضمن الملفات غير المتعقبة
# Create a New File(Not tracked)
touch new-file.js
# DefaultstashUntracked files will not be saved
git stash
# Output:
# Saved working directory and index state WIP on main: a1b2c3d
# new-file.js still untracked
# Usage-uThe selection includes untracked files
git stash -u
# Or
git stash --include-untracked
# Usage-aThe option includes all files(Include ignored files)
git stash -a
3. عرض وإدارة بيئة الاختبار
(1) عرض قائمة التجهيز
▶ مثال: سرد جميع مناطق التجهيز
# View the staging list
git stash list
# Output:
# stash@{0}: On main: WIP: User Login Feature
# stash@{1}: On feature: WIP: Shopping Cart Feature
# stash@{2}: On develop: FixBug
# Limit the number of items displayed
git stash list -3
# View Staging Details
git stash show
# Output:
# src/auth.js | 10 ++++++++++
# src/user.js | 5 ++---
# 2 files changed, 12 insertions(+), 3 deletions(-)
# View Detailed Differences
git stash show -p
# View a Specific Cache
git stash show stash@{1}
(2) عرض المحتوى المُعد مسبقًا
▶ مثال: عرض تفاصيل المرحلة الانتقالية
# View the latest full diff from the staging area
git stash show -p stash@{0}
# Output:
# diff --git a/src/auth.js b/src/auth.js
# index abc1234..def5678 100644
# --- a/src/auth.js
# +++ b/src/auth.js
# @@ -10,6 +10,16 @@ function validate() {
# + // Added validation logic
# + if (!token) {
# + return false;
# + }
# return true;
# }
# View Cached Statistics
git stash show --stat
# Output:
# src/auth.js | 10 ++++++++++
# src/user.js | 5 ++---
# 2 files changed, 12 insertions(+), 3 deletions(-)
(3) حذف منطقة التخزين المؤقت
▶ مثال: حذف منطقة التجهيز
# Delete the latest staging
git stash drop
# Delete Specified Stash
git stash drop stash@{2}
# Clear All Cache
git stash clear
# Confirm Deletion
git stash list
4. تهيئة التطبيق
(1) تطبيق منطقة التجهيز وإغلاقها
▶ مثال: التجهيز المسبق للتطبيق
# Apply, Save, and Delete
git stash pop
# Output:
# On branch main
# Changes not staged for commit:
# modified: src/auth.js
# modified: src/user.js
# Use Specified Stash
git stash pop stash@{1}
# If there is a conflict
# CONFLICT (content): Merge conflict in src/auth.js
# The stash entry is kept in case you need it again.
# After Resolving the Conflict,Manually Delete the Stash
git stash drop
(2) تطبيق التغييرات مع إبقائها في بيئة الاختبار (تطبيق)
▶ مثال: الاحتفاظ في «Stash»
# App is cached but not deleted
git stash apply
# Use Specified Stash
git stash apply stash@{1}
# View the staging list(The temporary file is still there)
git stash list
# Output:
# stash@{0}: On main: WIP: User Login Feature
# stash@{1}: On feature: WIP: Shopping Cart Feature
# applySuitable for multiple uses of the same temporary storage
(3) pop مقابل apply
graph TB
A[App Stash] --> B{Method}
B -->|pop| C[Apply and Clear the Clipboard]
B -->|apply| D[Apply but keep in the staging area]
C --> E[Single-use]
D --> F[Reusable]
style C fill:#d4edda
style D fill:#fff3cd
سيناريوهات استخدام pop:
- لا تُقدم إلا مرة واحدة
- تأكد من أن منطقة التجهيز هذه لم تعد مطلوبة
متى يُستخدم apply:
- قد يكون من الضروري تقديم طلبات متعددة
- هل تريد الاحتفاظ بمنطقة التجهيز كنسخة احتياطية؟
- التقدم بطلب إلى عدة فروع
5. شرح مفصل لخيارات التخزين المؤقت
(1) خيارات التخزين المؤقت الشائعة
| الخيار | الوصف | حالة الاستخدام |
|---|---|---|
save |
حفظ في الحافظة (الصيغة القديمة) | الحافظة الأساسية |
push |
حفظ في الحافظة (صيغة جديدة) | موصى به |
-m |
إضافة وصف | وضع كمسودة |
-u |
تتضمن ملفات غير مُسجَّلة | يجب أيضًا وضع الملفات الجديدة في قائمة التجهيز |
-a |
تضمين جميع الملفات | تضمين الملفات التي تم تجاهلها |
-k |
الاحتفاظ بمنطقة التجهيز | منطقة عمل التجهيز فقط |
▶ مثال: استخدام خيار «التخزين المؤقت»
# Only cache changes to tracked files
git stash
# Check-in includes untracked files
git stash -u
# Check out includes ignored files
git stash -a
# Temporary Workspace Only,Reserve a buffer
git stash -k
# Cache only specific files
git stash push src/auth.js
# Cache only files that match the pattern
git stash push '*.js'
# Preserve the temporary storage index
git stash --index
(2) إنشاء فرع من مخزن مؤقت
▶ مثال: إنشاء فرع من منطقة التجهيز
# Create a New Branch from a Stash
git stash branch feature-from-stash
# Output:
# Switched to a new branch 'feature-from-stash'
# On branch feature-from-stash
# Changes not staged for commit:
# modified: src/auth.js
# This will create a new branch and apply the staged changes.
# Ideal for transferring staged changes to a new branch for development
6. حفظ سير العمل
(1) التبديل بين المهام في حالات الطوارئ
▶ مثال: التعامل مع خطأ عاجل
# Features currently under developmentA
echo "feature A code" > feature-a.js
git status
# Output:
# Untracked files:
# feature-a.js
# Sudden need for urgent repairsBug
# Save the current work
git stash save "WIP: FeaturesAUnder development"
# Switch tohotfixBranch
git checkout -b hotfix-urgent-bug
# FixBug
echo "fix" > fix.js
git add fix.js
git commit -m "fix: Urgent FixBug"
# Push Fix
git push origin hotfix-urgent-bug
# Switch back to the original branch and resume work
git checkout main
git stash pop
# Continue Developing FeaturesA
(2) التطوير المتوازي لمهام متعددة
sequenceDiagram
participant Developer
participant mainBranch
participant featureBranch
participant Stash
Developer->>mainBranch: Development FeaturesA
Developer->>Stash: git stash Save A
Developer->>featureBranch: Switch to Branch DevelopmentB
Developer->>Stash: git stash Save B
Developer->>mainBranch: Cut back tomain
Developer->>Stash: git stash pop Restore A
▶ مثال: التبديل بين المهام
# Development FeaturesA
echo "feature A" > feature-a.js
git stash push -m "FeaturesA"
# Toggle Development FeaturesB
git checkout -b feature-b
echo "feature B" > feature-b.js
git stash push -m "FeaturesB"
# View the staging list
git stash list
# Output:
# stash@{0}: On feature-b: FeaturesB
# stash@{1}: On main: FeaturesA
# Back tomainContinue DevelopmentA
git checkout main
git stash pop stash@{1}
# Completed FeaturesA
git add feature-a.js
git commit -m "feat: FeaturesADone"
# Cut tofeature-bContinue DevelopmentB
git checkout feature-b
git stash pop
(3) نقل التطبيق إلى فرع آخر
▶ مثال: نشر التغييرات عبر الفروع
# Staging Changes on feature Branch
git checkout feature
echo "some changes" > file.js
git stash save "Share Edits"
# Switch tomainBranch Application Staging
git checkout main
git stash apply
# NowmainThese changes are also present in the branch.
# The temporary file is still there,Can be applied to other branches
# Switch todevelopBranch Applications
git checkout develop
git stash apply
# Delete Stash
git stash drop
7. أفضل الممارسات للتخزين المؤقت
(1) توصيات بشأن التخزين المؤقت
أفضل الممارسات:
# Add a clear description
git stash save "WIP: User Authentication Feature,Complete the login logic"
# Clear the cache list periodically
git stash list
git stash drop stash@{5} # Delete the old staging area
# Usageapplyrather thanpop,If you're not sure whether you still need it
git stash apply
# Check the status before saving temporarily
git status
git diff
الممارسات السيئة:
# No description,Difficult to identify
git stash
# Retaining large amounts of temporary data over the long term
git stash list # Dozens of temporary files
# Forgot to restore the staging area
git stash
# ... A few days later, I forgot what I had saved.
(2) التعامل مع النزاعات في منطقة التجمع
▶ مثال: حل تعارضات المراحل
# Conflicts caused by app cache
git stash pop
# Output:
# CONFLICT (content): Merge conflict in src/auth.js
# The stash entry is kept in case you need it again.
# View Conflicting Files
git status
# Resolving Conflicts
# Editing Files with Conflicts,Keep the necessary content
# Mark the conflict as resolved
git add src/auth.js
# Delete Stash
git stash drop
# Or discard the temporary file
git reset --hard
git stash drop
(3) برنامج نصي لإدارة التخزين المؤقت
▶ مثال: أداة إدارة المراحل
#!/bin/bash
# stash-manager.sh - Cache Management Tool
case "$1" in
list)
echo "=== Stash List ==="
git stash list
;;
show)
if [ -z "$2" ]; then
git stash show -p
else
git stash show -p "stash@{$2}"
fi
;;
apply)
if [ -z "$2" ]; then
git stash apply
else
git stash apply "stash@{$2}"
fi
;;
drop)
if [ -z "$2" ]; then
git stash drop
else
git stash drop "stash@{$2}"
fi
;;
clear)
read -p "Clear all stashes? (y/n) " -n 1 -r
echo
if [[ $REPLY =~ ^[Yy]$ ]]; then
git stash clear
echo "All stashes cleared"
fi
;;
*)
echo "Usage: $0 {list|show [n]|apply [n]|drop [n]|clear}"
;;
esac
❓ أسئلة شائعة
stash pop وstash apply؟pop بتطبيق عملية الالتزام وحذف سجل الالتزام، بينما يقوم apply بتطبيق عملية الالتزام مع الاحتفاظ بسجل الالتزام. إذا كنت بحاجة إلى تطبيق نفس عملية الالتزام عدة مرات، فاستخدم apply.git stash -u أو git stash --include-untracked لتضمين الملفات غير المتعقبة. استخدم git stash -a لتضمين جميع الملفات (بما في ذلك الملفات المهملة).git stash list لعرض قائمة التجهيز، وgit stash show لعرض إحصائيات التجهيز، وgit stash show -p لعرض الاختلافات الكاملة في قائمة التجهيز.git add لوضع علامة على التضارب باعتباره قد تم حله، ثم استخدم git stash drop لإزالة التغييرات من منطقة الانتظار. إذا كنت ترغب في تجاهل التغييرات، فاستخدم git reset --hard وgit stash drop.📖 ملخص
- «حفظ في الحافظة» هي ميزة تُحفظ بها التغييرات التي تم إجراؤها على مساحة العمل مؤقتًا، مما يتيح لك التبديل بين المهام.
- العمليات الأساسية:
git stashحفظ في الحافظة،git stash popتطبيق وحذف - مع الوصف:
git stash save "description"أوgit stash push -m "description" - تضمين الملفات غير المتعقبة:
-uهذا الخيار يضم الملفات غير المتعقبة - عرض المكتبة:
git stash listالقائمة،git stash showالتفاصيل - pop مقابل apply: تعمل الدالة pop على إزالة القيمة المؤقتة، بينما تحافظ الدالة apply عليها
- تنظيم سير العمل: تنظيم العمل الحالي → التبديل بين الفروع → إتمام المهمة → إلغاء التنظيم
📝 تمارين
-
تمرين أساسي: بعد تعديل ملف ما، استخدم
stashلتخزين التغييرات مؤقتًا، وعرض قائمة التخزين المؤقت وتفاصيله، ثم قم بتطبيق التخزين المؤقت لتجربة عملية التخزين المؤقت بالكامل. -
تمرين متقدم: قم بمحاكاة سيناريو تحتاج فيه إلى التبديل بين المهام بشكل عاجل: أثناء تطوير إحدى الميزات، قم بحفظ عملك الحالي مؤقتًا، ثم انتقل إلى فرع آخر لإصلاح خطأ برمجي، ثم استرجع العمل المحفوظ مؤقتًا واستكمل التطوير لتجربة التطبيق العملي لعملية الحفظ المؤقت.
-
التحدي: تجربة التطوير المتوازي لمهام متعددة: إنشاء مناطق مرحلية متعددة، والتبديل بين الفروع المختلفة لتطبيق المناطق المرحلية المختلفة، وفهم كيفية عمل مكدس المناطق المرحلية.