بدلاً من المقدمة
مرحبًا بك مهندس برمجيات المستقبل.أساسيات جيت
Git هو نظام للتحكم في الإصدار الموزع للتعليمات البرمجية الخاصة بنا. لماذا نحتاجه؟ تحتاج الفرق الموزعة إلى نوع من نظام إدارة العمل. هناك حاجة لتتبع التغييرات التي تحدث مع مرور الوقت. أي أننا نرى خطوة بخطوة الملفات التي تغيرت وكيف تغيرت. وهذا مهم بشكل خاص عند تحليل ما تم إنجازه ضمن مهمة واحدة: فهذا يجعل من الممكن العودة إلى الوراء. لنتخيل موقفًا: كان هناك كود عمل، وكان كل شيء جيدًا فيه، لكننا قررنا تحسين شيء ما، تعديله هنا، وتعديله هناك. كان كل شيء على ما يرام، لكن هذا التحسن أدى إلى كسر نصف الوظيفة وجعل العمل مستحيلاً. إذن، ما هي الخطوة التالية؟ بدون غيتا، سيتعين على المرء أن يجلس لساعات ويتذكر كيف كان كل شيء في الأصل. ولذا فإننا نعود إلى الالتزام وهذا كل شيء. أو ماذا لو كان هناك مطوران يقومان بتغيير التعليمات البرمجية الخاصة بهما في نفس الوقت؟ بدون Git يبدو الأمر كما يلي: لقد نسخوا الكود من النص الأصلي وفعلوا ما يتعين عليهم القيام به. تأتي اللحظة ويريد كلاهما إضافة تغييراتهما إلى المجلد الرئيسي. وماذا أفعل في هذه الحالة؟.. لا أجرؤ حتى على تقدير الوقت المناسب للقيام بهذا العمل. لن تكون هناك مثل هذه المشاكل على الإطلاق إذا كنت تستخدم Git.تثبيت جيت
لنقم بتثبيت Git على جهاز الكمبيوتر الخاص بك. أنا أفهم أن كل شخص لديه نظام تشغيل مختلف، لذلك سأحاول وصف عدة حالات.التثبيت لنظام التشغيل Windows
كالعادة، تحتاج إلى تنزيل ملف exe وتشغيله. كل شيء بسيط هنا: انقر على رابط Google الأول ، ثم قم بالتثبيت وهذا كل شيء. للعمل سوف نستخدم وحدة التحكم bash التي يقدمونها. للعمل على نظام التشغيل Windows، تحتاج إلى تشغيل Git Bash. هذا ما يبدو في قائمة البداية:![البدء باستخدام Git: دليل تفصيلي للمبتدئين - 2](https://cdn.javarush.com/images/article/7f9c3203-5ae5-46fd-b500-42b3979c2eaf/800.jpeg)
![البدء باستخدام Git: دليل تفصيلي للمبتدئين - 3](https://cdn.javarush.com/images/article/52ad1966-4e34-4e47-ba78-8ce1ff395d18/1024.jpeg)
التثبيت لنظام التشغيل Linux
عادةً ما يتم تثبيت git بالفعل وإدراجه في توزيعات Linux، نظرًا لأنه أداة مكتوبة في الأصل لتطوير Linux kernel. ولكن هناك حالات عندما لا يكون هناك. للتحقق من ذلك، تحتاج إلى فتح محطة واكتب: git --version. إذا كانت هناك إجابة واضحة، فلا داعي لتثبيت أي شيء. افتح المحطة وقم بالتثبيت. أنا أعمل على Ubuntu، لذا يمكنني أن أخبرك بما ستكتب له: sudo apt-get install git. وهذا كل شيء: الآن يمكنك استخدام Git في أي محطة طرفية.التثبيت على نظام التشغيل MacOS
هنا أيضًا، تحتاج أولاً إلى التحقق مما إذا كان Git موجودًا بالفعل (انظر أعلاه، كما هو الحال في Linux). إذا لم يكن الأمر كذلك، فإن أسهل طريقة هي تنزيل أحدث إصدار. إذا تم تثبيت XCode، فسيتم بالتأكيد تثبيت Git تلقائيًا.إعداد جيت
يحتوي git على إعداد المستخدم الذي سيتم تنفيذ العمل من خلاله. وهذا أمر معقول وضروري، لأنه عند إنشاء التزام، يأخذ Git هذه المعلومات بالضبط لحقل المؤلف. لإعداد اسم مستخدم وكلمة مرور لجميع المشاريع، تحتاج إلى إدخال الأوامر التالية:
git config --global user.name ”Ivan Ivanov”
git config --global user.email ivan.ivanov@gmail.com
إذا كانت هناك حاجة لتغيير المؤلف لمشروع معين (لمشروع شخصي، على سبيل المثال)، فيمكنك إزالة --global، وسيعمل هذا:
git config user.name ”Ivan Ivanov”
git config user.email ivan.ivanov@gmail.com
القليل من النظرية...
للبقاء في الموضوع، يُنصح بإضافة بعض الكلمات والإجراءات الجديدة إلى رسالتك... وإلا فلن يكون هناك ما يمكن التحدث عنه. بالطبع، هذه بعض المصطلحات ونسخة من اللغة الإنجليزية، لذلك سأضيف المعاني باللغة الإنجليزية. أي أقوال وأفعال؟- مستودع بوابة؛
- ارتكاب (ارتكاب) ؛
- فرع؛
- دمج؛
- الصراعات.
- يحذب؛
- يدفع؛
- كيفية تجاهل بعض الملفات (.gitignore).
الدول في جيت
لدى جيتا العديد من الحالات التي يجب فهمها وتذكرها:- غير متعقب؛
- معدل؛
- مستعد (على مراحل) ؛
- ملتزم.
ماذا يعني ذلك؟
هذه هي الحالات التي توجد بها الملفات من الكود الخاص بنا. أي أن مسار حياتهم عادة ما يبدو كما يلي:- سيكون الملف الذي تم إنشاؤه ولم يتم إضافته إلى المستودع في حالة عدم التتبع.
- نقوم بإجراء تغييرات على الملفات التي تمت إضافتها بالفعل إلى مستودع Git - فهي في الحالة المعدلة.
- من الملفات التي قمنا بتغييرها، نختار فقط تلك (أو الكل) التي نحتاجها (على سبيل المثال، لا نحتاج إلى فئات مجمعة)، وتندرج هذه الفئات مع التغييرات في الحالة المرحلية.
- يتم إنشاء التزام من الملفات المعدة من الحالة المرحلية وينتقل إلى مستودع Git. بعد ذلك، تصبح الحالة المرحلية فارغة. لكن التعديل قد لا يزال يحتوي على شيء ما.
![البدء باستخدام Git: دليل تفصيلي للمبتدئين - 4](https://cdn.javarush.com/images/article/6136c12e-46b4-4fda-820c-3287237c48ab/800.jpeg)
ما هو الالتزام
الالتزام هو الكائن الرئيسي في التحكم في الإصدار. أنه يحتوي على كافة التغييرات منذ ذلك الالتزام. ترتبط الالتزامات ببعضها البعض مثل قائمة مرتبطة منفردة. أي: هناك الالتزام الأول. عندما يتم إنشاء الالتزام الثاني، فإنه (الثاني) يعرف أنه يأتي بعد الأول. وبهذه الطريقة يمكنك تتبع المعلومات. يحتوي الالتزام أيضًا على معلوماته الخاصة، والتي تسمى البيانات الوصفية:- معرف التزام فريد يمكنك من خلاله العثور عليه؛
- اسم مؤلف الالتزام الذي قام بإنشائه؛
- تاريخ إنشاء الالتزام؛
- تعليق يصف ما تم القيام به أثناء هذا الالتزام.
![الشروع في استخدام Git: دليل تفصيلي للمبتدئين - 5](https://cdn.javarush.com/images/article/f0a1025b-2f0c-4e65-b9bc-641db79a7704/512.jpeg)
ما هو فرع
![البدء باستخدام Git: دليل تفصيلي للمبتدئين - 6](https://cdn.javarush.com/images/article/29945159-3a11-47a9-ae00-c762a4f5d6fb/512.jpeg)
الشروع في العمل مع جيت
يمكنك العمل فقط مع مستودع محلي، أو مع مستودع بعيد. للعمل على الأوامر اللازمة، يمكنك فقط استخدام المستودع المحلي. يقوم بتخزين جميع المعلومات محليًا فقط في المشروع في المجلد .git. إذا تحدثنا عن جهاز التحكم عن بعد، فسيتم تخزين جميع المعلومات في مكان ما على خادم بعيد: يتم تخزين نسخة من المشروع فقط محليًا، ويمكن دفع التغييرات التي تم إجراؤها (دفع git) إلى المستودع البعيد. سنناقش هنا وأكثر العمل مع git في وحدة التحكم. بالطبع، يمكنك استخدام بعض الحلول الرسومية (على سبيل المثال، في Intellij IDEA)، ولكن عليك أولاً معرفة الأوامر التي تحدث وماذا تعني.العمل مع Git في مستودع محلي
بعد ذلك، أقترح عليك اتباع جميع الخطوات التي قمت بها أثناء قراءة المقال. سيؤدي ذلك إلى تحسين فهمك واحتفاظك بالمواد. شهية طيبة :) لإنشاء مستودع محلي، عليك أن تكتب:
git init
![البدء باستخدام Git: دليل تفصيلي للمبتدئين - 7](https://cdn.javarush.com/images/article/5dbf6234-0ea6-40a8-9d37-ce14609d53b4/800.jpeg)
git status
![البدء باستخدام Git: دليل تفصيلي للمبتدئين - 8](https://cdn.javarush.com/images/article/348071fa-ccab-4a0c-ae94-6f9f0e6fa671/800.jpeg)
- git add -A - إضافة كافة الملفات من الحالة المرحلية؛
- إضافة بوابة . - إضافة جميع الملفات من هذا المجلد وجميع الملفات الداخلية. في الأساس نفس سابقتها؛
- git add <filename> - يضيف ملفًا محددًا فقط. هنا يمكنك استخدام التعبيرات العادية للإضافة وفقًا لبعض الأنماط. على سبيل المثال، git add *.java: هذا يعني أنك تحتاج فقط إلى إضافة ملفات ذات ملحق Java.
git add *.txt
للتحقق من الحالة، نستخدم الأمر الذي نعرفه بالفعل:
git status
![البدء باستخدام Git: دليل تفصيلي للمبتدئين - 9](https://cdn.javarush.com/images/article/948c12dc-8227-48d0-8bd3-2ac9ed8be271/800.jpeg)
git commit -m “all txt files were added to the project”
![البدء باستخدام Git: دليل تفصيلي للمبتدئين - 10](https://cdn.javarush.com/images/article/5159fcca-3b1c-4308-b1e4-854c1d480385/800.jpeg)
git log
![البدء باستخدام Git: دليل تفصيلي للمبتدئين - 11](https://cdn.javarush.com/images/article/b869b551-e804-4ac1-b199-6f16684be943/800.jpeg)
git status
![البدء باستخدام Git: دليل تفصيلي للمبتدئين - 12](https://cdn.javarush.com/images/article/00e768e8-6568-42d8-9d03-437c71028b50/800.jpeg)
git status
![البدء باستخدام Git: دليل تفصيلي للمبتدئين - 13](https://cdn.javarush.com/images/article/3abb8e35-ebfd-4480-b26e-fc8f19322b36/800.jpeg)
git diff
![البدء باستخدام Git: دليل تفصيلي للمبتدئين - 14](https://cdn.javarush.com/images/article/1f3506ae-1746-4ee9-b346-c992be73bb63/800.jpeg)
git add test_resource.txt
git commit -m “added hello word! to test_resource.txt”
لإلقاء نظرة على جميع الالتزامات، اكتب:
git log
![البدء باستخدام Git: دليل تفصيلي للمبتدئين - 15](https://cdn.javarush.com/images/article/12d64adf-c2ae-4d62-ab36-df174fdab5b8/800.jpeg)
git add GitTest.java
git commit -m “added GitTest.java”
git status
![البدء باستخدام Git: دليل تفصيلي للمبتدئين - 16](https://cdn.javarush.com/images/article/e5e89bbd-baa2-43cc-bace-cbb24e030c7a/800.jpeg)
العمل مع .gitignore
من الواضح أننا نريد فقط تخزين كود المصدر وليس أي شيء آخر في المستودع. ماذا يمكن ان يكون ايضا؟ كحد أدنى، الفئات و/أو الملفات المترجمة التي تنشئ بيئات التطوير. لكي يتجاهلها Git، يجب إنشاء ملف خاص. نقوم بذلك: نقوم بإنشاء ملف في جذر المشروع يسمى .gitignore، وفي هذا الملف سيكون كل سطر نموذجًا يجب تجاهله. في هذا المثال، سيبدو تجاهل git كما يلي:
```
*.class
target/
*.iml
.idea/
```
دعونا ننظر الآن:
- السطر الأول هو تجاهل كافة الملفات ذات الامتداد .class؛
- السطر الثاني هو تجاهل المجلد الهدف وكل ما يحتوي عليه؛
- السطر الثالث هو تجاهل كافة الملفات ذات الامتداد .iml؛
- السطر الرابع هو تجاهل المجلد .idea.
git status
![البدء باستخدام Git: دليل تفصيلي للمبتدئين - 17](https://cdn.javarush.com/images/article/78f2e2ef-72df-41ed-9f16-6aeb16be9c92/800.jpeg)
![البدء باستخدام Git: دليل تفصيلي للمبتدئين - 18](https://cdn.javarush.com/images/article/cb845a33-8843-4ee9-8842-545e11a8436b/1024.jpeg)
git add .gitignore
git commit -m “added .gitignore file”
والآن لحظة الحقيقة: لدينا فئة GitTest.class مجمعة في حالة غير متعقبة، والتي لم نرغب في إضافتها إلى مستودع Git. هذا هو المكان الذي يجب أن يعمل فيه تجاهل git:
git status
![البدء باستخدام Git: دليل تفصيلي للمبتدئين - 19](https://cdn.javarush.com/images/article/d094337b-01dc-43a6-8326-c0ba309d0df7/800.jpeg)
العمل مع الفروع وما شابه ذلك
وبطبيعة الحال، فإن العمل في فرع واحد غير مريح لشخص واحد ومستحيل عندما يكون هناك أكثر من شخص في الفريق. هناك فرع لهذا. كما قلت من قبل، الفرع هو مجرد مؤشر متحرك للالتزامات. في هذا الجزء، سنلقي نظرة على العمل في فروع مختلفة: كيفية دمج التغييرات من فرع إلى آخر، وما هي الصراعات التي قد تنشأ، وأكثر من ذلك بكثير. لرؤية قائمة بجميع الفروع الموجودة في المستودع وفهم الفرع الذي أنت فيه، عليك أن تكتب:
git branch -a
![البدء باستخدام Git: دليل تفصيلي للمبتدئين - 20](https://cdn.javarush.com/images/article/3a5ccec8-3fe1-4b6c-b19f-2e66280f4fc6/800.jpeg)
- إنشاء فرع جديد بناءً على الفرع الذي نحن فيه (99% من الحالات)؛
- إنشاء فرع بناءً على التزام محدد (1%).
إنشاء فرع بناءً على التزام محدد
سوف نعتمد على معرف الالتزام الفريد. وللبحث عنه نكتب:
git log
![البدء باستخدام Git: دليل تفصيلي للمبتدئين - 21](https://cdn.javarush.com/images/article/6f312f65-a820-4faf-a218-686182020e32/800.jpeg)
git checkout -b development 6c44e53d06228f888f2f454d3cb8c1c976dd73f8
يتم إنشاء فرع يحتوي على أول التزامين فقط من الفرع الرئيسي. لاختبار ذلك، سنتأكد أولاً من أننا انتقلنا إلى فرع آخر وننظر إلى عدد الالتزامات عليه:
git status
git log
![البدء باستخدام Git: دليل تفصيلي للمبتدئين - 22](https://cdn.javarush.com/images/article/32e2010a-16e6-4342-a082-c5181a876dfd/800.jpeg)
git branch -a
![البدء باستخدام Git: دليل تفصيلي للمبتدئين - 23](https://cdn.javarush.com/images/article/b0fa2136-26d5-4c09-867a-9faebdc3be8e/800.jpeg)
إنشاء فرع بناءً على الفرع الحالي
الطريقة الثانية لإنشاء فرع هي البناء على فرع آخر. أريد إنشاء فرع بناءً على الفرع الرئيسي، لذا أحتاج إلى التبديل إليه أولاً، والخطوة التالية هي إنشاء فرع جديد. دعونا ننظر:- git checkout master - انتقل إلى الفرع الرئيسي؛
- حالة git - تحقق مما إذا كانت موجودة على الجهاز الرئيسي.
![الشروع في استخدام Git: دليل تفصيلي للمبتدئين - 24](https://cdn.javarush.com/images/article/fc59d1e4-d887-4b07-add7-0a1ed53ede8b/800.jpeg)
git checkout -b feature/update-txt-files
![البدء باستخدام Git: دليل تفصيلي للمبتدئين - 25](https://cdn.javarush.com/images/article/19d396fc-af1c-4d3f-8deb-2dbba09dfaf2/800.jpeg)
حل النزاعات
قبل أن نفهم ما هو الصراع، نحتاج إلى الحديث عن دمج (دمج) فرع في آخر. يمكن أن توضح هذه الصورة العملية عند دمج فرع في آخر:![البدء باستخدام Git: دليل تفصيلي للمبتدئين - 26](https://cdn.javarush.com/images/article/5be87984-024c-43ab-be88-a3cdf3331692/512.jpeg)
![البدء باستخدام Git: دليل تفصيلي للمبتدئين - 27](https://cdn.javarush.com/images/article/47a002ed-bea0-4be5-b60c-f9c822c5c834/800.jpeg)
git add *.txt
git commit -m “updated txt files”
git log
![Начало работы с Git: подробный гайд для новичков - 28](https://cdn.javarush.com/images/article/99af1950-f2b6-4792-8fe7-4ad7442dd8fc/800.jpeg)
git checkout master
git merge feature/update-txt-files
git log
![Начало работы с Git: подробный гайд для новичков - 29](https://cdn.javarush.com/images/article/96f5d6f1-3d22-4597-b85b-b8af900b2e35/800.jpeg)
git branch -D feature/update-txt-files
حتى الآن الأمر واضح، أليس كذلك؟ دعونا نعقد الموقف: لنفترض الآن أننا بحاجة إلى تغيير ملف txt مرة أخرى. ولكن الآن سيتم أيضًا تغيير هذا الملف في المعالج. وهذا يعني أنه سيتغير بالتوازي، ولن يتمكن Git من فهم ما يجب القيام به في موقف عندما نريد دمج التعليمات البرمجية الجديدة في الفرع الرئيسي. يذهب! نقوم بإنشاء فرع جديد استنادًا إلى الملف الرئيسي، وإجراء تغييرات على text_resource.txt وإنشاء التزام لهذا الأمر:
git checkout -b feature/add-header
... делаем изменения в файле
![Начало работы с Git: подробный гайд для новичков - 30](https://cdn.javarush.com/images/article/0a9176d6-8054-4655-b90a-315e215aa56f/800.jpeg)
git add *.txt
git commit -m “added header to txt”
![Начало работы с Git: подробный гайд для новичков - 31](https://cdn.javarush.com/images/article/2635b663-7fd8-4d22-947b-df8c50777840/800.jpeg)
git checkout master
… обновor test_resource.txt
![Начало работы с Git: подробный гайд для новичков - 32](https://cdn.javarush.com/images/article/ac84fa61-0381-48e0-bf5c-1dcf633b779f/800.jpeg)
git add test_resource.txt
git commit -m “added master header to txt”
والآن اللحظة الأكثر إثارة للاهتمام: تحتاج إلى دمج التغييرات من فرع الميزة/الرأس الإضافي إلى إتقانها. نحن في الفرع الرئيسي، لذا كل ما علينا فعله هو كتابة:
git merge feature/add-header
لكننا سنحصل على نتيجة مع وجود تعارض في ملف test_resource.txt: ![Начало работы с Git: подробный гайд для новичков - 33](https://cdn.javarush.com/images/article/233f6738-b599-4f22-8552-2d39813d6dd8/800.jpeg)
![Начало работы с Git: подробный гайд для новичков - 34](https://cdn.javarush.com/images/article/efa04c3b-e279-4f6f-8f05-c3d2318d8ff2/800.jpeg)
- بين "<<<<<<< HEAD" و"=======" هي التغييرات الرئيسية التي كانت في هذا السطر في الفرع الرئيسي.
- بين "=======" و">>>>>>> الميزة/الرأس الإضافي" هناك تغييرات كانت في فرع الميزة/الرأس الإضافي.
![Начало работы с Git: подробный гайд для новичков - 35](https://cdn.javarush.com/images/article/c167e2b2-1cb1-4d19-862e-80ee06a7b6b4/800.jpeg)
git status
![Начало работы с Git: подробный гайд для новичков - 36](https://cdn.javarush.com/images/article/4416b14b-0e87-4877-b098-702624219f04/800.jpeg)
git add *.txt
![Начало работы с Git: подробный гайд для новичков - 37](https://cdn.javarush.com/images/article/99a41e85-fb52-429a-86c3-65ad32dd54aa/800.jpeg)
git commit
![Начало работы с Git: подробный гайд для новичков - 38](https://cdn.javarush.com/images/article/c07c9f20-993a-42ed-91d6-91fbf8f37646/800.jpeg)
العمل مع المستودعات البعيدة
الخطوة الأخيرة هي فهم بعض الأوامر الإضافية اللازمة للعمل مع مستودع بعيد. كما قلت من قبل، المستودع البعيد هو مكان يتم فيه تخزين المستودع ويمكنك استنساخه منه. ما هي أنواع المستودعات البعيدة الموجودة؟ هناك طن من الأمثلة:-
GitHub هو أكبر مستودع للمستودعات والتطوير التعاوني. لقد سبق أن وصفت ذلك في المقالات السابقة.
اشترك في حسابي على جيثب . غالبًا ما أعرض أعمالي هناك في المجالات التي أدرسها أثناء عملي. -
GitLab عبارة عن أداة دورة حياة DevOps مفتوحة المصدر ومستندة إلى الويب توفر نظام إدارة مستودع التعليمات البرمجية لـ Git مع موقع wiki الخاص بها ونظام تتبع المشكلات وخط أنابيب CI/CD وميزات أخرى.
بعد أنباء شراء Microsoft لـ GitHub، قام بعض المطورين بتكرار عملهم في GitLab. -
BitBucket هي خدمة ويب لاستضافة المشاريع وتطويرها المشترك، استنادًا إلى نظام التحكم في الإصدار Mercurial وGit. في وقت من الأوقات كانت تتمتع بميزة كبيرة على GitHub من حيث أنها كانت تحتوي على مستودعات خاصة مجانية. في العام الماضي، قام GitHub أيضًا بإتاحة هذه الميزة للجميع مجانًا.
-
وما إلى ذلك وهلم جرا…
git clone https://github.com/romankh3/git-demo
الآن هناك نسخة كاملة من المشروع محليا. للتأكد من أن أحدث نسخة من المشروع موجودة محليًا، عليك، كما يقولون، تفريغ البيانات عن طريق الكتابة:
git pull
![Начало работы с Git: подробный гайд для новичков - 39](https://cdn.javarush.com/images/article/782b84b1-e001-4849-be0b-c319133afca0/800.jpeg)
![Начало работы с Git: подробный гайд для новичков - 40](https://cdn.javarush.com/images/article/5598fa4d-3058-4994-b17d-63c6b5710076/800.jpeg)
git add test_resource.txt
git commit -m “prepated txt for pushing”
والآن الأمر لدفع هذا إلى المستودع البعيد:
git push
![Начало работы с Git: подробный гайд для новичков - 41](https://cdn.javarush.com/images/article/46c49cfa-afb0-4b3a-b95f-7506a199a189/800.jpeg)
روابط مفيدة
- الوثيقة الرسمية لـ Git موجودة باللغة الروسية . أوصي به كدليل مرجعي.
- شخص سخيف
GO TO FULL VERSION