<?xml version="1.0"?>
<rss version="2.0"><channel><title>&#x627;&#x644;&#x628;&#x631;&#x645;&#x62C;&#x629;: Git</title><link>https://academy.hsoub.com/programming/workflow/git/?d=2</link><description>&#x627;&#x644;&#x628;&#x631;&#x645;&#x62C;&#x629;: Git</description><language>ar</language><item><title>&#x623;&#x633;&#x627;&#x633;&#x64A;&#x627;&#x62A; GitHub &#x648;&#x643;&#x64A;&#x641;&#x64A;&#x629; &#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645;&#x647;</title><link>https://academy.hsoub.com/programming/workflow/git/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-github-%D9%88%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85%D9%87-r2607/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2026_04/GitHub.png.78243a4517b03752ba814fc9c3abf1ab.png" /></p>
<p>
	سنستعرض في هذا المقال أساسيات منصة GitHub، التي تُعد واجهة ويب <a href="https://academy.hsoub.com/programming/workflow/git/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D9%86%D8%B8%D8%A7%D9%85-git-%D9%84%D9%84%D8%AA%D8%AD%D9%83%D9%85-%D9%81%D9%8A-%D8%A7%D9%84%D8%A5%D8%B5%D8%AF%D8%A7%D8%B1%D8%A7%D8%AA-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A9-r2606/" rel="">لنظام التحكم في الإصدارات Git</a> والمملوكة لشركة Microsoft. سنركّز في هذا المقال على المفاهيم الأساسية للمنصة وآلية العمل عليها، بدءًا من إنشاء حساب جديد، ووصولًا إلى إعداد المصادقة Authentication لتأمين الوصول إلى الحساب واستخدامه بكفاءة.
</p>

<blockquote class="ipsQuote" data-gramm="false" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<div class="ipsQuote_contents ipsClearfix" data-gramm="false">
		<p>
			يفترض هذا المقال معرفة أساسية بنظام Git للتحكم في الإصدارات البرمجية واستخدام الطرفية أو سطر الأوامر.
		</p>
	</div>
</blockquote>

<h2 id="-github">
	إنشاء حساب GitHub
</h2>

<p>
	اذهب إلى موقع <a href="https://github.com" rel="external nofollow">GitHub</a> واضغط على زر إنشاء حساب جديد Sign up واتبع الإرشادات التي تظهر على الشاشة لإنشاء الحساب حتى تصل إلى لوحة التحكم في حسابك بعد إتمام تسجيل الدخول بنجاح.
</p>

<h2 id="-github">
	إنشاء مستودع جديد في GitHub
</h2>

<p>
	عند إنشاء مستودع جديد في GitHub فإنه يكون موجودًا في GitHub فقط وليس على حاسوبك المحلي، صحيح أنك تملكه بما أنك أنشأته وفي حسابك، لكن إذا أردت نقله إلى المستودع المحلي فيجب أن ننسخه إلى هناك، كما سنوضح لاحقًا. لننشئ المستودع الجديد الآن:
</p>

<ul>
	<li>
		<p>
			يوجد زر New أخضر على يسار اللوحة في الغالب، كما توجد قائمة منسدلة عليها علامة <code>+</code> أعلى جهة اليمين تحتوي خيار New Repository، هاتان طريقتان لإنشاء مستودع جديد تستطيع استخدام أيهما.
		</p>
	</li>
	<li>
		<p>
			أدخل اسم المستودع في الصفحة التي تلي ذلك، اختر أي اسم تريد بشرط ألا يكون لديك مستودع سابق بنفس الاسم، لنكتب <code>test-repo</code> لغرض مثالنا هنا.
		</p>
	</li>
	<li>
		<p>
			فعِّل خيار Add a README file لإضافة ملف Readme. لاحظ أن عليك تجنب هذا الخيار في المستقبل إذا كان لديك مستودع محلي وتريد دفعه push إلى هذه المستودع الجديد، لأن هذا سيمنع عملية الدفع.
		</p>
	</li>
	<li>
		<p>
			انقر على زر Create repository في أسفل الصفحة.
		</p>
	</li>
</ul>

<p>
	وهكذا صار لدينا أول مستودع خاص بنا.
</p>

<h2 id="-">
	مصادقة الحسابات
</h2>

<p>
	ينبغي أن نشرح عملية المصادقة authentication أولًا قبل الانتقال إلى شرح الاستنساخ cloning، ذلك أنك إذا جربت مزامنة مستودع محلي على حاسوبك مع مستودع بعيد على GitHub فلن تنجح لأن دعم المصادقة بكلمة المرور قد ألغي في 2021، فأمامنا الآن عدة خيارات:
</p>

<ul>
	<li>
		استخدام أداة GitHub CLI.
	</li>
	<li>
		استخدام مفاتيح <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr></abbr>.
	</li>
	<li>
		استخدام مفاتيح المصادقة الشخصية Personal Authentication Tokens.
	</li>
</ul>

<p>
	يُعد الخيار الأول هو الأسهل، أما مفاتيح <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr></abbr> فهي خيار متقدم بالنسبة للمبتدئين.
</p>

<h3 id="-github">
	واجهة سطر أوامر GitHub
</h3>

<p>
	تمثل أداة GitHub CLI واجهة نصية لموقع GitHub وتؤدي عدة وظائف أهمها تسهيل عملية المصادقة لحسابك فيه لتتمكن من تنفيذ مهامك مع Git كدفع ملفاتك إلى مستودع بعيد مثلًا.
</p>

<p>
	لتثبيت هذه الأداة، زر <a href="https://cli.github.com/" rel="external nofollow">صفحتها</a> واتبع <a href="https://github.com/cli/cli#installation" rel="external nofollow">تعليمات التثبيت</a> الخاصة بنظام تشغيلك، ثم جرب تشغيل الأمر <code>gh --version</code> بعد التثبيت لتتأكد من نجاح تثبيتها من خلال عرض معلومات إصدارها:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4296_9" style=""><span class="pln">$ gh --version
  gh version 2.42.1 (2024-01-15)
  https://github.com/cli/cli/releases/tag/v2.42.1</span></pre>

<p>
	ثم نفذ الأمرين التاليين:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4296_12" style=""><span class="pln">$ gh auth login
$ gh auth setup-git</span></pre>

<p>
	يأخذك الأمر الأول عبر خطوات تسجيل الدخول، ولن تحتاج إلى تكرار هذا إلا إذا سجلت الخروج، ثم يسألك النظام إذا كنت تريد استخدام بروتوكول <code><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr></abbr></code> أو <code>HTTP</code>، ننصح باختيار <code><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr></abbr></code> إذا كنت أعددت مفاتيح <code><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr></abbr></code> مسبقًا، وإلا فاختر <code>HTTP</code>، الفرق بينهما أن <code>HTTP</code> يخزن بياناتك دون تشفير بينما يسمح لك <code><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr></abbr></code> بحمايتها بكلمة مرور، ومع هذا يظل خيار تسجيل الدخول من المتصفح هو الأسهل.
</p>

<p>
	أما الأمر الثاني <code>gh auth setup-git</code> فننفذه مرة واحدة فقط حيث يضيف بعض العناصر المساعدة في عملية المصادقة إلى الإعدادات العامة.
</p>

<h3 id="-ssh">
	مفاتيح <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr></abbr>
</h3>

<p>
	لدينا خيار آخر للمصادقة هو مفتاح <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr></abbr>، وذلك إن لم ترغب في استخدام أداة GitHub CLI السابقة، سنبدأ بتوليد مفتاح أولًا ثم استخدامه، تجاوز هذه الخطوة إذا كان لديك زوج من مفاتيح <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr></abbr> بالفعل -ستعرف أنها لديك إذا نفذت الأمر:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4296_14" style=""><span class="pln">ls ~/.ssh</span></pre>

<p>
	ورأيت ملفًا مثل <code>id_rsa.pub</code> أو <code>id_ed25519.pub</code>. نفذ الأمر التالي لإنشاء زوج جديد من المفاتيح:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4296_16" style=""><span class="pln">$ ssh-keygen -t ed25519 -C عنوان بريد الإلكتروني هنا</span></pre>

<p>
	يضع الخيار <code>‎-C</code> تعليقًا داخل المفتاح، قد يكون أي شيء تريده، لكن الشائع هنا هو كتابة عنوان بريدك الإلكتروني، ستظهر لك عدة أسئلة تستطيع تجاوزها بالضغط على مفتاح الإدخال Enter.
</p>

<h4 id="-">
	نصيحة أمنية
</h4>

<p>
	يفضل استخدام كلمة مرور للوصول إلى هذا المفتاح، ذلك أن وصول شخص غيرك إليه يمكّنه من انتحال شخصيتك والوصول إلى حسابك في GitHub، ويلجأ المطورون إلى استخدام Key Agent يتذكر كلمة المرور لفترة زمنية محددة.
</p>

<p>
	أما إذا لم تضع كلمة مرور لمفتاحك فإنك تتركه عرضة للسرقة معتمدًا على ظن أنه لا يمكن الحصول على نسخة من الجزء الخاص من مفتاحك المخزن على حاسوبك، لكن فكر في الأمر من المنطق التالي: هل ستكون بحاجة إلى كلمة مرور أصلًا إذا كنت تثق في أمان حاسوبك؟
</p>

<p>
	على أي حال سنترك كلمة المرور فارغة في مثالنا هذا، إذ يمكن إعادة هذه الخطوات لإنشاء مفتاح جديد بكلمة مرور إذا أردت ذلك، فاطلع على <a href="https://docs.github.com/en/authentication/connecting-to-github-with-ssh/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent" rel="external nofollow">هذا التوثيق من GitHub لإنشاء مفتاح <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr></abbr></a>.
</p>

<p>
	استمر بالنقر على مفتاح الإدخال إذا ظهرت أي أسئلة على الشاشة حتى تصل إلى شيء شبيه بما يلي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4296_18" style=""><span class="pln">Generating public/private ed25519 key pair.
Enter file in which to save the key (/home/user/.ssh/id_ed25519):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in id_ed25519
Your public key has been saved in id_ed25519.pub
The key fingerprint is:
SHA256:/lrT43BQBRPJpUXxpTBFInhdtZSQjQwxU4USwt5c0Lw user@locahost
The key's randomart image is:
+--[ED25519 256]--+
|        .o.X^%^=+|
|        ..oo*^.=o|
|        ..o = o..|
|         . + E   |
|        S .      |
|       .   o     |
|        . + +    |
|         o = .   |
|        ... .    |
+----[SHA256]-----+</span></pre>

<p>
	سنحتاج إلى إجراء بعض الإعدادات الإضافية على المفتاح إذا اخترنا اسم ملف غير الاسم الافتراضي لكي نتمكن من تشغيله مع GitHub بشكل صحيح.
</p>

<p>
	لاحظ هذا الرسم العشوائي الغريب في المثال أعلاه، وهو مجرد تمثيل بصري للمفتاح، وتوجد طرق لإعداد <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr></abbr> بحيث تُعرض لك هذه اللوحة في كل مرة تسجل فيها الدخول، وفكرتها أنك إذا رأيت اختلافًا في اللوحة في مرة ما فهذا يعني أن شيئًا ما قد تغير في إعدادات الأمان. اكتب الآن <code>ls ~/.<abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">ssh</abbr></abbr></code>، يجب أن تظهر نتيجة كهذه:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4296_20" style=""><span class="pln">id_ed25519    id_ed25519.pub</span></pre>

<p>
	لا تشارك الملف الأول مع أحد أبدًا لأنه مفتاحك الخاص private key، بل لا يوجد سبب يدعوك حتى لنسخه، أما الملف الثاني هو المفتاح العام public key، وهو ما تستطيع مشاركته بأمان، وسنشاركه مع GitHub بعد قليل لكي تسجل الدخول باستخدامه.
</p>

<blockquote class="ipsQuote" data-gramm="false" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<div class="ipsQuote_contents ipsClearfix" data-gramm="false">
		<p>
			جرب تنفيذ الأمرين أدناه إذا واجهت مشكلة بسبب تدقيق <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr></abbr> الأمني:
		</p>

		<pre style="text-align: left;"> chmod 700 ~/.ssh $
*/chmod 600 ~/.ssh $
</pre>

		<p>
			هذه عملية ستتم مرة واحدة فقط، إن لم تكن أذونات الملفات مقيدة.
		</p>
	</div>
</blockquote>

<p>
	نعطي المفتاح العام الآن إلى GitHub عبر نسخه.
</p>

<p>
	لنحصل أولًا على نسخة منه ننفذ الأمر التالي -غير اسم الملف لاسم الملف الخاص بك-:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4296_22" style=""><span class="pln">$ cat ~/.ssh/id_ed25519.pub</span></pre>

<p>
	ينبغي أن تظهر لديك نتيجة كالتالي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4296_24" style=""><span class="pln">ssh-ed25519 AAAC3N[بعض المحارف هنا]V+znpoO عنوان بريدك</span></pre>

<p>
	انسخ السطر كاملًا إلى الحافظة لتستطيع لصقه لاحقًا.
</p>

<h4 id="-github">
	ربط المفتاح بـ GitHub
</h4>

<p>
	اذهب الآن إلى GitHub وانقر على صورتك الشخصية في أعلى اليمين ثم اتبع ما يلي:
</p>

<ol>
	<li>
		اختر الإعدادات Settings.
	</li>
	<li>
		اختر <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr></abbr> and GPG keys.
	</li>
	<li>
		اختر New <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr></abbr> key
		<ul>
			<li>
				أدخل عنوانًا مناسبًا مثل "my laptop key" في حقل Title.
			</li>
			<li>
				تأكد من اختيار Authentication key في حقل Key type.
			</li>
			<li>
				الصق المفتاح الذي نسخناه قبل قليل في حقل key.
			</li>
			<li>
				انقر على Add <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr></abbr> key.
			</li>
		</ul>
	</li>
</ol>

<blockquote class="ipsQuote" data-gramm="false" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<div class="ipsQuote_contents ipsClearfix" data-gramm="false">
		<p>
			تذكر أننا استخدمنا بروتوكول <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr></abbr> لاستنساخ روابط المستودعات لاحقًا.
		</p>
	</div>
</blockquote>

<h3 id="-">
	استخدام مفاتيح الوصول الشخصي
</h3>

<p>
	حان الوقت لننشئ كلمات مرور جديدة نستخدمها مع GitHub، وستكون هذه المرة من نوع المفتاح الشخصي personal token، يوفر GitHub توثيقًا مفصلًا حول الموضوع لكن ملخصه أننا سننشئ مفتاح token يمثل بعض الصلاحيات، مثل القراءة والكتابة في مستودعاتي، وسنستخدمه بدلًا من كلمة المرور العادية في سطر الأوامر كما يلي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4296_26" style=""><span class="pln">Username for 'https://github.com': [اسم المستخدم]
Password for 'https://beejjorgensen@github.com': [مفتاح Token]</span></pre>

<p>
	قد يحفظ حاسوبك هذا المفتاح لئلا تضطر إلى إدخاله في كل مرة، المهم أن إحدى أفضل مزاياه هي التحكم الدقيق في الصلاحيات حيث تستطيع تقييد الوصول ليكون للقراءة فقط أو اقتصار الصلاحيات على مستودعات معينة، وكذلك نستطيع استخدام مصادقة أداة GitHub CLI مع هذا المفتاح من خلال إعطاء المفتاح للأداة عبر الإدخال القياسي standard input.
</p>

<p>
	لنفرض أنك حفظت المفتاح في ملف باسم <code>mytoken.txt</code>، نستطيع حينها إثبات هويتنا عبر واجهة أوامر GitHub كما يلي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4296_28" style=""><span class="pln">$ gh auth login --with-token &lt; mytoken.txt</span></pre>

<p>
	تستطيع إبطال صلاحية مفتاح معين إذا فقدت الوصول إلى الحاسوب المحفوظ عليه بسرقة أو ضياع، تمامًا كما في حالة مفاتيح <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr></abbr>.
</p>

<h2 id="-">
	إنشاء نسخة محلية من المستودع
</h2>

<p>
	نحتاج الآن إلى معرفة رابط المستودع كي نستنسخه:
</p>

<ol>
	<li>
		انقر على أيقونة صورتك الشخصية في الزاوية العلوية اليمنى ثم اختر Your repositories، ستظهر لك صفحة تضم جميع مستودعاتك، قد لا تجد هنا سوى المستودع <code>test-repo</code> الذي أنشأناه، فانقر على اسمه.
	</li>
	<li>
		تنتقل الآن إلى صفحة المستودع حيث تتصف الملفات الخاصة به، لكن هدفنا الأساسي هو الحصول على رابط الاستنتساخ، فانقر على زر Code الأزرق الكبير.
	</li>
</ol>

<p>
	لننسخه الآن من GitHub إلى الحاسوب المحلي، سيختلف هذا إذا كنت تستخدم GitHub CLI أو مفاتيح <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr></abbr>، لكن سنشرح الطريقتين.
</p>

<h3 id="-github-cli">
	الاستنتساخ من GitHub باستخدام CLI
</h3>

<p>
	لدينا خياران هنا:
</p>

<p>
	<strong>الخيار الأول:</strong> أشرنا سابقًا إلى تذكر أننا سنستخدم بروتوكول <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr></abbr> عندما أثبتنا هويتنا باستخدام <code>gh auth login</code>، وعليه سنختار التبويب الموافق لذلك في هذه النافذة، لكن إذا اخترت HTTPS فستختار تبويبها. انسخ الرابط واذهب إلى سطر الأوامر ونفذ الأمر:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4296_30" style=""><span class="pln"> git clone [url]</span></pre>

<p>
	حيث تضع الرابط الذي نسخته بدلًا من الأقواس، فمثلًا سيكون هكذا في حالة HTTPS:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4296_32" style=""><span class="pln">$ git clone https://github.com/user/test-repo.git</span></pre>

<p>
	وهذه في حالة <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr></abbr>:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4296_34" style=""><span class="pln">$ git clone git@github.com:user/test-repo.git</span></pre>

<p>
	<strong>الخيار الثاني: </strong>اختر تبويب GitHub CLI من القائمة المنسدلة ثم نفذ الأمر كما هو مكتوب هناك تمامًا، سيكون شبيها بالسطر التالي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4296_36" style=""><span class="pln">$ gh repo clone user/test-repo</span></pre>

<h3 id="-github-ssh">
	الاستنساخ من GitHub باستخدام مفاتيح <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr></abbr>
</h3>

<p>
	نستخدم هذه الطريقة إذا كنا أعددنا مفتاح <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr></abbr> من قبل:
</p>

<ol>
	<li>
		تأكد من اختيار تبويب <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr></abbr> بعد النقر على زر Code الأخضر.
	</li>
	<li>
		انسخ هذا الرابط.
	</li>
	<li>
		انتقل إلى سطر الأوامر ونفذ الأمر <code>git clone [URL]</code> حيث تضع الرابط الذي نسخته بدلًا من الأقواس بحيث يكون كالتالي:
	</li>
</ol>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4296_38" style=""><span class="pln">$ git clone git@github.com:user/test-repo.git</span></pre>

<h2 id="-">
	إجراء التعديلات ودفع الملفات إلى المستودع البعيد
</h2>

<p>
	ننتقل الآن إلى مجلد المستودع بعد استنساخه باستخدام الأمر <span style="font-family:Courier New,Courier,monospace;">git clone</span>، ثم ندخل إليه باستخدام الأمر
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8970_7" style=""><span class="pln">cd اسم المجلد</span></pre>

<p>
	ونعدّل أحد الملفات، وبعد ذلك نضيفه إلى منطقة التحضير stage باستخدام:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8970_9" style=""><span class="pln">git add اسم الملف</span></pre>

<p>
	ثم ننفذ عملية إيداع باستخدام:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8970_11" style=""><span class="pln">git commit -m "message"</span></pre>

<p>
	وأخيرًا لدفعه إلى النسخة البعيدة على GitHub مرة أخرى:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4296_44" style=""><span class="pln">git push</span></pre>

<p>
	يجب أن نرى هذه التغييرات الآن إذا عدنا إلى صفحة المستودع على GitHub وأعدنا تحميل الصفحة.
</p>

<p>
	هذا يعيدنا إلى <a href="https://academy.hsoub.com/programming/workflow/git/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D9%86%D8%B8%D8%A7%D9%85-git-%D9%84%D9%84%D8%AA%D8%AD%D9%83%D9%85-%D9%81%D9%8A-%D8%A7%D9%84%D8%A5%D8%B5%D8%AF%D8%A7%D8%B1%D8%A7%D8%AA-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A9-r2606/" rel="">مسار العمل الشائع على نظام Git</a>:
</p>

<ol>
	<li>
		استنساخ مستودع بعيد
	</li>
	<li>
		إجراء بعض التعديلات على النسخة المحلية.
	</li>
	<li>
		إضافة التغييرات إلى منطقة التحضير.
	</li>
	<li>
		تسجيل هذه التغييرات وإيداعها من خلال عملية commit.
	</li>
	<li>
		دفع هذه التغييرات إلى المستودع البعيد.
	</li>
	<li>
		العودة مرة أخرى إلى الخطوة رقم 2.
	</li>
</ol>

<h2 id="-github">
	التعاون في GitHub
</h2>

<p>
	توجد طريقتان أساسيتان للتعاون في موقع GitHub هما:
</p>

<ol>
	<li>
		الاشتقاق وطلب السحب Fork/Pull Request.
	</li>
	<li>
		إضافة مساهم collaborator.
	</li>
</ol>

<p>
	الطريقة الأسهل منهما هي إضافة المساهمين مباشرة إلى مستودعك، اتبع الخطوات التالية:
</p>

<ol>
	<li>
		اختر الإعدادات Settings.
	</li>
	<li>
		اختر collaborators من القائمة الجانبية اليسرى.
	</li>
	<li>
		أكد هويتك ثم انقر على زر Add people.
	</li>
	<li>
		أدخل اسم المستخدم للشخص الذي تريد التعاون معه.
	</li>
</ol>

<p>
	يجب أن يقبل المساهم دعوتك من الرسالة التي وصلته على حسابه في GitHub ليحصل على صلاحية الوصول إلى مستودعك، لكن انتبه إلى إعطاء صلاحية الوصول إلى من تثق فيه فقط لأنه سيملك صلاحية التعديل في الملفات الموجودة في المستودع.
</p>

<h2 id="-">
	خاتمة
</h2>

<p>
	تعرفنا في هذا المقال على أساسيات موقع GitHub وكيفية إنشاء حساب فيه، وكذلك إنشاء مستودع بعيد واستنساخه إلى حاسوبك المحلي، وإجراء تعديلات فيه ثم دفعه مرة أخرى إلى موقع GitHub.
</p>

<h2 id="-">
	اقرأ أيضًا
</h2>

<ul>
	<li>
		<a href="https://academy.hsoub.com/programming/workflow/git/%D8%A5%D9%86%D8%B4%D8%A7%D8%A1-%D8%B7%D9%84%D8%A8-%D8%B3%D8%AD%D8%A8-%D8%B9%D9%84%D9%89-github-r1581/" rel=""><strong>إنشاء طلب سحب على GitHub</strong></a>
	</li>
	<li>
		<strong><a href="https://academy.hsoub.com/programming/workflow/git/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D9%86%D8%B8%D8%A7%D9%85-git-%D9%84%D9%84%D8%AA%D8%AD%D9%83%D9%85-%D9%81%D9%8A-%D8%A7%D9%84%D8%A5%D8%B5%D8%AF%D8%A7%D8%B1%D8%A7%D8%AA-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A9-r2606/" rel="">أساسيات نظام Git للتحكم في الإصدارات البرمجية</a></strong>
	</li>
</ul>

<p>
	ترجمة -بتصرف- <a href="https://beej.us/guide/bggit/html/#github-how-to-use-it" rel="external nofollow">للفصل الثاني من دليل Beej إلى Git</a> لصاحبه Brian “Beej Jorgensen” Hall
</p>
]]></description><guid isPermaLink="false">2607</guid><pubDate>Sun, 05 Apr 2026 13:04:00 +0000</pubDate></item><item><title>&#x623;&#x633;&#x627;&#x633;&#x64A;&#x627;&#x62A; &#x646;&#x638;&#x627;&#x645; Git &#x644;&#x644;&#x62A;&#x62D;&#x643;&#x645; &#x641;&#x64A; &#x627;&#x644;&#x625;&#x635;&#x62F;&#x627;&#x631;&#x627;&#x62A; &#x627;&#x644;&#x628;&#x631;&#x645;&#x62C;&#x64A;&#x629;</title><link>https://academy.hsoub.com/programming/workflow/git/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D9%86%D8%B8%D8%A7%D9%85-git-%D9%84%D9%84%D8%AA%D8%AD%D9%83%D9%85-%D9%81%D9%8A-%D8%A7%D9%84%D8%A5%D8%B5%D8%AF%D8%A7%D8%B1%D8%A7%D8%AA-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A9-r2606/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2026_03/git.png.01e46e5bb90ee4a7c4b825c852fa0065.png" /></p>
<p>
	يرى العديد من المبتدئين في مجال البرمجة أن نظام إدارة المشاريع البرمجية Git صعب أو معقد أكثر من اللازم، ورغم أنه حقًا يبدو معقدًا إلا أننا سننتقل بك في هذا الدليل من المستوى المبتدئ إلى المتوسط من خلال استخدام النظام عمليًا أثناء شرحنا له، بدءًا بمزج بعض الأوامر البسيطة مع قليل من فكرة العمل التي بني عليها، ثم ننظر في الأمور التي نستطيع تنفيذها به، وسيكون هذا المقال عن أساسيات النظام نفسه ومبدأ عمله.
</p>

<p>
	يساعدك هذا الدليل على معرفة قواعد وأوامر Git في بيئة سطر الأوامر وبناء تصور لفهم كيفية تخزينه للبيانات، ذلك أنك تحتاج إلى معرفة ما يدور خلف الكواليس في هذا النظام من أجل إتقان استخدامه، بدلًا من الحصول السهل على الأوامر الشائعة بالبحث في الإنترنت أو استخدام أدوات الذكاء الاصطناعي.
</p>

<h2 id="-">
	الفئة المستهدفة
</h2>

<p>
	يستهدف برايان "بيج جورجينسن" هول Brian “Beej Jorgensen” Hall -مؤلف الدليل- طلاب الجامعة بشكل رئيسي لكن أسلوب الشرح مصمم بحيث يستطيع غيرهم من المبتدئين في البرمجة أن يستفيدوا منه أيضًا، وإن كنا نفترض معرفتك بكيفية التعامل مع سطر الأوامر في طرفيات POSIX مثل Bash أو Zsh وغيرهما، أي تعرف الأوامر الأساسية مثل <code>cd, ls, mkdir, cp</code> وغيرها، وكذلك تثبيت البرامج التي نتعرض لها أثناء الشرح.
</p>

<p>
	ننصح باستخدام أحد أنظمة لينكس في تعلمك لنظام Git ورحلتك البرمجية عمومًا لأنها تُعد أنظمة شبيهة بيونكس UNIX LIKE من حيث موافقتها لمعايير POSIX لنظم التشغيل من ناحية، وجاهزيتها للأدوات والمكتبات البرمجية من ناحية أخرى، أو استخدام أنظمة أخرى شبيهة بيونكس مثل FreeBSD أو ماك، لكن إن كنت تستخدم ويندوز فإن نظام Git يأتي مع طرفية تسمى Git Bash، كما تستطيع تثبيت <a href="https://learn.microsoft.com/en-us/windows/wsl/" rel="external nofollow">WSL</a>.
</p>

<h3 id="-git">
	ما هو نظام Git
</h3>

<p>
	يوصف Git بأنه نظام للتحكم في الشيفرات المصدرية Source code أو الإصدارات البرمجية حيث يحتفظ بسجل من اللقطات snapshots لملفات المشروع بحيث تمثل كل لقطة منها حالة جميع الملفات التي يتتبعها النظام في لحظة زمنية ما، فتستطيع بهذا أن تعود إلى نقطة زمنية معينة أثناء العمل على المشروع لتعاينها.
</p>

<p>
	فإذا عملت على المشروع وأجريت بعض التغييرات لإضافة ميزة جديدة مثلًا، تستطيع إيداع تلك التغييرات حين تكون جاهزة إلى مستودع ملفات المشروع فيما يعرف بعملية commit، وهو المكان الذي تحفظ فيه شيفرة العمل، وهكذا تكون تلك التغييرات متاحة في المستودع repository للاطلاع عليها لمن له وصول إليه، كزملائك في العمل مثلًا.
</p>

<p>
	ويحتفظ نظام Git بسجل لجميع عمليات الإيداع التي حدثت في المشروع كي ترجع إليها إذا غيرت شيئًا بالخطأ أو أردت معرفة كيفية تنفيذ شيفرة سبق العمل عليها، كذلك يُستخدم Git كآلية نسخ احتياطي عن بعد، ويسهل التعاون بين عدة أشخاص إذا كانوا يعملون على قاعدة بيانات مشتركة.
</p>

<h4 id="-">
	اصطلاحات
</h4>

<p>
	<strong>نظام التحكم في الإصدارات أو نظام التحكم في الشيفرة المصدرية</strong>: هو برنامج يدير التغييرات التي تحدث في مشروع برمجي قد يكون فيه آلاف الملفات التي يكتبها أو يحررها مئات المطورين، ونظام Git هو أحد هذه الأنظمة، لكن يوجد غيره أيضًا.
</p>

<ul>
</ul>

<p>
	<strong>المستودع Repo/Repository</strong>: هو المكان الذي يُحفظ فيه مشروع برمجي ما داخل Git، ويكون لكل مشروع في العادة مستودع خاص، فقد تنشئ مستودعًا من أجل مشروع جديد تعمل عليه، ويكون إما موجودًا على حاسوبك الشخصي أو على حواسيب بعيدة.
</p>

<p>
	<strong>المستودع البعيد Remote Repo</strong>: هو نسخة من مستودع في مكان غير حاسوبك المحلي.
</p>

<p>
	<strong>الاستنساخ Clone</strong>: أن تنشئ نسخة محلية على حاسوبك من مستودع بعيد remote repo، وتسمى هذه النسخة نفسها clone أيضًا.
</p>

<p>
	<strong>شجرة العمل Working Tree</strong>: الدليل أو المجلد الذي تعدل فيه ملفات المشروع، تُنشأ هذه الشجرة عند إنشاء نسخة clone من المستودع.
</p>

<p>
	<strong>منطقة التحضير Stage</strong>: هي المكان الذي تضيف فيه الملفات التي تريد تحضيرها لعملية الإيداع commit، فإذا عدلت بعض الملفات لكن لم تضفها هنا أولًا فلن تشملها عملية الإيداع.
</p>

<p>
	<strong>الفهرس Index</strong>: اسم آخر أقل شيوعًا لمنطقة التحضير.
</p>

<p>
	<strong>الإيداع Commit</strong>: هو لقطة لحالة المشروع في لحظة معينة، تتضمن التعديلات التي أُضيفت إلى منطقة التحضير، ويُستخدم لتوثيق التغييرات وتتبعها عبر الزمن.
</p>

<p>
	أمثلة على رسائل الإيداع:
</p>

<ul>
	<li>
		إضافة الميزة س إلى القاعدة البرمجية
	</li>
	<li>
		إصلاح خطأ ص
	</li>
	<li>
		دمج تغييرات مساهمين آخرين في الشيفرة
	</li>
</ul>

<h3 id="-github">
	ما هو GitHub
</h3>

<p>
	هو موقع إلكتروني يوفر واجهة أمامية للكثير من مزايا Git إضافة إلى بعض المزايا الخاصة بـ GitHub نفسه كما يوفر مساحة تخزين سحابية لمستودعك ليغنيك عن إنشاء نسخة احتياطية، فيمكن القول أنه تطبيق ويب يعمل كواجهة أمامية لنظام Git ويتعامل مع نسخة مستودعك الموجودة في خوادم GitHub.
</p>

<blockquote class="ipsQuote" data-gramm="false" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<div class="ipsQuote_contents ipsClearfix" data-gramm="false">
		<p>
			ربما تكون قد سمعت عن <a href="https://about.gitlab.com/" rel="external nofollow">GitLab</a> أو <a href="https://docs.gitea.com/" rel="external nofollow">Gitea</a>، وهما منافسان لموقع GitHub، مع ميزة لموقع Gitea أنه مفتوح المصدر ويمكنك تشغيل واجهة تشبه GitHub على خادمك الخاص.
		</p>
	</div>
</blockquote>

<p>
	سيكون لديك أيضًا نسخ من المستودعات المخزنة محليًا على حاسوبك لتعمل عليها تعرف باسم Clones، مستقلة عن المستودعات الموجودة على GitHub، ثم تزامن أنت هذه النسخ من حاسوبك مع GitHub دوريًا أثناء مسار عملك المعتاد.
</p>

<h3 id="-git">
	مسار عمل بسيط في Git
</h3>

<p>
	يوجد عدة مسارات عمل قد تتبعها أثناء عملك مع Git، منها ما يكثر استخدامه ومنها الذي قد لا تستخدمه إلا نادرًا، فيما يلي أحد المسارات الشائعة:
</p>

<ol>
	<li>
		الاستنساخ clone: في البداية تنسخ مستودعًا بعيدًا، أي ليس محفوظًا على حاسوبك المحلي، يكون في العادة على GitHub.
	</li>
	<li>
		مرحلة التعديل: تنفذ بعض التغييرات في شجرة العمل working tree، وهي المكان الذي توجد فيه ملفات المشروع على جهازك.
	</li>
	<li>
		الإضافة إلى الفهرس: تضيف بعدها تلك التغييرات إلى منطقة التحضير stage، والتي تعرف أيضًا بالفهرس Index.
	</li>
	<li>
		الإيداع Commit: تودع هذه التغييرات لتسجيلها كلقطة snapshot.
	</li>
	<li>
		مرحلة الدفع Push: ادفع اللقطة التي سجلتها لنقلها إلى المستودع البعيد.
	</li>
	<li>
		عد إلى الخطوة رقم 2 وكرر المسار.
	</li>
</ol>

<h3 id="-">
	ما هو الاستنساخ
</h3>

<blockquote>
	<blockquote class="ipsQuote" data-gramm="false" data-ipsquote="">
		<div class="ipsQuote_citation">
			اقتباس
		</div>

		<div class="ipsQuote_contents ipsClearfix" data-gramm="false">
			<p>
				<strong>نظام التحكم الموزَّع في الإصدارات Distributed version control system</strong>
			</p>

			<p>
				هو نظام تتواجد فيه نسخ متعددة clones من المستودعات ولا توجد فيه سلطة مركزية للبيانات، فحين تنسخ مستودعًا يكون لديك نسختين منه، واحدة بعيدة remote، وأخرى على حاسوبك المحلي، وهي نسخ مستقلة بذاتها بمعنى أن التعديلات التي تجريها في نسختك المحلية لا تؤثر في النسخة البعيدة إلا إذا رغبت أن تتفاعل النسختين مع بعضهما البعض وربطتهما بنفسك.
			</p>
		</div>
	</blockquote>
</blockquote>

<p>
	يُعد Git في ضوء هذا التعريف نظام تحكم موزع في الإصدارات، هذا يعني أنه لا توجد سلطة واحدة مركزية للبيانات على عكس الأنظمة الأخرى للتحكم في الإصدارات، مع أن مستخدمي Git يعاملون GitHub على أنه نظام موزع كذلك.
</p>

<p>
	يعتمد Git هيكلًا من نُسخ المستودعات بدلًا من نظام السلطة المركزية، وهي نسخ كاملة ومستقلة فيها سجل بجميع الإيداعات لكل مستودع، فيمكن إعادة إنشاء أي نسخة من نسخة أخرى غيرها، وتتساوى جميع النسخ في الإمكانيات فلا توجد نسخة أقوى أو أفضل من غيرها.
</p>

<p>
	إذا راجعنا مسار العمل الذي ذكرناه قبل قليل سنرى أن استنساخ المستودع هو الخطوة الأولى، وإذا كنا نستنسخ المستودع من GitHub فهذا يعني إنشاء نسخة محلية من مستودع كامل في GitHub، ورغم أننا نستطيع إنشاء أي عدد نريد من النسخ إلا أن هذه عملية تتم مرة واحدة في العادة.
</p>

<h3 id="-">
	كيف تتفاعل النسخ مع بعضها
</h3>

<p>
	هناك عمليتان رئيسيتان نستخدمهما بعد إنشاء نسخة ما:
</p>

<ul>
	<li>
		الدفع Push: تأخذ عملية الدفع اللقطات التي أودعتها على حاسوبك المحلي وترفعها إلى المستودع البعيد.
	</li>
	<li>
		السحب Pull: بالعكس، تأخذ عملية السحب اللقطات الموجودة في المستودع البعيد وتنزلها إلى حاسوبك المحلي.
	</li>
</ul>

<p>
	كما توجد عملية أخرى تحدث خلف الكواليس هي عملية الدمج merge، وينبغي أن تعلم أن تعديلاتك التي تجريها على نسختك المحلية لن تظهر في المستودع البعيد إلا عندما تدفع بذلك التغيير إلى المستودع البعيد، وبالمثل لن تظهر التعديلات الموجودة في المستودع البعيد على حاسوبك المحلي إلا عند سحبك pull للقطة الموجودة في المستودع.
</p>

<h3 id="-git">
	الاستخدام الفعلي لنظام Git
</h3>

<p>
	يفترض هذا القسم أن أدوات سطر أوامر Git مثبتة لديك وأنك ستستخدم إحدى طرفيات يونكس مثل Bash أو Zsh.
</p>

<blockquote>
	<blockquote class="ipsQuote" data-gramm="false" data-ipsquote="">
		<div class="ipsQuote_citation">
			اقتباس
		</div>

		<div class="ipsQuote_contents ipsClearfix" data-gramm="false">
			<p>
				من أين تحصل على هذه الطرفيات؟
			</p>

			<p>
				إذا كنت تستخدم أحد الأنظمة الشبيهة بنظام يونكس، مثل لينكس أو BSD أو يونكس أو ماك فهي تأتي مع النظام، أما في حالة ويندوز فننصح بتثبيت <a href="https://learn.microsoft.com/en-us/windows/wsl/" rel="external nofollow">نظام ويندوز الفرعي للينكس</a>، أو استخدام طرفية Git Bash التي تأتي مع نظام Git.
			</p>
		</div>
	</blockquote>
</blockquote>

<p>
	سنفترض في حالتنا هنا أن لدينا مستودعًا في GitHub ونريد نسخه، وعليه سنمر بالخطوات التي ذكرناها قبل قليل، لكن سنضيف إليها خطوة جديدة تسبقها:
</p>

<h4 id="-0-">
	الخطوة 0: إعداد بياناتك لأول مرة
</h4>

<p>
	يجب أن تخبر النظام باسمك وبريدك الإلكتروني في أول مرة تستخدمه لأنها ستُضاف إلى كل اللقطات التي تودعها في المستودع، ويمكن تغيير هذه البيانات في أي وقت لاحقًا أو تخصيص تلك البيانات لتكون مختلفة لكل مستودع، أما لغرض هذا المثال فسنختار اسمك وعنوان البريد كبيانات عامة لنظام Git، أدخل كليهما في سطر الأوامر لضبط اسمك وبريدك الإلكتروني.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1418_8" style=""><span class="pln">$ git config set --global user.name "اسمك"
$ git config set --global user.email "بريدك الإلكتروني"</span></pre>

<blockquote>
	<blockquote class="ipsQuote" data-gramm="false" data-ipsquote="">
		<div class="ipsQuote_citation">
			اقتباس
		</div>

		<div class="ipsQuote_contents ipsClearfix" data-gramm="false">
			<p>
				إذا أردت تغيير الاسم أو عنوان البريد لاحقًا فكرر الأمرين في المثال السابق.
			</p>
		</div>
	</blockquote>
</blockquote>

<p>
	لا تنسخ المحث <code>$</code> في المثال أعلاه فهو يتغير وفقًا للطرفية التي تستخدمها، فقد يكون <code>$</code> أو <code>#</code> أو <code>%</code>، ونحن نضيفه في هذه الأمثلة ليدل على أن السطر الذي بعده يُكتب في الطرفية أو سطر الأوامر.
</p>

<p>
	أخيرًا، نحدد اسم الفرع الافتراضي default branch ليكون <code>main</code> من خلال الأمر التالي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1418_10" style=""><span class="pln">$ git config set --global init.defaultBranch main</span></pre>

<p>
	سيكون الفرع الافتراضي هو المسار الرئيسي أو نقطة البداية الرسمية لأي مشروع في Git وسيحتوي على النسخة الأساسية والمستقرة من الشيفرة المصدرية لأي مستودع، إذا كان المستودع يمثل شجرة فإن الفرع الافتراضي هو الجذع الرئيسي الذي تخرج منه بقية الأغصان "الفروع الأخرى".
</p>

<p>
	لكن اسم main ليس إجباريًا بل تستطيع اختيار ما شئت، حيث تسمى بعض المستودعات <code>master</code> مثلًا للفرع الرئيسي أو <code>main</code> و <code>trunk</code> و <code>development</code>، وكلها من الأسماء الشائعة للفروع الرئيسية للمستودعات.
</p>

<h4 id="-1-">
	الخطوة 1: استنساخ مستودع
</h4>

<p>
	سننسخ الآن مستودعًا بعيدًا لنتدرب ، ولا تقلق من تعطل هذا المستودع بسبب خطأ منك لأن النظام يحميه، فانتقل في سطر الأوامر إلى الدليل الذي تريد إنشاء النسخة داخله ثم نفذ هذا الأمر.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1418_12" style=""><span class="pln">$ git clone https://github.com/beejjorgensen/git-example-repo.git</span></pre>

<p>
	ستلاحظ ظهور مخرجات مثل هذه:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1418_14" style=""><span class="pln">Cloning into 'git-example-repo'...
remote: Enumerating objects: 10, done.
remote: Counting objects: 100% (10/10), done.
remote: Compressing objects: 100% (8/8), done.
remote: Total 10 (delta 2), reused 9 (delta 1), pack-reused 0
remote: (from 0)
Receiving objects: 100% (10/10), done.
Resolving deltas: 100% (2/2), done.</span></pre>

<p>
	ينبغي أن يكون لدينا المستودع على الحاسوب المحلي الآن، لقد افترضنا في هذا المثال أن المستودع البعيد هو الموجود أولًا ونسخناه إلى الحاسوب، لكن هذه ليست الحالة الوحيدة لاستخدام نظام Git، فأحيانًا ينشئ المطورون المستودع المحلي أولًا ثم يربطونه بمستودع بعيد. لنلقي الآن نظرة على المستودع المحلي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1418_16" style=""><span class="pln">$ cd git-example-repo
$ ls -la</span></pre>

<p>
	ستظهر الملفات التي يحتوي عليها المستودع كما يلي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1418_18" style=""><span class="pln">os@machine:~$ cd git-example-repo
os@machine:~/git-example-repo$ ls -la
total 20
drwxr-xr-x  3 os os 4096 فبر 23 17:29 .
drwxr-xr-x 22 os os 4096 فبر 24 00:09 ..
drwxr-xr-x  8 os os 4096 فبر 24 00:01 .git
-rwxr-xr-x  1 os os  175 فبر 24 00:09 hello.py
-rw-r--r--  1 os os  162 فبر 23 17:29 README.md</span></pre>

<p>
	نلاحظ في خرج الأمر أعلاه أن المستودع يحتوي على الملفين <code>hello.py</code> و <code>README.md</code> إضافة إلى المجلد <code>‎.git</code> الذي يخزن فيه نظام Git جميع البيانات الوصفية meta data والإيداعات commits الخاصة بالمشروع، وينبغي تجنب العبث بملفات هذا المجلد أو تعديلها لأن وجوده هو ما يمنح المجلد الرئيسي صفة "مستودع Git". نستخدم الأمر <code>status</code> لمعرفة حالة المستودع المحلي كما يلي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1418_20" style=""><span class="pln">$ git status</span></pre>

<p>
	فتظهر لنا النتيجة التالية:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1418_22" style=""><span class="pln">On branch main
Your branch is up to date with 'origin/main'.
nothing to commit, working tree clean</span></pre>

<p>
	تخبرنا هذه النتيجة معلومات كثيرة عن حالة المستودع الراهنة، حيث نعرف منها ما يلي:
</p>

<ul>
	<li>
		يخبرنا السطر الأول أننا الآن في الفرع الرئيسي <code>main</code>.
	</li>
	<li>
		في السطر الثاني نعرف أن الفرع المحلي main متطابق ومحدّث مع النسخة البعيدة منه origin/main، أي لا يوجد أي اختلاف بينهما. لاحظ أن الفرع في نظام Git يمثل مرجعًا يشير إلى إيداع محدد، تمامًا كورقة ملاحظات توضع على هذه اللقطة من الشيفرة، وتمثل هذه اللقطة بدورها صورة لحالة الشيفرة في وقت معين.
	</li>
</ul>

<p>
	بالعودة إلى السطر الثاني نرى كلمة <code>origin</code> وهي مجرد اسم يشير إلى المستودع البعيد الذي أخذنا منه نسختنا وعليه فإن <code>origin/main</code> تعني فرع <code>main</code> من المستودع الأصلي الذي أخذت منه نسختك، وهذا يقودنا إلى ملاحظة أخرى وهي أن لدينا فرعين <code>main</code> هنا، واحد على المستودع المحلي والآخر على المستودع البعيد.
</p>

<p>
	ذكرنا من قبل أن النسخ تكون مستقلة بذاتها بمعنى أن التعديلات التي نجريها على نسخة ما لا تظهر تلقائيًا في نسختها الأخرى، وعليه نستطيع تعديل الفرع المحلي دون أن يتأثر فرع المستودع البعيد طالما لم ندفع تلك التغييرات إلى المستودع البعيد عن طريق <code>push</code>.
</p>

<h4 id="-">
	الخطوة الثانية: إجراء تعديلات على المستودع المحلي
</h4>

<p>
	لنحرر الآن أحد الملفات ونجري عليه بعض التعديلات، مرة أخرى لا تقلق بشأن تخريب بيانات المستودع البعيد فنحن لا نملك صلاحيات ذلك أصلًا. افتح الشيفرة في محرر النصوص الذي تفضله، وإذا كان محررك النصي هو VS Code فتستطيع تشغيله مباشرة في المجلد الحالي كما يلي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1418_25" style=""><span class="pln">$ code .</span></pre>

<p>
	لنعدّل الآن في ملف <code>hello.py</code> الذي كانت بياناته الأصلية كما يلي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_1418_29" style=""><span class="com">#!/usr/bin/env python</span><span class="pln">

</span><span class="kwd">print</span><span class="pun">(</span><span class="str">"Hello World!"</span><span class="pun">)</span><span class="pln">
</span><span class="kwd">print</span><span class="pun">(</span><span class="str">"This is my program!"</span><span class="pun">)</span></pre>

<p>
	أضف الآن سطرًا يمثل تعديلًا جديدًا:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_1418_31" style=""><span class="com">#!/usr/bin/env python</span><span class="pln">

</span><span class="kwd">print</span><span class="pun">(</span><span class="str">"Hello World!"</span><span class="pun">)</span><span class="pln">
</span><span class="kwd">print</span><span class="pun">(</span><span class="str">"This is my program!"</span><span class="pun">)</span><span class="pln">
</span><span class="kwd">print</span><span class="pun">(</span><span class="str">"And this is my modification!"</span><span class="pun">)</span></pre>

<p>
	احفظ الآن هذا الملف، ولنسأل Git عن الحالة الجديدة للمستودع عن طريق الأمر <code>status</code>:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1418_33" style=""><span class="pln">$ git status</span></pre>

<pre><code>في النتيجة هذه المرة سنحصل على:
  </code></pre>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1418_37" style=""><span class="pln">On branch main
Your branch is up to date with 'origin/main'.

Changes not staged for commit:
(use "git add </span><span class="tag">&lt;file&gt;</span><span class="pln">..." to update what will be committed)
  (use "git restore </span><span class="tag">&lt;file&gt;</span><span class="pln">..." to discard changes in working
  directory)
  modified:   hello.py

 no changes added to commit (use "git add" and/or "git commit -a")</span></pre>

<p>
	نرى من هذه الحالة الجديدة الآن ما يلي:
</p>

<p>
	اكتشف Git أننا عدلنا على ملف <code>hello.py</code> تحديدًا لكنه يقول أيضًا <code>no changes added to commit</code> ، وهذا يعني أننا لم نضف الملف المعدل إلى منطقة التحضير stage التي نضع فيها العناصر التي نريد إرسالها في عملية الإيداع، لكن نريد مراجعة التغييرات أولًا قبل إرسالها، وهو ما سنفعله الآن باستخدام أداة <code>git diff</code>.
</p>

<p>
	ترينا هذه الأداة -التي هي اختصار لكلمة difference- التفاصيل التي تغيرت في الملفات لكن مخرجاتها قد تكون غامضة بعض الشيء، انظر المثال التالي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1418_39" style=""><span class="pln">$ git diff</span></pre>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1418_41" style=""><span class="pln"> diff --git a/hello.py b/hello.py
  index 9db78d2..1187d32 100755
  --- a/hello.py
  +++ b/hello.py
  @@ -2,3 +2,4 @@

   print("Hello, world!")
   print("This is my program!")
  +print("And this is my modification!")</span></pre>

<p>
	ملخص ما تريد الاطلاع عليه هو ما يلي:
</p>

<ol>
	<li>
		اسم الملف: حيث نرى أن التعديل جرى على الملف <code>hello.py</code>.
	</li>
	<li>
		السطر الذي يبدأ بعلامة <code>+</code> وهو الذي أضفناه.
	</li>
</ol>

<p>
	أما علامة <code>-</code> إذا جاءت في بداية السطر فهي تشير أن السطر قد حُذف، ورغم أننا لم نحذف السطر كله بل عدلناه فقط إلا أن نظام Git يظهر الأسطر المعدلة كأنها محذوفة ثم أضيفت كأسطر جديدة. 
</p>

<h4 id="-3-">
	الخطوة 3: إضافة التعديلات إلى منطقة التحضير
</h4>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1418_45" style=""><span class="pln">no changes added to commit (use "git add" and/or "git commit -a")</span></pre>

<p>
	في هذه المرحلة لم نقم بعد بإضافة التعديلات إلى منطقة التحضير، لذلك يخبرنا Git بعدم وجود تغييرات جاهزة للإيداع، ونحن نعلم أننا عدلنا الملف <code>hello.py</code> ونريد أن ننفذ عملية إيداع تجسد تلك التعديلات الجديدة لذا سنضيف الملف أولًا إلى منطقة التحضير باستخدام <code>git add</code>:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1418_47" style=""><span class="pln">os@machine:~/git-example-repo$ git add hello.py
os@machine:~/git-example-repo$ git status
On branch main
Your branch is up to date with 'origin/main'.

Changes to be committed:
  (use "git restore --staged </span><span class="tag">&lt;file&gt;</span><span class="pln">..." to unstage)
        modified:   hello.py</span></pre>

<p>
	لقد تغيرت الرسالة الآن من <code>Changes not staged for commit</code> إلى <code>Changes to be committed</code>، وهذا يعني أننا نجحنا في نسخ الملف <code>hello.py</code> إلى منطقة التحضير.
</p>

<p>
	نرى رسالة أخرى في السطر قبل الأخير حول كيفية إلغاء تحضير الملف، فإذا فرضنا أننا أضفناه دون قصد ونريد حذفه منها وعدم تضمينه في الإيداع الذي سنرسله، فما علينا إلا تنفيذ الأمر التالي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1418_50" style=""><span class="pln">$ git restore --staged hello.py</span></pre>

<p>
	وسيعود الملف إلى مرحلة <code>Changes not staged for commit</code>.
</p>

<h4 id="-4-">
	الخطوة 4: إيداع التعديلات
</h4>

<p>
	نستطيع الآن تنفيذ عملية إيداع commit بما أننا نسخنا الملف إلى منطقة التحضير، ونعيد التذكير هنا أن هذا الإيداع يمثل لقطة snapshot لحالة المستودع بناء على الملفات المعدلة الموجودة في منطقة التحضير فقط -إضافةً إلى الملفات التي لم نعدلها-، أما الملفات التي عدلناها ثم لم نضفها إلى منطقة التحضير فلا تدخل في عملية الإيداع. هذا يعني أن عملية الإيداع تمثل حالة كاملة للمشروع، حيث تتضمن التعديلات التي أُضيفت إلى منطقة التحضير، بينما تبقى الملفات غير المعدلة كما هي من الإيداع السابق دون تغيير.
</p>

<p>
	نلاحظ أن النظام أظهر لنا الملفات التي عدلنا عليها فقط وليس الملفات غير المعدلة، هذا مقصود لأن إظهار الملفات غير المعدلة سيجعل القائمة طويلة جدًا وغير مفيدة، خاصة في حالة المشاريع الكبيرة. لتنفيذ عملية الإيداع نكتب ما يلي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1418_52" style=""><span class="pln">$ git commit -m "Add another print line"
[main a3c7285] Add another print line
   1 file changed, 1 insertion(+)</span></pre>

<p>
	يسمح الخيار <code>‎-m</code> بتحديد رسالة الإيداع مباشرة -التي بين علامات التنصيص- أما إذا لم نضفها فسيفتح Git محرر نصي لتعديل رسالة الإيداع، وإذا فتحت هذا المحرر فاعلم أن كل رسالة إيداع تبدأ بعلامة <code>#</code> هي تعليق يتجاهله Git عند تسجيل اللقطة، لنتحقق مرة أخرى من حالة المستودع:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1418_54" style=""><span class="pln">$ git status
On branch main
Your branch is ahead of 'origin/main' by 1 commit.
  (use "git push" to publish your local commits)

nothing to commit, working tree clean</span></pre>

<p>
	تعني الرسالة في السطر الأخير أنه لا توجد أي تعديلات محلية عير مسجلة في الفرع الحالي، لكن تجدر الإشارة هنا إلى أننا نستطيع إيداع ملف عدلناه مباشرة دون إضافته إلى منطقة التحضير عن طريق كتابة اسمه صراحة في سطر الأوامر، وهو اختصار بسيط لعملية الإيداع من المفيد تعلمه.
</p>

<p>
	فمثلًا، نستطيع إيداع ملف وليكن <code>foo.txt</code> دون إضافته إلى منطقة التحضير عن طريق ما يلي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1418_56" style=""><span class="pln">$ git commit -m "jerbify the flurblux" foo.txt</span></pre>

<p>
	ينشئ هذا الأمر لقطة أو عملية إيداع فورًا متجاوزًا عملية الإضافة إلى منطقة التحضير، لكن اعلم أنك لا تستطيع فعل هذا إلا مع الملفات التي يعرفها المستودع ويتتبعها، ويصلح تنفيذ هذا على ملف واحد أو عدة ملفات أو حتى مجلد كامل دون التأثير على الملفات التي قد تكون موجودة بالفعل في منطقة التحضير.
</p>

<p>
	إذا عدنا إلى مخرجات <code>status</code> مرة أخرى سنرى أننا متقدمون على <code>origin/main</code> بعملية إيداع واحدة أو لقطة واحدة، وهذا يعني أن سجل الإيداع المحلي على فرع <code>main</code> يحتوي على لقطة ليست في سجل <code>main</code> الخاص بالمستودع البعيد، وهذا منطقي نظرًا لأن المستودع البعيد يمثل نسخة مستقلة تمامًا عن النسخة المحلية التي على حاسوبنا، ولا تتأثر به إلا إذا حاولنا عمدًا أن نزامن النسختين، أما عدا هذا فلن يعرف المستودع البعيد أننا أجرينا تعديلات محلية.
</p>

<p>
	يمثل Git دور المساعد الذكي حيث ينصحنا في الرسالة الظاهرة بين قوسين من المثال أعلاه بتنفيذ الأمر <code>git push</code> إذا أردنا تحديث المستودع البعيد ليستقبل التعديلات التي أجريناها لتتطابق النسختان معًا، وهو ما سنفعله في الخطوة التالية.
</p>

<h4 id="-5-">
	الخطوة 5: رفع التعديلات إلى المستودع البعيد
</h4>

<p>
	ننفذ الأمر <code>git push</code> لنرفع تعديلاتنا المحلية إلى المستودع البعيد:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1418_58" style=""><span class="pln">$ git push</span></pre>

<p>
	تظهر لنا النتيجة التالية:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1418_60" style=""><span class="pln">Username for 'https://github.com':</span></pre>

<p>
	ستحتاج هنا أن تدخل اسم المستخدم الخاص بك في موقع github وكلمة المرور، لكن تقابلنا الرسالة التالية:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_1418_62" style=""><span class="pln">Username for 'https://github.com': my_username
Password for 'https://beejjorgensen@github.com': [my_password]
remote: Support for password authentication was removed on August
        13, 2021.
remote: Please see https://docs.github.com/en/get-started/getting-
        started-with-git/about-remote-repositories#cloning-with-
        https-urls for information on currently recommended modes
        of authentication.
fatal: Authentication failed for 'https://github.com/beejjorgensen/
       git-example-repo.git/'</span></pre>

<p>
	تظهر رسالة الفشل <code>fatal: Authentication failed</code> لعدة أسباب:
</p>

<ul>
	<li>
		أولًا: لا تملك تصريحًا بالكتابة أو التعديل في هذا المستودع لأنك لست صاحبه.
	</li>
	<li>
		ثانيًا: توقف دعم المصادقة بكلمات المرور التقليدية منذ 2021.
	</li>
</ul>

<p>
	لحل هذه المشكلة ينبغي أن تكون أنت مالك المستودع لتستطيع التعديل فيه، كما ينبغي أن نبحث عن وسيلة أخرى لإثبات هويتنا لموقع Github بدلًا من كلمة المرور العادية، وهو ما سنعرفه في المقال التالي من هذه السلسلة.
</p>

<h2 id="-">
	خاتمة
</h2>

<p>
	تعرفنا في هذا المقال على نظام Git للتحكم في الإصدارات وأساسياته، وتعلمنا بعض العمليات البسيطة فيه مثل الاستنساخ والرفع والإيداع وإجراء التعديلات، بما يمثل حالة استخدام بسيطة وشائعة لهذا النظام، وسنتعرف في المقال التالي من السلسلة على موقع GitHub وكيفية العمل عليه.
</p>

<h2 id="-">
	اقرأ أيضًا
</h2>

<ul>
	<li>
		<a href="https://academy.hsoub.com/programming/workflow/git/%D8%A7%D9%84%D8%AF%D9%84%D9%8I%D9%84-%D8%A7%D9%84%D9%85%D8%B1%D8%AC%D8%B9%D9%8I-%D9%84%D9%84%D8%B9%D9%85%D9%84-%D8%B9%D9%84%D9%89-%D9%86%D8%B8%D8%A7%D9%85-%D8%BA%D9%8A%D8%AA-git-r1587/" rel=""><strong>الدليل المرجعي للعمل على نظام غيت Git</strong></a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/workflow/git/%D9%85%D8%A7-%D9%87%D9%88-git%D8%9F-r1592/" rel=""><strong>ما هو Git؟</strong></a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/workflow/git/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%A7%D8%B3%D8%AA%D8%B9%D8%A7%D8%AF%D8%A9-%D8%A5%D8%B5%D8%AF%D8%A7%D8%B1%D8%A7%D8%AA-%D8%A7%D9%84%D9%85%D9%84%D9%81%D8%A7%D8%AA-%D8%A7%D9%84%D9%82%D8%AF%D9%8A%D9%85%D8%A9-%D9%81%D9%8A-%D8%AC%D9%8A%D8%AA-git-r1603/" rel=""><strong>كيفية استعادة إصدارات الملفات القديمة في جيت Git</strong></a>
	</li>
</ul>

<p>
	ترجمة -بتصرف- <a href="https://beej.us/guide/bggit/html/#git-basics" rel="external nofollow">للفصل الثاني من دليل استخدام Git</a> لصاحبه Brian “Beej Jorgensen” Hall
</p>
]]></description><guid isPermaLink="false">2606</guid><pubDate>Sat, 28 Mar 2026 13:12:00 +0000</pubDate></item><item><title>&#x631;&#x633;&#x627;&#x626;&#x644; &#x627;&#x644;&#x625;&#x64A;&#x62F;&#x627;&#x639; commits &#x627;&#x644;&#x627;&#x635;&#x637;&#x644;&#x627;&#x62D;&#x64A;&#x629; &#x627;&#x644;&#x645;&#x62A;&#x641;&#x642; &#x639;&#x644;&#x64A;&#x647;&#x627; &#x641;&#x64A; &#x646;&#x638;&#x627;&#x645; &#x627;&#x644;&#x62A;&#x62D;&#x643;&#x645; &#x641;&#x64A; &#x627;&#x644;&#x625;&#x635;&#x62F;&#x627;&#x631;&#x627;&#x62A;</title><link>https://academy.hsoub.com/programming/workflow/git/%D8%B1%D8%B3%D8%A7%D8%A6%D9%84-%D8%A7%D9%84%D8%A5%D9%8A%D8%AF%D8%A7%D8%B9-commits-%D8%A7%D9%84%D8%A7%D8%B5%D8%B7%D9%84%D8%A7%D8%AD%D9%8A%D8%A9-%D8%A7%D9%84%D9%85%D8%AA%D9%81%D9%82-%D8%B9%D9%84%D9%8A%D9%87%D8%A7-%D9%81%D9%8A-%D9%86%D8%B8%D8%A7%D9%85-%D8%A7%D9%84%D8%AA%D8%AD%D9%83%D9%85-%D9%81%D9%8A-%D8%A7%D9%84%D8%A5%D8%B5%D8%AF%D8%A7%D8%B1%D8%A7%D8%AA-r2181/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2023_11/----------.png.aa68f18ad73ef6b32c92e0b44806baf8.png" /></p>
<p>
	يعرض هذا المقال مواصفات لجعل رسائل الإيداع commit messages مقروءة للبشر ولبرامج الأتمتة على حد سواء.
</p>

<h2 id="">
	مقدمة
</h2>

<p>
	رسائل الإيداع الاصطلاحية هي مواصفات يسيرة تلتزم بها الرسائل كي تحقق شروطها، إذ توفر مجموعةً من القواعد لإنشاء سجل رسائل إيداع واضحة وصريحة، مما يجعلها أسهل لكي تستخدمها أدوات الأتمتة مباشرة.
</p>

<p>
	هذا الاصطلاح متوافق مع <a href="https://semver.org/lang/ar" rel="external nofollow">الإدارة الدلالية لنُسخ البرمجيات SemVer</a>، عن طريق وصف المميزات features، والإصلاحات fixes، والتغييرات الجذرية breaking changes في رسائل الإيداع.
</p>

<p>
	يجب أن تكون هيكلية رسائل الإيداع كما يلي:
</p>

<pre class="ipsCode">&lt;type&gt;[optional scope]: &lt;description&gt;
[optional body]
[optional footer(s)]
</pre>

<p>
	تحتوي رسالة الإيداع العناصر التالية في هيكليتها، وذلك لإيصال المعنى بدقة مع مستخدم المكتبة سواء كان بشريًا أو أداة برمجية:
</p>

<ol>
	<li>
		<strong>إصلاح <code>:fix</code></strong> رسالة إيداع من نوع <code>fix</code> تصلح أو ترقع patch الخطأ في الشيفرة البرمجية، وهذا مرتبط بمصطلح الترقيع <a href="http://semver.org/#summary" rel="external nofollow"><code>PATCH</code></a> في إدارة النسخ الدلالية Semantic Versioning.
	</li>
	<li>
		<strong>ميزة <code>:feat</code></strong> رسالة إيداع من نوع <code>feat</code> تضيف ميزة جديدة للشيفرة البرمجية، وهذا مرتبط بمصطلح الترقيم البسيط <a href="http://semver.org/#summary" rel="external nofollow"><code>MINOR</code></a> في إدارة النسخ الدلالية.
	</li>
	<li>
		<strong>تغيير جذري <code>:BREAKING CHANGE</code></strong> رسالة إيداع بتذييل <code>BREAKING CHANGE:</code> أو بإضافة <code>!</code> بعد كتابة النوع <code>type</code> أو النطاق <code>scope</code>، والتي تعرض تغييرًا جذريًا في الواجهة البرمجية. هذا مرتبط بمصطلح الترقيم الجذري <a href="http://semver.org/#summary" rel="external nofollow"><code>MAJOR</code></a> في إدارة النسخ الدلالية. يمكن أن تكون <code>BREAKING CHANGE</code> جزءًا من أي نوع في رسائل الإيداع.
	</li>
	<li>
		تعد الأنواع المختلفة عن <code>:fix</code> أو <code>:feat</code> مسموح بها، مثلًا، <a href="https://github.com/conventional-changelog/commitlint/tree/master/%40commitlint/config-conventional" rel="external nofollow">commitlint/config-conventional@</a> بناءً على <a href="https://github.com/angular/angular/blob/22b96b9/CONTRIBUTING.md#-commit-message-guidelines" rel="external nofollow">رسائل الإيداع الاصطلاحية في Angular</a> التي تقترح هذه الأنواع: للبناء <code>:build</code> والعمل الروتيني <code>:chore</code>والتكامل المستمر<code>:ci</code>والتوثيقات <code>:docs</code>ومتعلقات التصميم <code>:style</code>وإعادة الهيكلية<code>:refactor</code>والأداء <code>:perf</code>والاختبار<code>:test</code> وغيرها.
	</li>
	<li>
		قد تتبع التذييلات -بخلاف التغييرات الجذرية <code>&lt;BREAKING CHANGE: &lt;description</code> مواصفات شبيهة بتنسيقات <a href="https://git-scm.com/docs/git-interpret-trailers" rel="external nofollow">git trailer format</a>.
	</li>
</ol>

<p>
	لا تعد بقية الأنواع متوافقة مع "رسائل الإيداع الاصطلاحية"، وليس لها أي تأثير ضمني في "إدارة النسخ الدلالية" إلا إذا احتوت على عبارة <code>BREAKING CHANGE</code>.
</p>

<p>
	قد يُضاف النطاق scope، إلى نوع الإيداع لإضافة معلومات سياق contextual، وتُضّمن بين قوسين. مثلًا:
</p>

<pre class="ipsCode">feat(parser): add ability to parse arrays
</pre>

<h2 id="-1">
	أمثلة
</h2>

<h3 id="description">
	رسالة إيداع مع الوصف <code>description</code> وتغيير جذري مكتوب في التذييل
</h3>

<pre class="ipsCode">feat: allow provided config object to extend other configs
BREAKING CHANGE: `extends` key in config file is now used for extending other config files
</pre>

<h3 id="-2">
	رسالة إيداع مع ! للفت الانتباه بوجود تغيير جذري
</h3>

<pre class="ipsCode">feat!: send an email to the customer when a product is shipped
</pre>

<h3 id="-3">
	رسالة إيداع مع نطاق و ! للفت الانتباه بوجود تغيير جذري
</h3>

<pre class="ipsCode">feat(api)!: send an email to the customer when a product is shipped
</pre>

<h3 id="breakingchange">
	رسالة إيداع مع ! ونص BREAKING CHANGE في التذييل
</h3>

<pre class="ipsCode">chore!: drop support for Node 6
BREAKING CHANGE: use JavaScript features not available in Node 6.
</pre>

<h3 id="body">
	رسالة إيداع دون متن body
</h3>

<pre class="ipsCode">docs: correct spelling of CHANGELOG
</pre>

<h3 id="-4">
	رسالة إيداع مع نطاق
</h3>

<pre class="ipsCode">feat(lang): add polish language
</pre>

<h3 id="-5">
	رسالة إيداع مع متن مكون من عدة فقرات وعدة تذييلات
</h3>

<pre class="ipsCode">fix: prevent racing of requests

Introduce a request id and a reference to latest request. Dismiss
incoming responses other than from latest request.

Remove timeouts which were used to mitigate the racing issue but are
obsolete now.

Reviewed-by: Z
Refs: #123
</pre>

<h2 id="specification">
	المواصفات Specification
</h2>

<p>
	الكلمات الرئيسية مثل "يجب"، و"يجب ألا"، و"مطلوب"، و"يتوجب"، و"يتوجب ألا"، و"ينبغي"، و"لا ينبغي"، و"موصى به"، و"قد"، و"اختياري" في هذا المقال مفسّرة كما هو موضح في <a href="https://www.ietf.org/rfc/rfc2119.txt" rel="external nofollow">RFC 2119</a>.
</p>

<ol>
	<li>
		<strong>يجب</strong> أن تُسبق رسائل الإيداع بالنوع، والذي يحتوي على اسم مثل: feat<code>أو</code>fix<code>، أو غيرها، متبوعة بالنطاق (اختياريًا)، أو علامة التعجب</code>!<code>اختياريًا. وبعدها النقطتين</code>:` وبعدها مسافة.
	</li>
	<li>
		يجب استخدام النوع <code>feat</code> عندما تُضاف ميزة جديدة للتطبيق أو المكتبة.
	</li>
	<li>
		يجب استخدام النوع <code>fix</code> عندما تُحل مشكلة في مشروعك.
	</li>
	<li>
		قد يُضاف النطاق بعد النوع، ويجب أن يحتوي النطاق على اسم يصف جزءًا من الشيفرة البرمجية محاطة بقوسين، مثل <code>:fix(parse)‎</code>.
	</li>
	<li>
		<strong>يجب</strong> أن يكون الوصف description مسبوقًا بالنطاق أو النوع التي تتبعهما النقطتان <code>:</code>. الوصف هو خلاصة قصيرة للتغييرات في الشيفرة البرمجية، مثل:
	</li>
</ol>

<pre class="ipsCode">array parsing issue when multiple spaces were contained in string
</pre>

<ol start="6">
	<li>
		قد يُضاف متن طويل لرسالة الإيداع بعد الوصف القصير، مضيفًا المزيد من المعلومات لهذا السياق المتعلق بتغييرات الشيفرة البرمجية، ويجب أن يبدأ المتن بسطر فارغ بعد الوصف.
	</li>
	<li>
		ليس لمتن رسالة الإيداع شكل معيّن مفروض، وقد تحتوي على فراغات من أسطر متعددة
	</li>
	<li>
		قد يحتوي تذييل واحد أو أكثر سطرًا فارغًا بعد المتن، ويجب على كل تذييل أن يحتوي رمزًا token متبوعًا إما بفراغ أو فراغ وعلامة "#"، ثم بعدها قيمة. وهذا مستلهم من <a href="https://git-scm.com/docs/git-interpret-trailers" rel="external nofollow">git trailer convention</a>.
	</li>
	<li>
		يجب أن يستخدم رمز التذييل <code>-</code> بديلًا عن الفراغات بين الكلمات، مثل: <code>Acked-by</code>، وهذا يساعد في التفريق بين التذييل عن المتن ذي الأسطر المتعددة. الاستثناء الوحيد هو للتغييرات الجذرية <code>BREAKING CHANGE</code>، والتي قد تُستخدم رمزًا للتذييل.
	</li>
	<li>
		قد يحتوي محتوى التذييل (وهو ما يأتي بعد الرمز) على فراغات وأسطر فارغة، ويجب أن ينتهي عند وجود الزوج الثاني الصالح من الرمز/الفاصل.
	</li>
	<li>
		يجب أن تُوضّح التغييرات الجذرية في بادئة النوع والنطاق لرسالة الإيداع، أو أن تحل محل الرمز في التذييل.
	</li>
	<li>
		إذا ذكرت التغييرات الجذرية في التذييل، يجب على التغيير الجذري أن يحتوي النص بالأحرف الكبيرة <code>BREAKING CHANGE</code> متبوعًا بالنقطتين <code>:</code> فالفراغ، والوصف. مثًلا:
	</li>
</ol>

<pre class="ipsCode">BREAKING CHANGE: environment variables now take precedence over config files
</pre>

<ol start="13">
	<li>
		لو ضُمّنت التغييرات الجذرية في بداية النوع أو النطاق، فيجب توضيح وجود تغيرات جذرية عن طريق علامة التعجب <code>!</code> مباشرةً بعد النقطتين <code>:</code>. لو استخدمت علامة التعجب، فيمكن مسح <code>BREAKING CHANGE:</code> من التذييل، ويتوجب أن يحتوي الوصف على وصف هذه التغييرات الجذرية.
	</li>
	<li>
		قد تُستخدم الأنواع -بخلاف <code>feat</code> أو <code>fix</code>- في رسائل الإيداع، مثل: <code>docs: update ref docs</code>
	</li>
	<li>
		يجب ألا يُتعامل مع وحدات المعلومات في رسائل الإيداع الاصطلاحية على أنها حساسة لحالة الأحرف case sensitive من قبل من يستخدم باستثناء التغيير الجذري الذي يجب أن يبقى بأحرفه الكبيرة.
	</li>
	<li>
		يجب أن يكون BREAKING-CHANGE مساويًا إلى BREAKING CHANGE، عند استخدامه رمزًا في التذييل.
	</li>
</ol>

<h2 id="-6">
	لماذا يُعتمد نظام رسائل الإيداع الاصطلاحية؟
</h2>

<ul>
	<li>
		إنشاء سجلات التغيير CHANGELOGs تلقائيًا.
	</li>
	<li>
		تحديد الإصدارات الدلالية لنُسخ البرمجيات semantic version bump تلقائيًا، استنادًا إلى أنواع رسائل الإيداع المكتوبة.
	</li>
	<li>
		إيصال طبيعة التغييرات إلى الزملاء في الفريق، والعامة، وكل من له علاقة بالمشروع.
	</li>
	<li>
		تفعيل عمليات البناء والنشر.
	</li>
	<li>
		تسهيل مشاركة الآخرين في مشاريعك، من خلال إعطائهم سجل تغييرات أكثر تنظيمًا.
	</li>
</ul>

<h2 id="-7">
	الأسئلة الأكثر شيوعا
</h2>

<h3 id="-8">
	كيف يجب أن أتعامل مع رسائل الإيداع في مرحلة التطوير الأولية؟
</h3>

<p>
	نوصي بالمتابعة كما لو كنت قد أصدرت المنتج فعلًا، إذ يستخدم شخص ماعادةً برنامجك، ومن الممكن أن يكون أحد زملائك أثناء تطوير البرنامج، وسيرغبون في معرفة ما قد جرى إصلاحه وما الذي تعطل وما إلى ذلك.
</p>

<h3 id="-9">
	هل الأنواع الموجودة في عنوان رسالة الإيداع ذات أحرف كبيرة أم صغيرة؟
</h3>

<p>
	يمكن استخدام أي منها ولكن من الأفضل أن يكون متسقًا.
</p>

<h3 id="-10">
	ماذا أفعل إذا كانت رسالة الإيداعات تحتوي على تغييرات من أكثر من نوع؟
</h3>

<p>
	ارجع واكتب رسائل إيداع متعددة كلما أمكن ذلك؛ فجزءٌ من فائدة رسائل الإيداع الاصطلاحية هو قدرتها على دفعنا إلى كتابة رسائل إيداع وطلبات منظمة أكثر.
</p>

<h3 id="-11">
	هل تثبط النقطة السابقة التطوير والانتقال السريع؟
</h3>

<p>
	لا تشجع على التحرك بسرعة غير منظمة، ولكنها تساعدك على التحرك بسرعة على المدى الطويل في مشاريع متعددة مع مساهمين متنوعين.
</p>

<h3 id="-12">
	هل يمكن أن تؤدي رسائل الإيداع الاصطلاحية إلى دفع المطورين بتقييد نوع الإيداعات التي يعملونها لأنهم سيفكرون في الأنواع المقدمة؟
</h3>

<p>
	تشجعنا رسائل الإيداعات الاصطلاحية على المزيد من أنواع أخرى مثل الإصلاحات <code>fixes</code>. بخلاف ذلك، تسمح مرونة رسائل الإيداعات الاصطلاحية لفريقك بالتوصل إلى أنواع خاصة بهم وتغيير تلك الأنواع بمرور الوقت.
</p>

<h3 id="semver">
	كيف يرتبط هذا بالإدارة الدلالية لنسخ البرمجيات SemVer؟
</h3>

<p>
	يجب ترجمة عمليات الإيداع إلى التالي من النسخ الدلالية SemVer:
</p>

<ul>
	<li>
		يُترجم النوع <code>fix</code> إلى إصدارات <code>PATCH</code>.
	</li>
	<li>
		يُترجم النوع <code>feat</code> إلى إصدارات <code>MINOR</code>.
	</li>
</ul>

<p>
	يجب ترجمة <code>BREAKING CHANGE</code> إلى إصدارات <code>MAJOR</code>، بغض النظر عن نوع رسالة الإيداع.
</p>

<h3 id="jameswomackconventionalcommitspec">
	كيف يمكنني إصدار الامتدادات وفقا لمواصفات رسائل الإيداعات الاصطلاحية، مثلا <code>jameswomack/conventional-commit-spec@</code>؟
</h3>

<p>
	نوصي باستخدام الإدارة الدلالية لنُسخ البرمجيات SemVer لإصدار الامتدادات لهذه المواصفات ونشجعك على إنشاء هذه الامتدادات.
</p>

<h3 id="-13">
	ماذا أفعل إذا استخدمت نوع الإيداع الخاطئ دون قصد؟
</h3>

<h4 id="fixfeat">
	عند استخدام نوع اصطلاحي ولكن ليس النوع الصحيح مثل fix بدلا من feat
</h4>

<p>
	قبل دمج الخطأ أو تحريره، نوصي باستخدام <code>git rebase -i</code> لتحرير سجل الإيداعات. ستكون عملية التنظيف بعد الإصدار مختلفة وفقًا للأدوات والعمليات التي تستخدمها.
</p>

<h4 id="feetfeat">
	عند استخدام نوع ليس من المواصفات مثل feet بدلا من feat
</h4>

<p>
	في أسوأ الأحوال، لن تكون نهاية العالم إذا كانت منطقة الالتزام لا تفي بمواصفات الإيداع التقليدية، فهذا يعني ببساطة أن الإيداع سيفوّت missed بالأدوات المستندة إلى المواصفات.
</p>

<h3 id="-14">
	هل يحتاج جميع المساهمين إلى استخدام رسائل الإيداع الاصطلاحية؟
</h3>

<p>
	لا، إذا كنت تستخدم سير عمل قائم على <code>squash</code> على <a href="https://academy.hsoub.com/programming/workflow/git/" rel="">غيت Git</a>، فيمكن للمشرفين الرئيسيين تنظيف رسائل الإيداع أثناء دمجها مما لا يضيف أي عبء عمل على مرسلي رسائل الإيداعات العاديين.
</p>

<p>
	يتمثل سير العمل الشائع common workflow في جعل نظام <a href="https://academy.hsoub.com/programming/workflow/git/%D8%A7%D9%84%D8%AF%D9%84%D9%8A%D9%84-%D8%A7%D9%84%D9%85%D8%B1%D8%AC%D8%B9%D9%8A-%D9%84%D9%84%D8%B9%D9%85%D9%84-%D8%B9%D9%84%D9%89-%D9%86%D8%B8%D8%A7%D9%85-%D8%BA%D9%8A%D8%AA-git-r1587/" rel="">غيت git</a> يسحق squash رسائل الإيداع تلقائيًا من <a href="https://academy.hsoub.com/programming/workflow/git/%D8%A5%D9%86%D8%B4%D8%A7%D8%A1-%D8%B7%D9%84%D8%A8-%D8%B3%D8%AD%D8%A8-%D8%B9%D9%84%D9%89-github-r1581/" rel="">طلب سحب pull request</a> ويقدم نموذجًا للمشرف الرئيسي لإدخال رسالة إيداع git المناسبة للدمج.
</p>

<h3 id="revertcommits">
	كيف تتعامل الإيداعات الاصطلاحية مع الإيداعات العكسية revert commits؟
</h3>

<p>
	يمكن أن يكون عكس الشيفرة البرمجية معقدًا. هل تعكس عن إيداعات متعددة؟ إذا عكست إحدى الميزات، فهل يجب أن يكون الإصدار التالي patch بدلًا من ذلك؟
</p>

<p>
	لا تبذل رسائل الإيداع الاصطلاحية جهدًا واضحًا لتحديد سلوك عكس الإيداع revert behavior، بل تترك لأدوات المطورين لكي يستخدموا مرونة الأنواع والتذييلات لتطوير منطقهم في التعامل مع عمليات عكس الإيداعات.
</p>

<p>
	إحدى التوصيات هي استخدام النوع <code>revert</code>، والتذييل الذي يشير إلى إيداعات ترميز SHA المعكوسة:
</p>

<pre class="ipsCode">revert: let us never again speak of the noodle incident

Refs: 676104e, a215868
</pre>

<h3 id="-15">
	ما شكل الكتابة الذي يجب أن أستخدمه؟
</h3>

<p>
	نوصي بكتابة وصف رسائل الإيداع: وصفها ومتنها بصيغة <a href="https://en.wikipedia.org/wiki/Imperative_mood" rel="external nofollow">الأمر Imperative mood</a>. يوجد عدد كبير من الأمثلة على أسلوب الكتابة هذا لرسائل الإيداع <a href="https://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html" rel="external nofollow">1</a> و <a href="https://github.com/angular/angular/blob/22b96b9/CONTRIBUTING.md#subject" rel="external nofollow">2</a> و <a href="https://git-scm.com/book/en/v2/Distributed-Git-Contributing-to-a-Project" rel="external nofollow">3</a> و <a href="https://medium.com/@danielfeelfine/commit-verbs-101-why-i-like-to-use-this-and-why-you-should-also-like-it-d3ed2689ef70" rel="external nofollow">4</a> و <a href="https://chris.beams.io/posts/git-commit/" rel="external nofollow">5</a>
</p>

<h2 id="-16">
	حول رسائل الإيداع الاصطلاحية
</h2>

<p>
	مواصفات رسائل الإيداع الاصطلاحية مستوحاة من <a href="https://github.com/angular/angular/blob/22b96b9/CONTRIBUTING.md#-commit-message-guidelines" rel="external nofollow">إرشادات Angular لرسائل الإيداع</a> وتعتمد عليها اعتمادًا كبيرًا.
</p>

<p>
	كتبت المسودة الأولى لهذه المواصفات بالتعاون مع بعض الأشخاص الذين ساهموا في:
</p>

<ul>
	<li>
		<a href="https://github.com/conventional-changelog/conventional-changelog" rel="external nofollow">conventional-changelog</a>: مجموعة من الأدوات لتحليل رسائل الإيداع الاصطلاحية من سجلات git.
	</li>
	<li>
		<a href="https://bumped.github.io" rel="external nofollow">bumped</a>: أداة لإصدار البرامج التي تسهل تنفيذ الإجراءات قبل وبعد إطلاق إصدار جديد من برنامجك.
	</li>
	<li>
		<a href="https://github.com/netflix/unleash" rel="external nofollow">unleash</a>: أداة لأتمتة إصدار البرنامج والنشر.
	</li>
	<li>
		<a href="https://github.com/lerna/lerna" rel="external nofollow">lerna</a>: أداة لإدارة المشاريع ذات المستودع الواحد، والتي انبثقت من مشروع Babel.
	</li>
</ul>

<h2 id="-17">
	أدوات لرسائل الإيداعات الاصطلاحات
</h2>

<ul>
	<li>
		<a href="https://github.com/leodido/go-conventionalcommits" rel="external nofollow">go-conventionalcommits</a>: قوة <a href="https://academy.hsoub.com/programming/go/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D9%84%D8%BA%D8%A9-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-go-r222/" rel="">لغة غو</a> الكاملة لتحليل رسائل الإيداعات الاصطلاحية.
	</li>
	<li>
		<a href="https://gitlab.com/digitalxero/go-conventional-commit" rel="external nofollow">go-conventional-commit</a>: مكتبة لغة غو لتحليل رسائل الإيداعات الاصطلاحية وفقًا للمواصفات.
	</li>
	<li>
		<a href="https://github.com/goreleaser/chglog" rel="external nofollow">chglog</a>: أداة لتحليل رسائل الإيداعات الاصطلاحية من سجلات git وتحويلها إلى نماذج سجلات تغيير CHANGELOGS.
	</li>
	<li>
		<a href="https://github.com/xotahal/fastlane-plugin-semantic_release" rel="external nofollow">fastlane-plugin</a>: إضافة تتبع المواصفات لإدارة النسخ وتوليد سجل التغييرات تلقائيًا.
	</li>
	<li>
		<a href="https://github.com/damianopetrungaro/php-commitizen" rel="external nofollow">php-commitizen</a>: أداة مصممة لإنشاء رسائل إيداع وفقًا لمواصفات رسائل الإيداع الاصطلاحية، وهي قابلة للتكوين وللاستخدام لمشاريع <a href="https://academy.hsoub.com/programming/php/" rel="">PHP</a> لأنها تابعة للمؤلف أو قابلة للاستخدام عالميًا لمشاريع غير PHP.
	</li>
	<li>
		<a href="https://github.com/marcocesarato/php-conventional-changelog" rel="external nofollow">php-conventional-changelog</a>: أداة صممت لإنشاء سجل التغيير من رسائل محفوظات رسائل الإيداع الخاصة بالمشروع وبيانات التعريف وأتمتة الإصدار باستخدام Semver، باتباع مواصفات الالتزامات التقليدية، وهي قابلة للتكوين وقابلة للاستخدام لمشاريع PHP إذ أنها تابعة للمؤلف أو قابلة للاستخدام عالميًا لمشاريع غير PHP.
	</li>
	<li>
		<a href="https://github.com/autonomy/conform" rel="external nofollow">conform</a>: أداة يمكن استخدامها لفرض السياسات على مستودعات غيت، بما في ذلك رسائل الإيداع الاصطلاحية.
	</li>
	<li>
		<a href="https://github.com/conventional-changelog/standard-version" rel="external nofollow">standard-version</a>: تصدير تلقائي للنسخ وإدارة سجل التغييرات، باستخدام زر GitHub لـ squash وسير عمل رسائل الإيداع الاصطلاحية الموصى به.
	</li>
	<li>
		<a href="https://plugins.jetbrains.com/plugin/9861-git-commit-template" rel="external nofollow">Git Commit Template</a>: يضيف دعم رسائل الإيداع الاصطلاحية <a href="https://www.jetbrains.com/" rel="external nofollow">لمحررات JetBrains</a> (IntelliJ IDEA و PyCharm و PhpStorm…).
	</li>
	<li>
		<a href="https://github.com/commitsar-app/commitsar" rel="external nofollow">commitsar</a>: أداة لغة غو للتحقق ما إذا كانت رسائل الإيداع على الفرع متوافقة مع رسائل الإيداع الاصطلاحية، وتأتي بنسخة دوكر للتكامل المستمر.
	</li>
	<li>
		<a href="https://github.com/semantic-release/semantic-release" rel="external nofollow">semantic-release</a>: أداة تعمل على أتمتة سير عمل إصدار الحزمة بالكامل بما في ذلك: تحديد رقم الإصدار التالي وإنشاء ملاحظات الإصدار ونشر الحزمة.
	</li>
	<li>
		<a href="https://github.com/d-koppenhagen/ngx-semantic-version" rel="external nofollow">ngx-semantic-version</a>: يؤتمت رسائل إيداع مشروع Angular وسير عمل الالتزام عن طريق تكامل <em>commitizen</em>, <em>commitlint</em>, <em>husky</em> and <em>standard-version</em> في مشروعك وتكوينها لاستخدام <em>رسائل الإيداع الاصطلاحية</em>.
	</li>
	<li>
		<a href="https://github.com/jgoodman8/pyhist" rel="external nofollow">Pyhist</a>: أداة مساعدة من <a href="https://academy.hsoub.com/python/" rel="">لغة بايثون</a> لتحديث إصدار الباقة من سجل git وإنشاء سجل التغيير CHANGELOG.
	</li>
	<li>
		<a href="https://github.com/commitizen-tools/commitizen" rel="external nofollow">commitizen-tools/commitizen</a>: أداة للغة بايثون مصممة لإنشاء قواعد رسائل الإيداع الاصطلاحية للمشاريع، ورفع إصدارات المشروع، وإنشاء سجل التغيير. قابلة للتكوين وقابلة للاستخدام لكل من مشروع بايثون وغير بايثون، وقابلة للتوسيع توسعًا كبيرًا من خلال بايثون.
	</li>
	<li>
		<a href="https://github.com/idc101/git-mkver" rel="external nofollow">git-mkver</a>:أداة لتطبيق الإصدار الدلالي تلقائيًا على مستودعات git استنادًا إلى رسائل الإيداع الاصطلاحية.
	</li>
	<li>
		<a href="https://gitlab.com/DeveloperC/conventional_commits_next_version" rel="external nofollow">Conventional Commits Next Version</a>: أداة مساعدة حيادية للأدوات واللغات لحساب الإصدار الدلالي التالي استنادًا إلى رسائل الإيداعات الاصطلاحية منذ الإصدار السابق في المشاريع ذات المستودع الواحد.
	</li>
	<li>
		<a href="https://github.com/adamtabrams/change" rel="external nofollow">change</a>: أداة لتوليد وتحديث سجل التغيير باستخدام رسائل الإيداع الاصطلاحية.
	</li>
	<li>
		<a href="https://github.com/bvieira/sv4git" rel="external nofollow">sv4git</a>: أداة سطر الأوامر للتحقق من صحة رسائل الإيداع الاصطلاحية، ونسخ الإصدارات وإنشاء الوسوم وسجلات التغيير.
	</li>
	<li>
		<a href="https://github.com/semantic-gitlog" rel="external nofollow">semantic-gitlog</a> أداة بسيطة لإدارة الإصدار الدلالي تعتمد على رسائل الإيداع الاصطلاحية. يشتق تلقائيًا أرقام الإصدارات وإدارتها وتوليد سجلات التغيير ذات نمط إطار عمل Angular. دعم <a href="https://github.com/semantic-gitlog/maven-semantic-gitlog" rel="external nofollow">Maven</a> و <a href="https://github.com/semantic-gitlog/gradle-semantic-gitlog" rel="external nofollow">Gradle</a>.
	</li>
	<li>
		<a href="https://github.com/lppedd/idea-conventional-commit" rel="external nofollow">idea-conventional-commit</a> الإكمال التلقائي للسياق والقوالب، لرسائل الإيداع الاصطلاحية ورسائل النسخ الدلالية.
	</li>
	<li>
		<a href="https://github.com/chaaz/versio" rel="external nofollow">Versio</a>: أداة متوافقة مع المشاريع ذات المستودع الواحد (monorepos) التي تحدّث أرقام الإصدارات بناءً على رسائل الإيداع الاصطلاحية، واعتماديات المشروع، ويمكنه توليد الوسوم وسجلات التغيير أيضًا.
	</li>
	<li>
		<a href="https://github.com/tomasbjerre/git-changelog-lib" rel="external nofollow">Git Changelog Lib</a>: مكتبة <a href="https://academy.hsoub.com/programming/java/" rel="">جافا Java</a> تدعم عرض سجل التغيير في سياق مشتق من Git. تدعم رسائل الإيداع الاصطلاحية مع <a href="https://github.com/tomasbjerre/git-changelog-lib#helpers" rel="external nofollow">Handlebars Helpers</a>، ومُستخدمة في المشاريع التالية:
	</li>
	<li>
		<a href="https://github.com/tomasbjerre/git-changelog-gradle-plugin" rel="external nofollow">Gradle</a>
	</li>
	<li>
		<a href="https://github.com/tomasbjerre/git-changelog-maven-plugin" rel="external nofollow">Maven</a>
	</li>
	<li>
		<a href="https://github.com/jenkinsci/git-changelog-plugin" rel="external nofollow">Jenkins</a>
	</li>
	<li>
		<a href="https://github.com/tomasbjerre/git-changelog-command-line" rel="external nofollow">Command Line</a>
	</li>
	<li>
		<a href="https://github.com/oknozor/cocogitto" rel="external nofollow">Cocogitto</a>: مجموعة من أدوات سطر الأوامر لرسائل الإيداعات الاصطلاحية ومواصفات الإدارة الدلالية لنُسخ البرمجيات semver.
	</li>
	<li>
		<a href="https://gitlab.com/DeveloperC/conventional_commits_linter" rel="external nofollow">منقّح صياغة رسائل الإيداع الاصطلاحية</a>: أداة تنقيح صياغة رسائل الإيداع الاصطلاحية، وهي أداة محايدة للغات والأدوات الأخرى.
	</li>
	<li>
		<a href="https://github.com/gembaadvantage/uplift" rel="external nofollow">Uplift</a>: الإصدار الدلالي بطريقة سهلة. مدعوم من رسائل الإيداع الاصطلاحية. مصمم لكي يستخدم مع التكامل المستمر.
	</li>
</ul>

<h2 id="-18">
	المشاريع التي تستخدم رسائل الإيداع الاصطلاحية
</h2>

<ul>
	<li>
		<a href="https://github.com/goreleaser/nfpm" rel="external nofollow">NFPM</a>: NFPM is Not FPM -أداة تجميع بسيطة لـ deb و rpm و apk مكتوبة بلغة غو
	</li>
	<li>
		<a href="https://github.com/yargs/yargs" rel="external nofollow">yargs</a>: محلل وسيطات سطر الأوامر المفضل لدى الجميع.
	</li>
	<li>
		<a href="https://github.com/istanbuljs/istanbuljs" rel="external nofollow">istanbuljs</a>: مجموعة أدوات مفتوحة المصدر ومكتبات برمجية لإضافة الاختبارات الآلية للغة <a href="https://academy.hsoub.com/programming/javascript/" rel="">جافا سكريبت</a>.
	</li>
	<li>
		<a href="https://github.com/UW-Madison-DoIT/angularjs-portal" rel="external nofollow">uPortal-home</a> و <a href="https://github.com/UW-Madison-DoIT/uw-frame" rel="external nofollow">uPortal-application-framework</a>:محسن اختياري لواجهة الاستخدام <a href="https://www.apereo.org/projects/uportal" rel="external nofollow">Apereo uPortal</a>.
	</li>
	<li>
		<a href="https://github.com/dmfay/massive-js" rel="external nofollow">massive.js</a>: مكتبة وصول للبيانات لـ Node و PostgreSQL.
	</li>
	<li>
		<a href="https://github.com/electron/electron" rel="external nofollow">electron</a>: بناء تطبيقات تعمل على أكثر من نظام تشغيل باستخدام جافا سكريبت و <a href="https://academy.hsoub.com/programming/html/" rel="">HTML</a> و <a href="https://academy.hsoub.com/programming/css/" rel="">CSS</a>.
	</li>
	<li>
		<a href="https://github.com/LeDDGroup/scroll-utility" rel="external nofollow">scroll-utility</a>: أداة بسيطة لتسهيل التمرير للعناصر المتوسطة مع حركيات سلسلة.
	</li>
	<li>
		<a href="https://github.com/BlazeUI/blaze" rel="external nofollow">Blaze UI</a>: أدوات واجهة استخدام غير مرتبط بإطار عمل معين.
	</li>
	<li>
		<a href="https://github.com/monicahq/monica" rel="external nofollow">Monica</a>: نظام إدارة العلاقات الشخصية مفتوح المصدر.
	</li>
	<li>
		<a href="https://mhy.js.org" rel="external nofollow">mhy</a>: بيئة عمل معدة بالأدوات ومتعددة الاستخدامات ولا تحتاج إلى إعداد مسبق.
	</li>
	<li>
		‎<a href="https://github.com/danielduarte/diffparse#readme" rel="external nofollow">@tandil/diffparse</a>: محلل بسيط للتغييرات بين الملفات في نظام إدارة التحكم في الإصدارات.
	</li>
	<li>
		‎<a href="https://github.com/danielduarte/diffsplit#readme" rel="external nofollow">@tandil/diffsplit</a>: يسهل تقسيم ملفات التغييرات من نوع .diff و .patch إلى ملفات من نوعها.
	</li>
	<li>
		‎<a href="https://github.com/thi-ng/umbrella" rel="external nofollow">@thi.ng/umbrella</a>:  مستودع لقرابة مئة مشروع TypeScript التي تتخذ منهجية التطوير المقادة بالبيانات Data Driven Development ذات المستودع الواحد.
	</li>
	<li>
		<a href="https://github.com/HunWalk/yii2-basic-firestarter" rel="external nofollow">yii2-basic-firestarter</a>: قالب تطبيق Yii2 محسّن.
	</li>
	<li>
		<a href="https://www.nintex.com/workflow-automation/modern-forms/" rel="external nofollow">Nintex Forms</a>: إنشاء نماذج إدخال ديناميكية سهلة لإرسال واستقبال بيانات دقيقة وآنية.
	</li>
	<li>
		<a href="https://tinacms.org" rel="external nofollow">Tina CMS</a>: مجموعة أدوات لبناء إدارة محتوى واجهات الاستخدام في موقعك.
	</li>
	<li>
		<a href="https://platform.uno" rel="external nofollow">Uno Platform</a>: منصة بناء تطبيقات جوال وسطح مكتب وتقنية ويب أسمبلي عن طريق لغة برمجة #C و XAML، وتدعم البرمجيات مفتوحة المصدر والاحترافية.
	</li>
	<li>
		<a href="https://www.nuget.org/packages/AutoSort.NetCore/" rel="external nofollow">AutoSort.NetCore</a>: استخدام سمات الكائن للترتيب الافتراضي.
	</li>
	<li>
		<a href="https://github.com/the-spyke/undercut" rel="external nofollow">Undercut</a>: خطوط إمداد وأدوات لمعالجة البيانات المؤجلة في لغة جافا سكريبت.
	</li>
	<li>
		<a href="https://github.com/MarkFChavez/blox_piece_stats_builder" rel="external nofollow">Stats Builder</a>: باني إحصائيات لـ <a href="https://www.roblox.com/games/2753915549/UPDATE-11-Blox-Fruits" rel="external nofollow">Blox Fruits</a>
	</li>
	<li>
		<a href="https://jenkins-x.io/" rel="external nofollow">Jenkins X</a>: يوفر Jenkins X خطوط إمداد الأتمتة، وتطوير عمليات Git، وعرض بيئة التشغيل لمساعدة التعاون بين فريق العمل وتسريع نشر البرمجيات مهما كان حجمها.
	</li>
	<li>
		<a href="https://github.com/axonasif/gearlock" rel="external nofollow">GearLock</a>: بديل مخصص لاستعادة Android-x86..
	</li>
	<li>
		<a href="https://github.com/ymind/rsql-querydsl" rel="external nofollow">rsql-querydsl</a>: تكامل لغة الاستعلامات RSQL وإطار عمل Querydsl.
	</li>
	<li>
		<a href="https://github.com/haunt98/changeloguru" rel="external nofollow">Changeloguru</a>: توليد سجل التغييرات آليًا من رسائل الإيداع الاصطلاحية، مكتوبة بلغة غو.
	</li>
</ul>

<p>
	ترجمة -وبتصرف- للدليل <a href="https://www.conventionalcommits.org/en/v1.0.0" rel="external nofollow">Conventional Commits</a> لصاحبه Damiano Petrungaro وكل المساهمين.
</p>

<h2 id="-19">
	اقرأ أيضًا
</h2>

<ul>
	<li>
		<a href="https://academy.hsoub.com/programming/workflow/git/%D8%A8%D8%AF%D8%A1-%D8%A7%D9%84%D8%B9%D9%85%D9%84-%D9%85%D8%B9-%D9%86%D8%B8%D8%A7%D9%85-%D8%A5%D8%AF%D8%A7%D8%B1%D8%A9-%D8%A7%D9%84%D8%A5%D8%B5%D8%AF%D8%A7%D8%B1%D8%A7%D8%AA-%D8%AC%D9%8A%D8%AA-git-r1593/" rel="">بدء العمل مع نظام إدارة الإصدارات جيت Git</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/python/%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85%D8%A7%D8%AA-%D9%85%D8%AA%D9%82%D8%AF%D9%85%D8%A9-%D9%84%D9%86%D8%B8%D8%A7%D9%85-%D8%A7%D9%84%D8%AA%D8%AD%D9%83%D9%85-%D8%A8%D8%A7%D9%84%D8%A5%D8%B5%D8%AF%D8%A7%D8%B1-git-%D9%84%D8%A5%D8%AF%D8%A7%D8%B1%D8%A9-%D9%85%D8%B4%D8%A7%D8%B1%D9%8A%D8%B9-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-r2047/" rel="">استخدامات متقدمة لنظام التحكم بالإصدار Git لإدارة مشاريع بايثون</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/workflow/git/%D8%A3%D8%AF%D9%88%D8%A7%D8%AA-%D8%B1%D8%B3%D9%88%D9%85%D9%8A%D8%A9-%D9%84%D9%84%D8%A3%D8%AF%D8%A7%D8%A9-%D8%B3%D8%B7%D8%B1-%D8%A7%D9%84%D8%A3%D9%88%D8%A7%D9%85%D8%B1-%D8%AC%D9%8A%D8%AA-git-r1604/" rel="">أدوات رسومية للأداة سطر الأوامر جيت Git</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">2181</guid><pubDate>Mon, 20 Nov 2023 13:00:00 +0000</pubDate></item><item><title>&#x641;&#x647;&#x645; &#x646;&#x638;&#x627;&#x645; &#x627;&#x644;&#x62A;&#x62D;&#x643;&#x645; &#x628;&#x627;&#x644;&#x625;&#x635;&#x62F;&#x627;&#x631;&#x627;&#x62A; Git &#x648;&#x623;&#x647;&#x645;&#x64A;&#x629; &#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645;&#x647; &#x641;&#x64A; &#x645;&#x634;&#x627;&#x631;&#x64A;&#x639; &#x628;&#x627;&#x64A;&#x62B;&#x648;&#x646;</title><link>https://academy.hsoub.com/programming/workflow/git/%D9%81%D9%87%D9%85-%D9%86%D8%B8%D8%A7%D9%85-%D8%A7%D9%84%D8%AA%D8%AD%D9%83%D9%85-%D8%A8%D8%A7%D9%84%D8%A5%D8%B5%D8%AF%D8%A7%D8%B1%D8%A7%D8%AA-git-%D9%88%D8%A3%D9%87%D9%85%D9%8A%D8%A9-%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85%D9%87-%D9%81%D9%8A-%D9%85%D8%B4%D8%A7%D8%B1%D9%8A%D8%B9-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-r2034/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2023_07/----Git------python.png.e3a048d0c5d6cce2580fd640e4c90025.png" /></p>
<p>
	أنظمة التحكم في الإصدار version control هي أدوات تسجّل جميع تغيرات الشيفرة المصدرية وتجعل من السهل استرداد الإصدارات القديمة من الشيفرات البرمجية، ويمكنك النظر إلى هذه الأدوات بكونها أدوات متطورة للتراجع عن فعل ما؛ فعلى سبيل المثال، إذا استبدلت دالةً ثم قررت لاحقًا تفضيل الدالة القديمة، يمكنك استعادة شيفرتك إلى الإصدار الأصلي، أو في حال اكتشفت خطأً جديدًا، فيمكنك العودة إلى الإصدارات السابقة لتحديد وقت ظهوره لأول مرة وأي تغيير في الشيفرة تسبب بحدوثه.
</p>

<p>
	يدير نظام التحكم في الإصدار الملفات أثناء إجراء التغييرات عليها، ويشابه ذلك عمل نسخة من مجلد "مشروعي" وتسميته "نسخة من مشروعي"، إذ سيتعين عليك إذا واصلت إجراء التغييرات إنشاء نسخة أخرى تسميها "نسخة 2 من مشروعي"، ثم نسخة "نسخة 3 من مشروعي" ثم "نسخة 3b من مشروعي" ثم "نسخة من مشروعي يوم الثلاثاء" وما إلى ذلك وهلم جرًّا، وقد يكون نسخ المجلدات أمرًا بسيطًا، إلا أن هذه الطريقة تصبح أقل وأقل فاعلية مع تكرارها. بدلًا من ذلك، تعلّم استخدام نظام التحكم في الإصدار، وسيوفر لك الوقت والصداع على المدى الطويل.
</p>

<p>
	تعدّ كل من غيت Git و Mercurial وSubversion تطبيقات شائعة للتحكم في الإصدار، إلا أن غيت هو الأكثر شيوعًا. ستتعلم في هذه المقالة كيفية إعداد الملفات لمشاريع الشيفرات البرمجية واستخدام غيت لتتبع تغيراتها.
</p>

<h2>
	إيداعات غيت Git
</h2>

<p>
	يتيح لك <a href="https://academy.hsoub.com/programming/workflow/git/%D9%85%D8%A7-%D9%87%D9%88-git%D8%9F-r1592/" rel="">غيت Git</a> حفظ حالة ملفات مشروعك، المسماة لقطات snapshots أو <a href="https://academy.hsoub.com/questions/15972-%D8%B4%D8%B1%D8%AD-%D9%85%D9%86%D8%B7%D9%82%D8%A9-%D8%A7%D9%84%D8%A5%D8%AF%D8%B1%D8%A7%D8%AC-staging-area-%D9%88-%D8%B9%D9%85%D9%84%D9%8A%D8%A9-%D8%A7%D9%84%D8%A5%D9%8A%D8%AF%D8%A7%D8%B9-commit-%D9%81%D9%8A-%D9%86%D8%B8%D8%A7%D9%85-git/" rel="">إيداعات commits</a>، أثناء إجراء التغييرات عليها. يمكنك بهذه الطريقة العودة إلى أي لقطة سابقة إذا احتجت إلى ذلك. قد يكون الإيداع اسمًا أو فعلًا بحسب السياق، إذ يودع المبرمجون (أو يحفظون) إيداعاتهم (أو لقطاتهم)، والمصطلح الآخر للإيداع هو تسجيل الوصول check-in إلا أنه أقل شيوعًا.
</p>

<div class="banner-container ipsBox ipsPadding">
	<div class="inner-banner-container">
		<p class="banner-heading">
			دورة تطوير التطبيقات باستخدام لغة Python
		</p>

		<p class="banner-subtitle">
			احترف تطوير التطبيقات مع أكاديمية حسوب والتحق بسوق العمل فور انتهائك من الدورة
		</p>

		<div>
			<a class="ipsButton ipsButton_large ipsButton_primary ipsButton_important" href="https://academy.hsoub.com/learn/python-application-development" rel="">اشترك الآن</a>
		</div>
	</div>

	<div class="banner-img">
		<img alt="دورة تطوير التطبيقات باستخدام لغة Python" src="https://academy.hsoub.com/learn/assets/images/courses/python-application-development.png">
	</div>
</div>

<p>
	تُسهّل أنظمة التحكم في الإصدار أيضًا على فريق مطوري البرامج أن يبقوا متزامنين مع بعضهم بعضًا أثناء إجراء تغييرات على الشيفرات المشروع المصدرية، إذ يمكن للمبرمجين عندما يُجري مبرمج آخر تغييرًا ما سحب هذه التحديثات إلى حواسيبهم. يتتبع نظام التحكم في الإصدار الإيداعات الحاصلة، ومن أجراها، ومتى أجراها، جنبًا إلى جنب مع تعليقات المطورين التي تصف التعديلات.
</p>

<p>
	يدير نظام التحكم في الإصدار الشيفرة المصدرية للمشروع في مجلد يسمى <a href="https://academy.hsoub.com/programming/workflow/git/%D8%A5%D9%86%D8%B4%D8%A7%D8%A1-%D8%A3%D9%88%D9%84-%D9%85%D8%B3%D8%AA%D9%88%D8%AF%D8%B9-%D9%84%D9%83-%D9%85%D9%86-%D8%AE%D9%84%D8%A7%D9%84-%D8%AC%D9%8A%D8%AA-git-r1594/" rel="">المستودع repository</a> -أو اختصارًا repo- ويتوجب عليك عمومًا الاحتفاظ بمستودع غيت منفصل لكل مشروع تعمل عليه. تفترض هذه المقالة أنك تعمل غالبًا بمفردك ولا تحتاج إلى ميزات غيت المتقدمة، مثل التفرع والدمج، التي تساعد المبرمجين على التعاون، ولكن حتى لو كنت تعمل بمفردك، فليس هناك مشروع برمجة صغير جدًا للاستفادة من برنامج التحكم في الإصدار.
</p>

<p style="text-align: center;">
	<iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="" frameborder="0" height="450" id="ips_uid_8690_5" src="https://academy.hsoub.com/applications/core/interface/index.html" title="YouTube video player" width="800" data-embed-src="https://www.youtube.com/embed/WVFXBMASu7I"></iframe>
</p>

<h2>
	استخدام أداة Cookiecutter لإنشاء مشاريع بايثون جديدة
</h2>

<p>
	نسمي المجلد الذي يحتوي على الشيفرة المصدرية والوثائق والاختبارات والملفات الأخرى المتعلقة بالمشروع باسم "دليل العمل" أو "شجرة العمل working tree" في أداة غيت، أو ملف المشروع عمومًا. تسمى الملفات الموجودة في دليل العمل ككل بنسخة العمل. لننشئ قبل إنشاء مستودع غيت الملفات الخاصة بمشروع بايثون.
</p>

<p>
	كل مبرمج لديه طريقة مفضلة لإنشاء الملفات، ومع ذلك، تتبع مشاريع بايثون اصطلاحات أسماء المجلدات والتسلسلات الهرمية. قد تتكون برامجك الأبسط من ملف "‎.py" واحد، ولكن عندما تتعامل مع مشاريع أكثر تعقيدًا، ستبدأ بتضمين ملفات "‎.py" وملفات بيانات وتوثيق واختبارات للوحدات والمزيد. يحتوي عادةً جذر مجلد المشروع على مجلد باسم src لملفات التعليمات البرمجية المصدرية "‎.py" ومجلد اختبارات لاختبارات الوحدات ومجلد مستندات لأي وثائق، مثل تلك التي تُنشأ بواسطة أداة التوثيق سفينكس Sphinx، بينما تحتوي الملفات الأخرى على معلومات المشروع وأداة الضبط على النحو التالي: ملف README.md للحصول على معلومات عامة، وملف ‎.coveragerc لتغطية أداة ضبط الشيفرة، و LICENSE.txt لترخيص برنامج المشروع، وما إلى ذلك. هذه الأدوات والملفات خارج نطاق هذه السلسلة، لكنها جديرة بالبحث عنها والتعرف إليها.
</p>

<p>
	تصبح عملية إعادة إنشاء الملفات الأساسية السابقة ذاتها لمشاريع البرمجة الجديدة أمرًا شاقًا مع ممارستك للبرمجة لوقتٍ أطول، ويمكنك لتسريع عملية البرمجة استخدام وحدة <code>cookiecutter</code> الخاصة ببايثون لإنشاء هذه الملفات والمجلدات تلقائيًا، إليك <a href="https://cookiecutter.readthedocs.io/" rel="external nofollow">التوثيق الكامل</a> لكل من الوحدة وبرنامج سطر الأوامر Cookiecutter.
</p>

<p>
	لتثبيت Cookiecutter، نفذ الأمر التالي على ويندوز:
</p>

<pre class="ipsCode">pip install --user cookiecutter
</pre>

<p>
	أو الأمر التالي على على ماك macOS ولينكس Linux:
</p>

<pre class="ipsCode"> pip3 install --user cookiecutter 
</pre>

<p>
	يتضمن هذا التثبيت برنامج سطر أوامر Cookiecutter ووحدة <code>cookiecutter</code> الخاصة ببايثون. قد يحذرك الخرج من تثبيت برنامج سطر الأوامر في مجلد غير مدرج في متغير <code>PATH</code> كما يلي:
</p>

<pre class="ipsCode">Installing collected packages: cookiecutter
  WARNING: The script cookiecutter.exe is installed in 'C:\Users\Al\AppData\Roaming\Python\Python38\Scripts' which is not on PATH.
  Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
</pre>

<p>
	تذكّر إضافة المجلد (C:\Users\Al...\Scripts في هذه الحالة كما في الشيفرة السابقة) إلى متغير بيئة <code>PATH.</code> وإلا فسيتعين عليك تنفيذ Cookiecutter مثل وحدة بايثون عن طريق إدخال ملف تعريف الارتباط <code>python -m</code> في ويندوز، أو ملف تعريف الارتباط <code>python3 -m</code> في نظامي ماك أوإس ولينكس بدلًا من الاكتفاء بكتابة <code>cookiecutter</code>.
</p>

<p>
	سنُنشئ في هذه المقالة مستودعًا لوحدة تسمى <code>wizcoin</code>، وهي وحدة تتعامل مع العملات المعدنية من نوع galleon، و sickle و knut وهي عملات خيالية لعالم سحري. تستخدم وحدة <code>cookiecutter</code> قوالب لإنشاء ملفات البداية لعدة أنواع مختلفة من المشاريع. يكون القالب غالبًا مجرد رابط لموقع غيت هب GitHub.com. على سبيل المثال، يمكنك من مجلد "C:\Users\Al" إدخال ما يلي في الطرفية Terminal لإنشاء مجلد "C:\Users\Al\wizcoin" مع الملفات الاعتيادية لمشروع بايثون الأساسي. تحمّل وحدة <code>cookiecutter</code> بدورها القالب من غيت هب GitHub وتسألك سلسلةً من الأسئلة حول المشروع الذي تريد إنشاءه:
</p>

<pre class="ipsCode">C:\Users\Al&gt;‎‎‎cookiecutter gh:asweigart/cookiecutter-basicpythonproject
project_name [Basic Python Project]: WizCoin
module_name [basicpythonproject]: wizcoin
author_name [Susie Softwaredeveloper]: Al Sweigart
author_email [susie@example.com]: al@inventwithpython.com
github_username [susieexample]: asweigart
project_version [0.1.0]:
project_short_description [A basic Python project.]: A Python module to represent the galleon, sickle, and knut coins of wizard currency.
</pre>

<p>
	يمكنك أيضًا تنفيذ <code>python -m cookiecutter</code> إذا حصلت على خطأ بدلًا من <code>cookiecutter</code>، إذ يحمّل هذا الأمر نموذجًا مُنشأ من <a href="https://github.com/asweigart/cookiecutter-basicpythonproject" rel="external nofollow">cookiecutter-basicpythonproject</a>، وستجد قوالبًا للعديد من لغات البرمجة على <a href="https://github.com/cookiecutter/cookiecutter" rel="external nofollow">الرابط</a>، ونظرًا لاستضافة قوالب Cookiecutter غالبًا على غيت هب، فيمكنك أيضًا كتابة ":gh" اختصارًا للرابط <code><a href="https://github.com" ipsnoembed="true" rel="external nofollow">https://github.com</a></code> في سطر الأوامر.
</p>

<p>
	عندما يسألك Cookiecutter أسئلة، يمكنك إما إدخال إجابة أو ببساطة الضغط على مفتاح الإدخال ENTER لاستخدام الإجابة الافتراضية الموضحة بين قوسين مربعين. على سبيل المثال، يطلب منك <code>project_name [Basic Python Project]:‎</code> تسمية مشروعك، فإذا لم تدخل شيئًا سيستخدم Cookiecutter النص ‎"Basic Python Project"‎ اسمًا للمشروع، كما تساعدك هذه الإعدادات الافتراضية أيضًا لمعرفة نوع الإجابة المتوقعة. يعرض ما يلي اسم المشروع بأحرف كبيرة يتضمن مسافات:
</p>

<pre class="ipsCode" id="ips_uid_1464_8"> project_name [Basic Python Project]:‎ </pre>

<p>
	بينما يوضح اسم الوحدة بأحرف صغيرة ولا تحتوي على مسافات:
</p>

<pre class="ipsCode" id="ips_uid_1464_10">module_name [basicpythonproject]:‎</pre>

<p>
	لم ندخل ردًا لموجّه <code>project_version [0.1.0]:‎</code>، لذا فإن الإستجابة الافتراضية هي "0.1.0".
</p>

<p>
	يُنشئ Cookiecutter بعد الإجابة على الأسئلة مجلد wizcoin في مجلد العمل الحالي مع الملفات الأساسية التي ستحتاجها لمشروع بايثون، كما هو موضح في الشكل 1.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="130921" href="https://academy.hsoub.com/uploads/monthly_2023_07/files-generated-by-cookiecutter.png.a26064f290f33dc6945cb1fd2e155864.png" rel=""><img alt="files-generated-by-cookiecutter.png" class="ipsImage ipsImage_thumbnailed" data-fileid="130921" data-unique="ws22rj0n9" src="https://academy.hsoub.com/uploads/monthly_2023_07/files-generated-by-cookiecutter.png.a26064f290f33dc6945cb1fd2e155864.png"> </a>
</p>

<p style="text-align: center;">
	[الشكل 1: الملفات الموجودة في مجلد wizcoin الذي أُنشئ بواسطة Cookiecutter.]
</p>

<p>
	لا بأس إذا كنت لا تفهم الغرض من هذه الملفات. الشرح الكامل لكل منها خارج نطاق هذه السلسلة، ولكن يحتوي <a href="https://github.com/asweigart/cookiecutter-basicpythonproject" rel="external nofollow">الرابط</a> على روابط وشرح وصفي لمزيد من القراءة. الآن وبعد أن أصبح لدينا ملفات البداية، دعنا نتتبعها باستخدام غيت.
</p>

<h2>
	تثبيت غيت git
</h2>

<p>
	قد يكون غيت git مثبتًا فعلًا على حاسوبك، وللتيقن من ذلك، نفّذ <code>git --version</code> من سطر الأوامر، فإذا رأيت رسالةً، مثل <code>git version 2.29.0.windows.1</code>، فهذا يعني أن غيت مثبتًا فعلًا، أما إذا رأيت رسالة الخطأ "الأمر غير موجود"، فيجب عليك تثبيت غيت. إذا كنت تستخدم نظام ويندوز فانتقل إلى "https://git-scm.com/download"، ثم حمّل مثبّت غيت Git installer وشغّله، أما إذا كنت تستخدم نظام التشغيل ماك macOS Mavericks (10.9)‎ أو إصدارًا أحدث، فما عليك سوى تنفيذ <code>git --version</code> من الطرفية وستبدأ عملية تثبيت غيت في حال عدم وجوده، كما هو موضح في الشكل 2.
</p>

<p>
	أما إذا كنت تستخدم <a href="https://academy.hsoub.com/apps/operating-systems/linux/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%B3%D8%B7%D8%AD-%D9%85%D9%83%D8%AA%D8%A8-%D8%A3%D9%88%D8%A8%D9%88%D9%86%D8%AA%D9%88-2004-r779/" rel="">أوبنتو لينكس Ubuntu</a> أو <a href="https://academy.hsoub.com/devops/linux/%D9%81%D9%8A-%D9%85%D8%A7%D8%B0%D8%A7-%D9%8A%D8%AE%D8%AA%D9%84%D9%81-ubuntu-%D8%B9%D9%86-debian%D8%9F-r235/" rel="">ديبيان لينكس Debian</a> نفذ <code>sudo apt install git-all</code> من <a href="https://academy.hsoub.com/devops/linux/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%B7%D8%B1%D9%81%D9%8A%D9%91%D8%A9-%D9%84%D9%8A%D9%86%D9%83%D8%B3-linux-terminal-r18/" rel="">الطرفية Terminal</a>، أو إذا كنت تستخدم ريدهات لينكس Red Hat، فنفذ <code>sudo dnf install git-all</code> من الطرفية، وإذا كنتَ تستخدم نظامًا آخر ابحث عن إرشادات لموزعين لينكس الآخرين على <a href="https://git-scm.com/download/linux" rel="external nofollow">git-scm.com/download/linux</a>، وتأكد من أن عملية التثبيت نجحت عن طريق تنفيذ <code>git --version</code>.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="130920" href="https://academy.hsoub.com/uploads/monthly_2023_07/git-installation-dialog.png.eea4c0f237ce3c96aeb72136fe6b0eb3.png" rel=""><img alt="git-installation-dialog.png" class="ipsImage ipsImage_thumbnailed" data-fileid="130920" data-unique="lue2q3cyo" src="https://academy.hsoub.com/uploads/monthly_2023_07/git-installation-dialog.png.eea4c0f237ce3c96aeb72136fe6b0eb3.png"> </a>
</p>

<p style="text-align: center;">
	[الشكل 2: سيُطلب منك في المرة الأولى التي تنفّذ فيها <code>git --version</code> على macOS 10.9 أو أحدث بتثبيت غيت.]
</p>

<h2>
	ضبط اسم المستخدم والبريد الإلكتروني الخاصين بغيت
</h2>

<p>
	ستحتاج إلى ضبط اسمك وبريدك الإلكتروني بعد تثبيت غيت بحيث تتضمن إيداعاتك معلومات المؤلف (أنت)، ولفعل ذلك، نفّذ الأمر <code>git config</code> من الطرفية وذلك باستخدام اسمك ومعلومات بريدك الإلكتروني كما يلي:
</p>

<pre class="ipsCode">C:\Users\Al&gt;‎‎‎git config --global user.name "Al Sweigart"
C:\Users\Al&gt;‎‎‎git config --global user.email al@inventwithpython.com
</pre>

<p>
	تُخزن هذه المعلومات في ملف "‎.gitconfig" في المجلد الرئيسي الخاص بك، مثل "C:\Users\Al" على حاسوبك الذي يعمل بنظام ويندوز. لن تحتاج أبدًا إلى تعديل هذا الملف النصي مباشرةً، بل بدلًا من ذلك، يمكنك تغييره عن طريق تنفيذ الأمر <code>git config</code> كما يمكنك إظهار إعدادات ضبط غيت الحالية باستخدام الأمر <code>git config --list</code>.
</p>

<h2>
	ثبيت أدوات واجهة المستخدم الرسومية لغيت GUI Git
</h2>

<p>
	تركز هذه المقالة على أداة سطر أوامر غيت، ولكن تثبيت البرنامج الذي يضيف واجهة المستخدم الرسومية لغيت يمكن أن يساعدك في المهام اليومية. يستخدم المبرمجون المحترفون الذين يعرفون سطر أوامر غيت CLI Git أدوات واجهة المستخدم الرسومية لغيت. تحتوي صفحة الويب <a href="https://git-scm.com/downloads/guis" rel="external nofollow">https://git-scm.com/downloads/guis</a> على العديد من هذه الأدوات، مثل TortoiseGit لنظام التشغيل ويندوز و GitHub Desktop لنظام التشغيل ماك و GitExtensions لنظام التشغيل لينكس.
</p>

<p>
	يوضح الشكل 3 كيف تضيف أداة TortoiseGit على ويندوز رموزًا إلى أيقونات مستعرض الملفات بناءً على حالتها؛ بحيث يشير الأخضر لملفات المستودع غير المعدلة، والأحمر لملفات المستودع المعدلة (أو المجلدات التي تحتوي على ملفات معدلة)، وتغيب الرموز عن الملفات التي لم يجري تعقبها. من المؤكد أن التحقق من هذه الرموز هو أكثر سهولة من إدخال الأوامر باستمرار في طرفية للحصول على هذه المعلومات، كما تضيف TortoiseGit أيضًا أوامر في القائمة المنسدلة لتنفيذ أوامر غيت كما هو موضح في الشكل 3.
</p>

<p>
	يعد استخدام أدوات واجهة المستخدم الرسومية لغيت أمرًا مريحًا، إلا أنه ليس بديلًا عن تعلم أوامر سطر الأوامر الواردة في هذه المقالة. ضع في الحسبان أنك قد تحتاج يومًا ما إلى استخدام غيت على حاسوب لم تُثَبّت أدوات واجهة المستخدم الرسومية عليه.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="130919" href="https://academy.hsoub.com/uploads/monthly_2023_07/tortoise-menu-overlay.png.f3426b555beb62baa40d668b9c72d804.png" rel=""><img alt="tortoise-menu-overlay.png" class="ipsImage ipsImage_thumbnailed" data-fileid="130919" data-unique="tcqy7d6gq" src="https://academy.hsoub.com/uploads/monthly_2023_07/tortoise-menu-overlay.png.f3426b555beb62baa40d668b9c72d804.png"> </a>
</p>

<p style="text-align: center;">
	[الشكل 3: تضيف TortoiseGit لنظام التشغيل ويندوز واجهة مستخدم رسومية لتنفيذ أوامر غيت من مستعرض الملفات.]
</p>

<h2>
	سير عمل غيت
</h2>

<p>
	يتضمن استخدام مستودع غيت الخطوات التالية: أولًا، إنشاء مستودع غيت عن طريق تنفيذ الأمر <code>git init</code> أو الأمر <code>git clone</code>. ثانيًا، إضافة ملفات باستخدام الأمر <code>git add &lt;filename&gt;‎‎‎‎</code> لتتبع المستودع. ثالثًا، بمجرد إضافة الملفات، يمكنك إيداع التغييرات الحاصلة فيها باستخدام الأمر:
</p>

<pre class="ipsCode">git commit -am "&lt;descriptive commit message&gt;‎‎‎‎"‎
</pre>

<p>
	وبعد ذلك أنت جاهز لإجراء التغييرات على شفرتك مجددًا.
</p>

<p>
	يمكنك عرض ملف التعليمات لكل من هذه الأوامر عن طريق تنفيذ <code>git help &lt;command&gt;‎‎‎‎</code>، مثل <code>git help init</code> أو <code>git help add</code>. صفحات المساعدة هذه سهلة الاستخدام والرجوع إليها على الرغم من أنها مملة وتقنية لاستخدامها مثل وسيلة تعليمية، وستتعرف على مزيد من التفاصيل بخصوص كل من هذه الأوامر لاحقًا، ولكن أولًا، تحتاج إلى فهم بعض مفاهيم غيت لتسهيل استيعاب بقية هذه المقالة.
</p>

<h2>
	كيفية تتبع غيت لحالة الملف
</h2>

<p>
	الملفات الموجودة في مجلد المشروع هي ملفات مُتتبعة tracked من غيت أو غير متتبعة untracked والملفات المتتبعة هي الملفات التي تُضاف وتودع في المستودع، بينما يُصنّف أي ملف آخر على أنه ملف غير متتبع. قد لا تتواجد الملفات التي لم يجري تتبعها في مجلد المشروع في مستودع غيت، بينما توجد الملفات المتتبعة بإحدى الحالات الثلاث:
</p>

<ul>
	<li>
		حالة الإيداع committed state: هي عندما يكون الملف بنسخة مجلد المشروع مطابقًا لأحدث إيداع في المستودع، وتسمى هذه الحالة أحيانًا بالحالة غير المعدلة unmodified state أو بالحالة النظيفة clean state.
	</li>
	<li>
		الحالة المعدلة modified state: هي الحالة التي يكون عندها الملف في مجلد المشروع مختلفًا عن أحدث إيداع في المستودع.
	</li>
	<li>
		الحالة المُدرجة staged state: هي عندما يُعدّل الملف وتوضع علامة عليه ليُضمَّن في الإيداع التالي، ونقول عندها أن الملف مدرج أو في منطقة الإدراج، وتُعرف منطقة الإدراج أيضًا بالفهرس index أو ذاكرة التخزين المؤقتة cache.
	</li>
</ul>

<p>
	يحتوي الشكل 4 على رسم تخطيطي لكيفية تنقّل الملف بين هذه الحالات الأربع، ويمكنك إضافة ملف لم يُتتبَّع إلى مستودع غيت، وفي هذه الحالة يُتتبَّع ويُدرج، ومن ثم يمكنك إيداع ملفات مُدرجة لوضعها في حالة الإيداع. لا تحتاج إلى أي أمر غيت لوضع الملف في الحالة الُمعدّلة؛ فبمجرد إجراء تغييرات على ملف مودع، يُصنَّف تلقائيًا على أنه في الحالة المعدلة.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="130922" href="https://academy.hsoub.com/uploads/monthly_2023_07/file-states.png.662ba35ca2731cd8f4de970effe5d13f.png" rel=""><img alt="file-states.png" class="ipsImage ipsImage_thumbnailed" data-fileid="130922" data-unique="87d5qfi9h" src="https://academy.hsoub.com/uploads/monthly_2023_07/file-states.png.662ba35ca2731cd8f4de970effe5d13f.png"> </a>
</p>

<p style="text-align: center;">
	[الشكل 4: الحالات المحتملة لملف في مستودع غيت والتنقل بينها.]
</p>

<p>
	نفذ <code>git status</code> في أي خطوة بعد إنشاء المستودع لعرض حالة المستودع الحالية وحالة ملفاته. ستُنفذ هذا الأمر بصورةٍ متكررة أثناء عملك مع غيت. في المثال التالي، أعددت ملفات في حالات مختلفة، لاحظ كيف تظهر هذه الملفات الأربعة في خرج <code>git status</code>:
</p>

<pre class="ipsCode">C:\Users\Al\ExampleRepo&gt;‎‎‎git status
On branch master
Changes to be committed:
  (use "git restore --staged &lt;file&gt;‎‎‎..." to unstage)
       1 new file:   new_file.py
       2 modified:   staged_file.py

Changes not staged for commit:
  (use "git add &lt;file&gt;‎‎‎..." to update what will be committed)
  (use "git restore &lt;file&gt;‎‎‎..." to discard changes in working directory)
       3 modified:   modified_file.py

Untracked files:
  (use "git add &lt;file&gt;‎‎‎..." to include in what will be committed)
       4 untracked_file.py
</pre>

<p>
	في مشروعنا هذا، يوجد new_file.py (سطر 1) الذي أُضيفَ مؤخرًا إلى المستودع وبالتالي فهو في الحالة المُدرجة. هناك أيضًا ملفان متتبعان، وهما staged_file.py (سطر 2) و modified_file.py (سطر 3)، وهما في الحالة المُدرجة والمعدلة، على التوالي، ثم هناك ملف غير مُتتبع اسمه untracked_file.py (سطر 4). يحتوي خرج <code>git status</code> أيضًا على تذكيرات لأوامر غيت التي تنقل الملفات إلى حالات أخرى.
</p>

<h2>
	ما هي الفائدة من وضع الملفات في الحالة المدرجة؟
</h2>

<p>
	قد تتساءل ما هو الهدف من الحالة المُدرجة، لمَ لا ننتقل فقط بين التعديل والإيداع دون الملفات المُدرجة؟ التعامل مع الحالة المُدرجة مليء بالحالات الخاصة الشائكة ومصدر كبير للارتباك للمبتدئين في غيت. على سبيل المثال، يمكن تعديل الملف بعد إدراجه، مما يؤدي إلى وجود ملفات في كل من الحالات المعدلة والمُدرجة، كما هو موضح في القسم السابق.
</p>

<p>
	تقنيًا، لا تحتوي المنطقة المُدرجة على ملفات بقدر ما تحتوي على تغييرات، لأنه يمكن لأجزاء من ملف واحد معدل أن تكون في الحالة المدرجة، بينما لا تنتمي أجزاء أخرى لهذه الحالة. هذه هي الحالات التي تسببت بشهرة غيت إذ أنها معقدة، وغالبًا ما تكون العديد من مصادر المعلومات حول كيفية عمل غيت غير دقيقة في أحسن الأحوال ومضللة في أسوأ الأحوال.
</p>

<h2>
	إنشاء مستودع غيت على حاسوبك
</h2>

<p>
	غيت هو نظام تحكم في الإصدار الموزع، مما يعني أنه يخزن جميع اللقطات وبيانات المستودع الوصفية محليًا على حاسبك في مجلد يسمى "‎.git". على عكس نظام التحكم في الإصدار المركزي، لا يحتاج غيت للاتصال بخادم عبر الإنترنت لإجراء الإيداعات، مما يجعل غيت سريعًا ومتاحًا للعمل معه عندما تكون غير متصل بالإنترنت.
</p>

<p>
	من الطرفية، نفذ الأوامر التالية لإنشاء مجلد "‎.git". ستحتاج في نظامي ماك أو إس ولينكس، إلى تنفيذ <code>mkdir</code> بدلًا من <code>md</code>.
</p>

<pre class="ipsCode">C:\Users\Al&gt;‎‎‎md wizcoin
C:\Users\Al&gt;‎‎‎cd wizcoin
C:\Users\Al\wizcoin&gt;‎‎‎git init
Initialized empty Git repository in C:/Users/Al/wizcoin/.git/ 
</pre>

<p>
	عند تحويل مجلد إلى مستودع غيت بتنفيذ <code>git init</code>، تبدأ جميع الملفات الموجودة فيه بدون تتبع. بالنسبة لمجلد wizcoin الخاص بنا، يُنشئ الأمر <code>git init</code> مجلدًا يدعى "wizcoin/.git"، الذي يحتوي بدوره على البيانات الوصفية لمستودع غيت. يؤدي وجود هذا المجلد "‎.git" إلى جعل المجلد مستودع غيت؛ وبدونه سيكون لديك ببساطة مجموعة من ملفات الشيفرة المصدرية في مجلد عادي. لن تضطر أبدًا إلى تعديل الملفات في "‎.git" مباشرةً، لذا تجاهل هذا المجلد. في الواقع، سُميَ المجلد "‎.git" بهذا الاسم لأن معظم <a href="https://academy.hsoub.com/apps/operating-systems/%D9%86%D8%B8%D8%A7%D9%85-%D8%A7%D9%84%D8%AA%D8%B4%D8%BA%D9%8A%D9%84/" rel="">أنظمة التشغيل</a> تخفي تلقائيًا المجلدات والملفات التي تبدأ أسماؤها بنقطة.
</p>

<p>
	الآن لديك مستودع في المجلد "C:\Users\Al\wizcoin". يُعرف المستودع الموجود على حاسبك باسم المستودع المحلي local repo؛ يُعرف المستودع الموجود على حاسوب شخص آخر باسم المستودع البعيد remote repo. هذا التمييز مهم، لأنه سيتعين عليك غالبًا مشاركة الإيداعات بين المستودعات البعيدة والمحلية حتى تتمكن من العمل مع مطورين آخرين في المشروع ذاته.
</p>

<p>
	يمكنك الآن استخدام الأمر <code>git</code> لإضافة ملفات وتتبع التغييرات داخل مجلد المشروع، إذ سترى ما يلي إذا نفذت <code>git status</code> في المستودع الذي أنشأته حديثًا:
</p>

<pre class="ipsCode">C:\Users\Al\wizcoin&gt;‎‎‎git status
On branch master

No commits yet

nothing to commit (create/copy files and use "git add" to track)
</pre>

<p>
	يخبرك خرج هذا الأمر أنه ليس لديك أي إيداعات حتى الآن في هذا المستودع.
</p>

<h4>
	تنفيذ أمر git status مع أمر watch
</h4>

<p>
	أثناء استخدام أداة سطر أوامر غيت، ستنفّذ غالبًا الأمر <code>git status</code> لمعرفة حالة المستودع الخاص بك، وبدلًا من إدخال هذا الأمر يدويًا، يمكنك استخدام الأمر <code>watch</code> لتنفيذه نيابةً عنك. ينفّذ الأمر <code>watch</code> أمرًا معينًا بصورةٍ متكررة كل ثانيتين، مع تحديث الشاشة بأحدث خرج لها.
</p>

<p>
	يمكنك الحصول على أمر <code>watch</code> عن طريق تنزيل <a href="https://inventwithpython.com/watch.exe" rel="external nofollow">InventWithPython</a> في نظام التشغيل ويندوز، أو يمكنك الحصول على أمر <code>watch</code> عن طريق تنزيل <a href="https://inventwithpython.com/watch.exe" rel="external nofollow">InventWithPython</a> ووضع هذا الملف في مجلد "PATH"، مثل "C:\Windows"، بينما يمكنك الانتقال إلى <a href="https://www.macports.org/" rel="external nofollow">https://www.macports.org/</a> في نظام ماك، لتنزيل MacPorts وتثبيته، ثم نفذ <code>sudo ports install watch</code>. يحتوي <a href="https://academy.hsoub.com/devops/linux/%D9%85%D8%A7-%D9%87%D9%88-%D9%86%D8%B8%D8%A7%D9%85-%D8%A7%D9%84%D8%AA%D8%B4%D8%BA%D9%8A%D9%84-%D9%84%D9%8A%D9%86%D9%83%D8%B3%D8%9F-r451/" rel="">نظام لينكس</a> على هذا الأمر فعلًا، وبمجرد تثبيته، افتح موجه أوامر جديد أو نافذة طرفية جديدة، ونفذ <code>cd</code> لتغيير المجلد إلى مجلد مستودع غيت الخاص بك، ونفذ <code>watch "git status"‎</code>؛ إذ سيعمل الأمر <code>watch</code> على تنفيذ <code>git status</code> كل ثانيتين، ويعرض أحدث النتائج على الشاشة. يمكنك ترك هذه النافذة مفتوحة أثناء استخدام أداة سطر أوامر غيت في نافذة طرفية مختلفة لترى كيف تتغير حالة المستودع في الوقت الفعلي، كما يمكنك فتح نافذة طرفية أخرى وتنفيذ <code>watch "git log -oneline"‎</code> لعرض ملخص الإيداعات التي تفعلها، والتي يجري تحديثها أيضًا في الوقت الفعلي. تساعد هذه المعلومات في إزالة الغموض المتعلق بما تفعله أوامر غيت التي تكتبها في المستودع الخاص بك.
</p>

<h2>
	إضافة ملفات لغيت لتعقبها
</h2>

<p>
	يمكن فقط إيداع أو التراجع عن أو التفاعل مع الملفات المتتبعة من خلال الأمر <code>git</code>. نفّذ <code>git status</code> لمعرفة حالة الملفات في مجلد المشروع:
</p>

<pre class="ipsCode">C:\Users\Al\wizcoin&gt;git status
On branch master

No commits yet

1 Untracked files:
  (use "git add &lt;file&gt;..." to include in what will be committed)

        .coveragerc
        .gitignore
        LICENSE.txt
        README.md
--snip--
        tox.ini

nothing added to commit but untracked files present (use "git add" to track)
</pre>

<p>
	لم يحدث تعقب لأي من الملفات الموجودة في مجلد "wizcoin" حاليًا (سطر 1)، ويمكننا تتبعها عن طريق إجراء إيداع أولي لهذه الملفات، الذي يكون على خطوتين: تنفيذ <code>git add</code> لكل ملف يجري إيداعه، ثم تنفيذ <code>git commit</code> لإنشاء إيداع لكل هذه الملفات، ويتتبع غيت الملف بمجرّد إيداعه.
</p>

<p>
	ينقل الأمر <code>git add</code> الملفات من حالة عدم التتبع أو الحالة المعدلة إلى الحالة المُدرجة، إذ يمكننا تنفيذ <code>git add</code> لكل ملف نخطط لتعديله. على سبيل المثال، <code>git add .coveragerc</code> و <code>git add .gitignore</code> و <code>git add LICENSE.txt</code> وما إلى ذلك، لكن هذا أمر ممل. بدلًا من ذلك، دعنا نستخدم الرمز <code>*</code> لإضافة عدة ملفات مرة واحدة. على سبيل المثال، يضيف <code>git add *.py</code> جميع ملفات "‎.py" في مجلد العمل الحالي والمجلدات الفرعية الخاصة به. لإضافة كل ملف لم يجري تعقبه، استخدم نقطة واحدة (.) لإخبار غيت بمطابقة جميع الملفات:
</p>

<pre class="ipsCode">C:\Users\Al\wizcoin&gt;‎‎‎git add .
</pre>

<p>
	نفّذ <code>git status</code> لرؤية الملفات التي أدرجتها:
</p>

<pre class="ipsCode">C:\Users\Al\wizcoin&gt;git status
On branch master

No commits yet

1 Changes to be committed:
  (use "git rm --cached &lt;file&gt;..." to unstage)

     2 new file:   .coveragerc
        new file:   .gitignore
--snip--
        new file:   tox.ini
</pre>

<p>
	يخبرك خرج <code>git status</code> عن الملفات التي ستُنفَّذ على مراحل في المرة التالية التي تنفّذ فيها <code>git commit</code> (سطر 1)، ويخبرك أيضًا أن هذه ملفات جديدة أُضيفت إلى المستودع (سطر 2) بدلًا من الملفات المُعدّلة الموجودة في المستودع.
</p>

<p>
	بعد تنفيذ <code>git add</code> لتحديد الملفات المراد إضافتها إلى المستودع، نفذ الأمر التالي:
</p>

<pre class="ipsCode">git commit -m "Adding new files to the repo.”
</pre>

<p>
	و <code>git status</code> مرةً أخرى لعرض حالة المستودع:
</p>

<pre class="ipsCode">C:\Users\Al\wizcoin&gt;git commit -m "Adding new files to the repo."
[master (root-commit) 65f3b4d] Adding new files to the repo.
 15 files changed, 597 insertions(+)
 create mode 100644 .coveragerc
 create mode 100644 .gitignore
--snip--
 create mode 100644 tox.ini

C:\Users\Al\wizcoin&gt;git status
On branch master
nothing to commit, working tree clean
</pre>

<p>
	لاحظ أن أي ملفات مدرجة في ملف "‎.gitignore" لن تُضاف إلى منطقة الإدراج، كما سيوضح القسم التالي.
</p>

<h2>
	تجاهل الملفات في المستودع
</h2>

<p>
	تظهر الملفات التي لم يجري تتبعها بواسطة غيت على أنها لم غير متتبعة عند تنفيذ <code>git status</code>، ولكن قد ترغب في استبعاد ملفات معينة من نظام التحكم في الإصدار تمامًا أثناء كتابة الشيفرة البرمجية، وذلك حتى لا تتبعها عن طريق الخطأ. وتشمل هذه الملفات:
</p>

<ul>
	<li>
		الملفات المؤقتة في مجلد المشروع.
	</li>
	<li>
		ملفات "‎.pyc" و "‎.pyo" و "‎.pyd" التي ينشئها مُفسر بايثون عند تنفيذ برامج "‎.py".
	</li>
	<li>
		ملفات "‎.tox" و "htmlcov" والمجلدات الأخرى التي تنشئها أدوات تطوير البرامج المختلفة docs/_build.
	</li>
	<li>
		أي ملفات أخرى مجمعة أو مُنشأة يمكن إعادة إنشائها (لأن المستودع مخصص للملفات المصدرية، وليس للمنتجات المُنشأة من الملفات المصدرية).
	</li>
	<li>
		ملفات الشيفرة المصدرية التي تحتوي على كلمات مرور قاعدة البيانات أو رموز المصادقة المميزة أو أرقام بطاقات الائتمان أو غيرها من المعلومات الحساسة.
	</li>
</ul>

<p>
	لتجنب تضمين هذه الملفات، أنشئ ملفًا نصيًا باسم "‎.gitignore" يحتوي على المجلدات والملفات التي يجب ألا يتتبعها غيت مطلقًا، وسيستثني غيت بدوره هذه الملفات والمجلدات تلقائيًا من أوامر <code>git add</code> أو <code>git commit</code>، ولن تظهر عند تنفيذ <code>git status</code>.
</p>

<p>
	يبدو ملف "‎.gitignore" الذي ينشئه قالب <code>cookiecutter-basicpythonproject</code> على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_2813_14" style=""><span class="com"># Byte-compiled / optimized / DLL files</span><span class="pln">
__pycache__</span><span class="pun">/</span><span class="pln">
</span><span class="pun">*.</span><span class="pln">py</span><span class="pun">[</span><span class="pln">cod</span><span class="pun">]</span><span class="pln">
</span><span class="pun">*</span><span class="pln">$py</span><span class="pun">.</span><span class="kwd">class</span><span class="pln">
</span><span class="pun">--</span><span class="pln">snip</span><span class="pun">--</span></pre>

<p>
	يستخدم ملف "‎.gitignore" الرمز <code>*</code> لأحرف البدل wildcards و <code>#</code> للتعليقات. يمكنك قراءة المزيد عنها على صفحة <a href="https://git-scm.com/docs/gitignore" rel="external nofollow">gitignore</a> في التوثيق الرسمي.
</p>

<p>
	يجب عليك إضافة ملف "‎.gitignore" الفعلي إلى مستودع غيت حتى يتمكن المبرمجون الآخرون من الحصول عليه إذا استنسخوا clone مستودعك. إذا كنت تريد معرفة أي الملفات في دليل العمل قد جرى تجاهلها بناءً على الإعدادات في ‎.gitignore، فنفذ الأمر التالي:
</p>

<pre class="ipsCode">git ls-files --other --ignored --exclude-standard
</pre>

<h2>
	الخلاصة
</h2>

<p>
	أنظمة التحكم في الإصدار منقذة المبرمجين، إذ يؤدي إيداع لقطات من الشيفرة البرمجية إلى تسهيل مراجعة تقدمك، وفي بعض الحالات، التراجع عن التغييرات التي لا تحتاج إليها. من المؤكد أن تعلُّم أساسيات نظام التحكم في الإصدار مثل غيت يوفر لك الوقت على المدى الطويل.
</p>

<p>
	تحتوي مشاريع بيثون عادةً على العديد من الملفات والمجلدات الافتراضية، وتساعدك وحدة <code>cookiecutter</code> في إنشاء نموذج أساسي للعديد من هذه الملفات. تشكل هذه الملفات الملفات الأولى التي تودعها في مستودع غيت المحلي الخاص بك. نسمي المجلد الذي يحتوي على كل هذا المحتوى مجلد العمل أو مجلد المشروع.
</p>

<p>
	ترجمة -وبتصرف- لقسم من الفصل <a href="http://inventwithpython.com/beyond/chapter12.html" rel="external nofollow">ORGANIZING YOUR CODE PROJECTS WITH GIT</a> من كتاب <a href="https://inventwithpython.com/beyond//" rel="external nofollow">Beyond the Basic Stuff with Python</a>.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		المقال السابق: <a href="https://academy.hsoub.com/programming/python/%D8%AA%D9%84%D9%85%D9%8A%D8%AD%D8%A7%D8%AA-%D8%A7%D9%84%D9%86%D9%88%D8%B9-type-hints-%D9%81%D9%8A-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-r2033/" rel="">تلميحات النوع Type Hints في بايثون</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/workflow/git/%D8%A8%D8%AF%D8%A1-%D8%A7%D9%84%D8%B9%D9%85%D9%84-%D9%85%D8%B9-%D9%86%D8%B8%D8%A7%D9%85-%D8%A5%D8%AF%D8%A7%D8%B1%D8%A9-%D8%A7%D9%84%D8%A5%D8%B5%D8%AF%D8%A7%D8%B1%D8%A7%D8%AA-%D8%AC%D9%8A%D8%AA-git-r1593/" rel="">بدء العمل مع نظام إدارة الإصدارات جيت Git</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/workflow/git/%D9%85%D8%A8%D8%A7%D8%AF%D8%A6-git-%D8%A7%D9%84%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A9-r256/" rel="">مبادئ Git الأساسية</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">2034</guid><pubDate>Fri, 21 Jul 2023 13:00:00 +0000</pubDate></item><item><title>&#x643;&#x64A;&#x641;&#x64A;&#x629; &#x625;&#x62F;&#x627;&#x631;&#x629; &#x627;&#x644;&#x643;&#x627;&#x626;&#x646;&#x627;&#x62A; &#x627;&#x644;&#x62B;&#x646;&#x627;&#x626;&#x64A;&#x629; Binary Blobs &#x628;&#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; &#x62C;&#x64A;&#x62A; Git</title><link>https://academy.hsoub.com/programming/workflow/git/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%A5%D8%AF%D8%A7%D8%B1%D8%A9-%D8%A7%D9%84%D9%83%D8%A7%D8%A6%D9%86%D8%A7%D8%AA-%D8%A7%D9%84%D8%AB%D9%86%D8%A7%D8%A6%D9%8A%D8%A9-binary-blobs-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%AC%D9%8A%D8%AA-git-r1606/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2022_06/62ac44408c7bf_----Bainary-Blobs--.jpg.aba03445db0c2e090e19173fb1717016.jpg" /></p>

<p>
	تحدثنا في المقالات السابقة عن كيفية التحكم في الإصدار من خلال جيت بالنسبة للملفات النصية فقط، لكن ماذا عن الملفات الثنائية؟ جيت لديها بعض الإضافات التي تمكنها من التعامل مع هذا النوع من الملفات، وهذا هو موضوع المقال الأخير من هذه السلسلة.
</p>

<h2>
	تعامل جيت git مع الكائنات الثنائية المصدرية Binary Blobs
</h2>

<p>
	جميع المستخدمين يتفقون على أن جيت أداة محدودة القدرة في التعامل مع الكائنات الثنائية المصدرية، ولا سيما الكبيرة منها، ولقد أشرنا إلى ذلك في المقال الأول. تجدر الملاحظة إلى أنه بإمكانك استخدام جيت مع الملفات النصية الكبيرة جدًا دون مشاكل، لكن مع ملف ثنائي فالأمر مختلف، فجيت في هذه الحالة لا تستطيع معاملته إلا كصندوق أسود كبيرة وتحفظه كما هو.
</p>

<p>
	لنفترض أن لديك نموذجًا معقدًا ثلاثي الأبعاد يمثل لعبة ألغاز جديدة تصنعها، وحفظته بصيغة ثنائية ونتج ملف بسعة 1 جيجابايت، ثم نفذت عملية إيداع للملف، أي أنك أضفت 1 جيجابايت كاملة إلى سجل مستودعك. لاحقًا قررت إجراء بعض التعديلات على هذا النموذج، وبالفعل قمت بتعديل لون شعر النموذج وتريد أن تقوم بتنفيذ عملية إيداع مرة أخرى؛ وهنا لا يمكن لجيت تمييز اللون ولا حتى معرفة فيما إذا غيرت لون الشعر فقط أو أنك غيرت لون كامل النموذج، وهذه مشكلة، لأن جيت في هذه الحالة سيخصص غيغابايت جديدة بالكامل لهذا الإيداع، وربما تقرر لاحقًا تغيير لون عينه أو شكل رأسه، ومع كل مرة ننفذ عملية إيداع نستهلك جيجابايت جديدة بالرغم من أن التعديلات طفيفة للغاية، وهذه مشكلة خطية. بينما لو قارنت ذلك بملف نصي مهما كان تنسيقه، فستجد أن الأمر مختلف تمامًا، فجيت في حالة الملفات النصية يستطيع فهم التعديلات، وبدل أن يقوم بحفظ كامل الملف مرة أخرى بعد كل عملية إيداع تُجريها، فإنه يقوم بالتعديل على النسخة السابقة فقط. عمومًا، هناك حاجة كبيرة لاستخدام الملفات الثنائية عند العديد من المستخدمين، لذا ظهرت العديد من الحلول.
</p>

<p>
	يعد Git Large File Storage (اختصارًا LFS) مشروعًا <a href="https://academy.hsoub.com/programming/general/%D9%85%D8%A7-%D8%A7%D9%84%D9%85%D9%82%D8%B5%D9%88%D8%AF-%D8%A8%D9%85%D8%B5%D8%B7%D9%84%D8%AD-%D9%85%D9%81%D8%AA%D9%88%D8%AD-%D8%A7%D9%84%D9%85%D8%B5%D8%AF%D8%B1-open-source%D8%9F-r885/" rel="">مفتوح المصدر</a> من جيت هاب بدأ كفرع من Git-media، إذ Git-media و git-annex هما إضافات لجيت يهدفان إلى إدارة الملفات الكبيرة، وكل منهما له طريقته الخاصة وميزاته التي يتفرد بها، والتالي يمثل بعضًا منها:
</p>

<ul>
<li>
		Git-annex هو نظام مزامنة ملفات موزع يسمح لك بإدارة الملفات الكبيرة، حيث تُنشئ أنت والمستخدمين مستودعاتكم الخاصة ويكون لكل مستودع مجلد محلي ‎.git/annex يتم فيه تخزين الملفات الكبيرة. تتم مزامنة كل شيء بانتظام وبالتالي كل البيانات اللازمة تكون متاحة لجميع المستخدمين. افتراضيًا يفضل git-annex التخزين المحلي قبل التخزين خارج الموقع، لكن يمكنك تغيير ذلك من خلال annex-cost.
	</li>
	<li>
		Git-portal هو أيضًا نظام مزامنة ملفات موزع، وكما هو الحال في git-annex لديها خيار المزامنة مع موقع مركزي، ويستخدم أدوات مساعدة شائعة، مثل <a href="https://academy.hsoub.com/devops/linux/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%B5%D8%AF%D9%81%D8%A9-%D8%A8%D8%A7%D8%B4-bash-r606/" rel="">باش Bash</a> وجيت وبرنامج <a href="https://academy.hsoub.com/devops/linux/%D9%83%D9%8A%D9%81-%D8%AA%D8%B3%D8%AA%D8%AE%D8%AF%D9%90%D9%85-rsync-%D9%84%D9%85%D8%B2%D8%A7%D9%85%D9%86%D8%A9-%D9%85%D8%AC%D9%84%D9%91%D8%AF%D8%A7%D8%AA-%D8%A8%D9%8A%D9%86-%D8%A7%D9%84%D8%AC%D9%87%D8%A7%D8%B2-%D8%A7%D9%84%D9%85%D8%AD%D9%84%D9%91%D9%8A-%D9%88%D8%A7%D9%84%D8%AE%D8%A7%D8%AF%D9%88%D9%85-r50/" rel="">rsync</a>.
	</li>
	<li>
		Git-LFS هو نموذج مركزي، ومستودع للملفات والبيانات المشتركة. أنت تخبر Git-LFS أين هو المكان الذي يتم فيه تخزين ملفاتك الكبيرة، سواء كان على قرص صلب أو مخدم أو خدمة تخزين سحابية، ويتعامل كل مستخدم في مشروعك مع هذا المكان باعتباره الموقع الرئيسي المركزي للملفات الكبيرة.
	</li>
</ul>
<h2>
	نموذج git-portal
</h2>

<p>
	يؤمن Git-portal لجيت إمكانية إدارة الكائنات الثنائية باستخدام أدوات يونكس الأساسية مثل باش وجيت نفسها وبرنامج rsync اختياريًا. ينسخ Git-portal الملفات الثنائية الكبيرة إلى وحدة تخزين محلية أو خارجية (بعيدة)، ويعطيك روابط لينة symlinks يمكنك إيداعها جنبًا إلى جنب مع بقية ملفات مشروعك.
</p>

<p>
	إنه أداة بسيطة عمومًا، ويتطلب تنفيذ إجراءات يدويًا أحيانًا، مثلًا لا تحتوي على جامع مهملات (إجرائية لتتبع البيانات غير المستخدمة والتي تستهلك الموارد مثل الذاكرة)، وبالتالي يجب عليك القيام بذلك يدويًا، وهو أداة مثالية للمستخدمين الذين يحتاجون إلى إدارة الملفات الكبيرة والتي من الصعب أو غير الممكن إداراتها من خلال جيت، وهي لا تختلف عن جيت إلا ببعض الأمور البسيطة جدًا، لذا فتعلمه لن يكون عائقًا على الإطلاق.
</p>

<p>
	يمكنك تثبيت Git-portal من <a href="https://gitlab.com/slackermedia/git-portal" rel="external nofollow">صفحة المشروع الخاصة به على جيت لاب</a>.
</p>

<p>
	كل أوامر هذه الأداة تعكس الأوامر المستخدمة في جيت، فمثلًا لاستخدام Git-portal في مشروع:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7645_10" style="">
<span class="pln">$ git</span><span class="pun">-</span><span class="pln">portal init</span></pre>

<p>
	لإضافة ملف وليكن مثلًا bigfile.png وهو صورة كبيرة الحجم، ننفذ الأمر التالي:
</p>

<pre class="ipsCode">
$ git-portal add bigfile.png
</pre>

<p>
	بمجرد إرسال الملف من خلال الأمر السابق، تكون باقي العمليات التي قد تحتاج إلى إجرائها هي ذاتها التي تستخدمها في جيت، وهنا تضيف ملفات كالمعتاد، إلا أنك تكون غافل نسبيًا عن حقيقة أن بعضها عبارة عن روابط لينة سريّة للمجلد ‎portal_‎.
</p>

<p>
	كل شيء موجود في المجلد ‎portal‎ (والذي يتجاهله جيت تمامًا) يمكن نسخه احتياطيًا إلى أي وحدة تخزين تريدها سواء كانت قرص صلب أو <a href="https://academy.hsoub.com/devops/servers/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%AE%D8%A7%D8%AF%D9%85-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-r574/" rel="">خادم</a> بعيد. بما أن Git-portal يوفر استخدام الخطافات (برامج يتم تشغيلها قبل أو بعد أحداث معينة، مثل الدفع أو السحب أو الإيداع) بالتالي يمكنك إن أحببت بناء إعداد خاص لمزامنة المجلد ‎portal‎ الخاص بك تلقائيًا مع موقع بعيد:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7645_13" style="">
<span class="pln">$ git remote add _portal alice@myserver</span><span class="pun">.</span><span class="pln">com</span><span class="pun">:</span><span class="str">/home/</span><span class="pln">alice</span><span class="pun">/</span><span class="pln">umbrella</span><span class="pun">.</span><span class="pln">git</span><span class="pun">/</span><span class="pln">_portal</span></pre>

<p>
	يتميز Git-portal بكونه نظامًا بسيطًا ومبتكرًا يعتمد على <a href="https://academy.hsoub.com/devops/linux/%D9%85%D8%A7-%D9%87%D9%88-%D9%86%D8%B8%D8%A7%D9%85-%D8%A7%D9%84%D8%AA%D8%B4%D8%BA%D9%8A%D9%84-%D9%84%D9%8A%D9%86%D9%83%D8%B3%D8%9F-r451/" rel="">نظام لينكس</a>، ويمكّنك من إدارة مشروعك ومشاركته مع الآخرين من خلال مجموعة صغيرة من الأدوات والأوامر، وقد تم استخدامه في العديد من المشاريع التي تتضمن الوسائط وألعاب الفيديو ومدونات الألعاب لإدارة كل شيء بدءًا من الصور البسيطة إلى ملفات PDF الكبيرة وحتى النماذج ثلاثية الأبعاد.
</p>

<h2>
	نموذج git-annex
</h2>

<p>
	يمتلك git-annex مسار عمل مختلف قليلًا، لكن الأفكار الأساسية هي نفسها، ويعتبر نظام مزامنة ملفات موزع يهدف إلى حل مشكلة إدارة ومشاركة ومزامنة الملفات الكبيرة دون الحاجة إلى خدمة تجارية أو حتى خادم مركزي، فهو يجعلك قادرًا على إدارة الملفات الكبيرة على جيت من دون تخزين محتوياتها في جيت. يجب أن تكون قادرًا على تثبيت git-annex من مستودع البرامج software repo، أو يمكنك الحصول عليه من موقعهم على الويب. كما هو الحال مع git-media، يجب على أي شخص يستخدم git-annex تثبيته على جهازه.
</p>

<p>
	الإعداد الأولي أبسط من git-media. لإنشاء مستودع مجرد bare repository على خادمك، نفّذ هذا الأمر مع استبدال المسار الظاهر بالمسار الخاص بك:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_7645_16" style="">
<span class="pln">$ git init </span><span class="pun">--</span><span class="pln">bare </span><span class="pun">--</span><span class="pln">shared </span><span class="pun">/</span><span class="pln">opt</span><span class="pun">/</span><span class="pln">jupiter</span><span class="pun">.</span><span class="pln">git</span></pre>

<p>
	ثم انسخه على حاسوبك المحلي، وميّزه كموقع git-annex خاص:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7645_18" style="">
<span class="pln">$ git clone seth@example</span><span class="pun">.</span><span class="pln">com</span><span class="pun">:</span><span class="str">/opt/</span><span class="pln">jupiter</span><span class="pun">.</span><span class="pln">clone
</span><span class="typ">Cloning</span><span class="pln"> into </span><span class="str">'jupiter.clone'</span><span class="pun">...</span><span class="pln"> warning</span><span class="pun">:</span><span class="pln"> </span><span class="typ">You</span><span class="pln"> appear to have cloned
an empty repository</span><span class="pun">.</span><span class="pln"> </span><span class="typ">Checking</span><span class="pln"> connectivity</span><span class="pun">...</span><span class="pln"> done</span><span class="pun">.</span><span class="pln">
$ git annex init </span><span class="str">"seth workstation"</span><span class="pln"> init seth workstation ok </span></pre>

<p>
	بدلًا من استخدام المرشحات filters لتحديد أماكن وجود ملفات الوسائط أو الملفات الكبيرة، يمكنك استخدام الأمر التالي لإضافة الملفات إلى git annex وهو تلقائيًّا يحديد فيما إذا كانت كبيرة أم لا:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_7645_20" style="">
<span class="pln">$ git annex add bigblobfile</span><span class="pun">.</span><span class="pln">flac
add bigblobfile</span><span class="pun">.</span><span class="pln">flac </span><span class="pun">(</span><span class="pln">checksum</span><span class="pun">)</span><span class="pln"> ok
</span><span class="pun">(</span><span class="typ">Recording</span><span class="pln"> state </span><span class="kwd">in</span><span class="pln"> </span><span class="typ">Git</span><span class="pun">...)</span></pre>

<p>
	الآن تنفيذ عملية الإيداع كالمعتاد بدون اختلاف يذكر:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7645_22" style="">
<span class="pln">$ git commit </span><span class="pun">-</span><span class="pln">m </span><span class="str">'added flac source for sound fx'</span></pre>

<p>
	لكن عملية الدفع مختلفة، لأن git-annex تستخدم فرعها الخاص لتتبع الملفات، لذلك عند تنفيذ عملية دفع لأول مرة ربما تحتاج لإضافة الخيار <code>u-</code>، وذلك اعتمادًا على كيفية إدارتك لمستودعك:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7645_24" style="">
<span class="pln">$ git push </span><span class="pun">-</span><span class="pln">u origin master git</span><span class="pun">-</span><span class="pln">annex
</span><span class="typ">To</span><span class="pln"> seth@example</span><span class="pun">.</span><span class="pln">com</span><span class="pun">:</span><span class="str">/opt/</span><span class="pln">jupiter</span><span class="pun">.</span><span class="pln">git
</span><span class="pun">*</span><span class="pln"> </span><span class="pun">[</span><span class="kwd">new</span><span class="pln"> branch</span><span class="pun">]</span><span class="pln"> master </span><span class="pun">-&gt;</span><span class="pln"> master
</span><span class="pun">*</span><span class="pln"> </span><span class="pun">[</span><span class="kwd">new</span><span class="pln"> branch</span><span class="pun">]</span><span class="pln"> git</span><span class="pun">-</span><span class="pln">annex </span><span class="pun">-&gt;</span><span class="pln"> git</span><span class="pun">-</span><span class="pln">annex </span></pre>

<p>
	كما هو الحال مع git-media، فإن عملية الدفع العادية لا تنسخ ملفاتك إلى الخادم وإنما ترسل فقط معلومات تتعلق بالوسائط. أخيرًا عندما تكون جاهزًا لمشاركة الملفات مع باقي أعضاء الفريق، نفّذ أمر المزامنة <code>sync</code>:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7645_27" style="">
<span class="pln">$ git annex sync </span><span class="pun">--</span><span class="pln">content</span></pre>

<p>
	إذا شارك شخص آخر الملفات مع الخادم واحتجت إلى سحبها، فإن الأمر <code>git annex sync</code> سيسحب الملفات غير الموجودة على جهازك والموجودة على الخادم.
</p>

<p>
	يعتبر Git Annex حلًا مضبوطًا بدقة لإدارة الملفات الكبيرة وهو مرن وسهل الاستخدام ومتيّن (قليل الأخطاء) وتم اختباره جيدًا.
</p>

<h2>
	نموذج git-lfs
</h2>

<p>
	كُتِب git-lfs بلغة Go، ويمكنك تثبيته من الشيفرة المصدر أو كملف ثنائي يتم تنزيله وتثبيته على جهازك، وكافة تعليمات التثبيت موجودة على الموقع، وهو برنامج متعدد المنصات cross-platform لذا لن تواجه مشاكل في عمله وتثبيته على مختلف أنواع الأنظمة.
</p>

<p>
	بعد تثبيته يمكنك تحديد أنواع الملفات التي تريد أن يتجاهلها جيت ويديرها Git-LFS، مثلًا لكي يتتبع Git-LFS جميع الملفات التي تحمل الامتداد png. نكتب:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_7645_29" style="">
<span class="pln">$ git lfs track </span><span class="str">"*.png"</span></pre>

<p>
	في كل مرة تضيف فيها نوع جديد من الملفات لكي يتتبعها Git-LFS، يجب عليك إضافة ثم إيداع الملف gitattributes. كما يلي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7645_31" style="">
<span class="pln">$ git add </span><span class="pun">.</span><span class="pln">gitattributes
$ git commit </span><span class="pun">-</span><span class="pln">m </span><span class="str">"LFS track *.png"</span></pre>

<p>
	عندما تغير حالة ملف من هذه الأنواع ليصبح ملف مرحلي (مُدرج)، يُنسَخ الملف إلى git/lfs..
</p>

<p>
	Git-LFS هو مشروع لشركة جيت هاب وهو مرتبط كثيرًا ببنيتها، وإذا كنت ترغب في تشغيل خادم جيت يسمح بدمج Git-LFS، فيمكنك الاطلاع على المثال الموجود في: <a href="https://github.com/git-lfs/lfs-test-server" rel="external nofollow">lfs-test-server</a> من github.
</p>

<p>
	يتميز git-portal و git-annex بالمرونة ويمكنهما استخدام المستودعات المحلية بدلًا من الخادم، وهذا مفيد لإدارة المشاريع المحلية الخاصة.
</p>

<h2>
	الملفات الكبيرة وجيت
</h2>

<p>
	بالرغم من أن جيت مخصص للعمل مع الملفات النصية، فهذا لا يعني أنه لا يمكنك استخدامه مع الأنواع الأخرى من الملفات، حيث توجد الكثير من الحلول لمساعدتك في إدارة كافة أنواع الملفات، لذا اذهب وجرب جيت بدءًا من اليوم!
</p>

<p>
	ترجمة -وبتصرف- للمقال <a href="https://opensource.com/life/16/8/how-manage-binary-blobs-git-part-7" rel="external nofollow">How to manage binary blobs with Git</a> لصاحبه Seth Kenlon.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
<li>
		المقال السابق: <a href="https://academy.hsoub.com/programming/workflow/git/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%A8%D9%86%D8%A7%D8%A1-%D8%AE%D8%A7%D8%AF%D9%85-%D8%AC%D9%8A%D8%AA-%D9%84%D9%80-git-r1605/" rel="">كيفية بناء خادم جيت لـ Git</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/workflow/git/%D8%A8%D8%AF%D8%A1-%D8%A7%D9%84%D8%B9%D9%85%D9%84-%D9%85%D8%B9-%D9%86%D8%B8%D8%A7%D9%85-%D8%A5%D8%AF%D8%A7%D8%B1%D8%A9-%D8%A7%D9%84%D8%A5%D8%B5%D8%AF%D8%A7%D8%B1%D8%A7%D8%AA-%D8%AC%D9%8A%D8%AA-git-r1593/" rel="">بدء العمل مع نظام إدارة الإصدارات جيت Git </a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/workflow/git/%D8%A5%D9%86%D8%B4%D8%A7%D8%A1-%D8%A3%D9%88%D9%84-%D9%85%D8%B3%D8%AA%D9%88%D8%AF%D8%B9-%D9%84%D9%83-%D9%85%D9%86-%D8%AE%D9%84%D8%A7%D9%84-%D8%AC%D9%8A%D8%AA-git-r1594/" rel="">إنشاء أول مستودع لك من خلال جيت Git </a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/workflow/git/%D8%A7%D9%84%D8%AF%D9%84%D9%8A%D9%84-%D8%A7%D9%84%D9%85%D8%B1%D8%AC%D8%B9%D9%8A-%D9%84%D9%84%D8%B9%D9%85%D9%84-%D8%B9%D9%84%D9%89-%D9%86%D8%B8%D8%A7%D9%85-%D8%BA%D9%8A%D8%AA-git-r1587/" rel="">الدليل المرجعي للعمل على نظام غيت Git </a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/javascript/%D8%A7%D9%84%D8%AA%D8%B9%D8%A7%D9%85%D9%84-%D9%85%D8%B9-%D9%83%D8%A7%D8%A6%D9%86-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-%D8%A7%D9%84%D8%AB%D9%86%D8%A7%D8%A6%D9%8A%D8%A9-blob-%D9%81%D9%8A-%D8%AC%D8%A7%D9%81%D8%A7%D8%B3%D9%83%D8%B1%D8%A8%D8%AA-r1285/" rel="">التعامل مع كائن البيانات الثنائية Blob في جافاسكربت</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">1606</guid><pubDate>Fri, 17 Jun 2022 10:03:55 +0000</pubDate></item><item><title>&#x643;&#x64A;&#x641;&#x64A;&#x629; &#x628;&#x646;&#x627;&#x621; &#x62E;&#x627;&#x62F;&#x645; &#x62C;&#x64A;&#x62A; &#x644;&#x640; Git</title><link>https://academy.hsoub.com/programming/workflow/git/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%A8%D9%86%D8%A7%D8%A1-%D8%AE%D8%A7%D8%AF%D9%85-%D8%AC%D9%8A%D8%AA-%D9%84%D9%80-git-r1605/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2022_06/62ac3ec20d5cc_---.jpg.6a0f4f95ef1e3c38d1bf0a59f1010d56.jpg" /></p>

<p>
	سنتعلم في هذا المقال كيفية إنشاء خادم <a href="https://academy.hsoub.com/programming/workflow/git/%D9%85%D8%A7-%D9%87%D9%88-git%D8%9F-r1592/" rel="">جيت Git</a>، وكيفية كتابة خطّافات جيت Git hooks مخصصة لتشغيل إجراءات معينة (مثل الإشعارات) قبل أو بعد أحداث محددة، إضافةً إلى نشر شيفراتك البرمجية على موقع ويب.
</p>

<p>
	لحد هذه اللحظة كان حديثنا في السلسلة عن جيت كمستخدمين، أما الآن ستتم مناقشة إدارة جيت وتصميم بنية تحتية مرنة لجيت. قد تعتقد أن الأمر متقدم أو يحتاج إلى خبرة متقدمة، ولكن في الواقع لا يتطلب معرفة متقدمة أو أي تدريب خاص يتجاوز الفهم المتوسط لكيفية عمل جيت، والقليل من المعرفة حول <a href="https://academy.hsoub.com/devops/linux/%D9%85%D8%A7-%D9%87%D9%88-%D9%86%D8%B8%D8%A7%D9%85-%D8%A7%D9%84%D8%AA%D8%B4%D8%BA%D9%8A%D9%84-%D9%84%D9%8A%D9%86%D9%83%D8%B3%D8%9F-r451/" rel="">لينكس</a>.
</p>

<h2>
	خادم جيت المشترك
</h2>

<p>
	إن إنشاء خادم جيت مشترك خاص بك يعد أمرًا بسيطًا للغاية، وفي كثير من الحالات يستحق العناء، فهو لا يضمن فقط إمكانية الوصول إلى شيفرتك البرمجية دائمًا، بل تفتح أيضًا الأبواب لتوسيع مدى وصول جيت بامتدادات مثل خطافات جيت الخاصة، وتخزين غير محدود للبيانات، والدمج والنشر المستمر.
</p>

<p>
	إذا كان لديك معرفة حول كيفية استخدام جيت والتعامل مع <a href="https://academy.hsoub.com/devops/security/ssh/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D9%88%D8%AE%D9%8A%D8%A7%D8%B1%D8%A7%D8%AA-%D8%A7%D9%84%D8%A7%D8%AA%D8%B5%D8%A7%D9%84-%D8%A8%D8%AE%D8%A7%D8%AF%D9%88%D9%85-%D8%B9%D9%86-%D8%A8%D8%B9%D8%AF-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-ssh-r74/" rel="">خدمة <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr></a>، فأنت تعرف من حيث لا تدري كيفية إنشاء خادم جيت. عندما تُنشئ مستودع أو عندما تنسخه من أحد المصادر، فإنك تكون قد أعددت عمليًّا نصف الخادم. بعد إعداد المستودع يجب تمكين الاتصال من خلال خدمة <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr> مع المستودع، وبعدها يمكن لأي شخص لديه حق الوصول أن يستخدم المستودع كأساس لنسخة جديدة.
</p>

<p>
	عمومًا، تمثل هذه الطريقة واحدة من الطرق المتبعة لإنشاء خادم جيت git server، حيث هناك طرق أخرى تمكنك من إنشاء خادم جيت مصمم جيدًا وتقريبًا بنفس القدر من الجهد ومع قابلية تطوير أفضل. بدايةً يجب عليك تحديد المستخدمين الحاليين والمستقبليين، أما إذا كنت المستخدم الوحيد فلا داعي لإجراء أي تغييرات، ولكن إذا كنت تنوي إشراك مساهمين، فلا بد من تحديدهم.
</p>

<p>
	بفرض كان لديك خادم متاح (ليست مشكلة إذا لم يكن لديك خادم، حيث أن جيت يمكنها أن تساعدك في حل هذه المشكلة، كما أنه بإمكانك استخدام <a href="https://www.google.com/url?q=https://academy.hsoub.com/programming/os-embedded-systems/%25D8%25AA%25D8%25B9%25D8%25B1%25D9%2581-%25D8%25B9%25D9%2584%25D9%2589-%25D8%25AC%25D9%2587%25D8%25A7%25D8%25B2-%25D8%25B1%25D8%25A7%25D8%25B3%25D8%25A8%25D9%258A%25D8%25B1%25D9%258A-%25D8%25A8%25D8%25A7%25D9%258A-raspberry-pi-r1356/&amp;sa=D&amp;source=docs&amp;ust=1646950024606999&amp;usg=AOvVaw3QiYzcktSkd2wFDnknJW1o" rel="external nofollow">حاسوب راسبيري باي</a> على نظام CentOS كمخدم في البداية)، فإن الخطوة الأولى هي تمكين عمليات تسجيل الدخول عبر خدمة <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr> باستخدام ترخيص <a href="https://academy.hsoub.com/devops/security/ssh/%D8%A7%D9%84%D8%B9%D9%85%D9%84-%D9%85%D8%B9-%D8%AE%D9%88%D8%A7%D8%AF%D9%8A%D9%85-ssh-%D8%A7%D9%84%D8%B9%D9%85%D9%84%D8%A7%D8%A1-%D9%88%D8%A7%D9%84%D9%85%D9%81%D8%A7%D8%AA%D9%8A%D8%AD-r55/" rel="">مفتاح <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr></a> فقط، ويعد هذا أقوى بكثير من عمليات تسجيل الدخول باستخدام كلمة المرور لأنه محصن ضد هجمات القوة الغاشمة brute-force (طرق الاختراق التي تعتمد على تجريب كافة الاحتمالات الممكنة) كما أنه يمكن تعطيل المستخدم ببساطة من خلال حذف مفتاحه.
</p>

<p>
	بمجرد تمكين المصادقة من خلال مفتاح <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr> أنشئ مستخدم جيت gituser، وهو عبارة عن مستخدم مشترك لجميع المستخدمين المُصرّح لهم:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9924_8" style="">
<span class="pln">$ su </span><span class="pun">-</span><span class="pln">c </span><span class="str">'adduser gituser'</span></pre>

<p>
	ثم قم بالتبديل إلى هذا المستخدم، وأنشئ إطار عمل <code>‎~/.<abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">ssh</abbr></code> مع الأذونات المناسبة، وهذا مهم من أجل حمايتك، فإن لم تضع الأذونات اللازمة ستفشل فكرة استخدام مفتاح <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr> للحماية.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9924_10" style="">
<span class="pln">$ su </span><span class="pun">-</span><span class="pln"> gituser
$ mkdir </span><span class="pun">.</span><span class="pln"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">ssh</abbr> </span><span class="pun">&amp;&amp;</span><span class="pln"> chmod </span><span class="lit">700</span><span class="pln"> </span><span class="pun">.</span><span class="pln"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">ssh</abbr>
$ touch </span><span class="pun">.</span><span class="pln"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">ssh</abbr></span><span class="pun">/</span><span class="pln">authorized_keys
$ chmod </span><span class="lit">600</span><span class="pln"> </span><span class="pun">.</span><span class="pln"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">ssh</abbr></span><span class="pun">/</span><span class="pln">authorized_keys</span></pre>

<p>
	يحتوي ملف authorized_keys على مفاتيح <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr> العامة لجميع المطورين الذين تمنحهم الإذن للعمل في مشروعك على جيت، وينبغي من كل مطوريك إنشاء أزواج من مفاتيح <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr> الخاصة بهم وإرسال مفاتيحهم العامة إليك، وأنت ينبغي عليك نسخ المفاتيح العامة في ملف authorized_keys الخاص بمستخدم جيت (انظر مقال <a href="https://academy.hsoub.com/devops/security/ssh/%D8%A7%D9%84%D8%B9%D9%85%D9%84-%D9%85%D8%B9-%D8%AE%D9%88%D8%A7%D8%AF%D9%8A%D9%85-ssh-%D8%A7%D9%84%D8%B9%D9%85%D9%84%D8%A7%D8%A1-%D9%88%D8%A7%D9%84%D9%85%D9%81%D8%A7%D8%AA%D9%8A%D8%AD-r55/" rel="">العمل مع خواديم <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr>: العملاء والمفاتيح</a>)، على سبيل المثال بالنسبة لمطور يسمى Bob، قم بتشغيل هذه الأوامر:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9924_12" style="">
<span class="pln">$ cat </span><span class="pun">~</span><span class="str">/path/</span><span class="pln">to</span><span class="pun">/</span><span class="pln">id_rsa</span><span class="pun">.</span><span class="pln">bob</span><span class="pun">.</span><span class="pln">pub </span><span class="pun">&gt;&gt;</span><span class="pln"> \
</span><span class="pun">/</span><span class="pln">home</span><span class="pun">/</span><span class="pln">gituser</span><span class="pun">/.</span><span class="pln"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">ssh</abbr></span><span class="pun">/</span><span class="pln">authorized_keys</span></pre>

<p>
	طالما أن المطور Bob مثلًا لديه المفتاح الخاص الذي يطابق المفتاح العام الذي أرسله إليك، يمكن للمطور Bob الوصول إلى الخادم باعتباره مستخدم جيت.
</p>

<p>
	عمومًا، قد لا ترغب في منح مطوريك حق الوصول إلى <a href="https://academy.hsoub.com/devops/servers/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%AE%D8%A7%D8%AF%D9%85-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-r574/" rel="">خادمك</a>، حتى لو كان الوصول كمستخدم جيت فقط، وتريد فقط منحهم حق الوصول إلى مستودع جيت، لهذا السبب يوفر جيت صدفة shell تسمى <code>git-shell</code>.
</p>

<p>
	نفّذ هذه الأوامر (كمستخدم جذر root) لإضافة <code>git-shell</code> إلى نظامك، ثم اجعلها الصدفة الافتراضية لمستخدم جيت:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9924_15" style="">
<span class="pun">#</span><span class="pln"> grep git</span><span class="pun">-</span><span class="pln">shell </span><span class="pun">/</span><span class="pln">etc</span><span class="pun">/</span><span class="pln">shells </span><span class="pun">||</span><span class="pln"> su </span><span class="pun">-</span><span class="pln">c \
</span><span class="str">"echo `which git-shell` &gt;&gt; /etc/shells"</span><span class="pln">
</span><span class="pun">#</span><span class="pln"> su </span><span class="pun">-</span><span class="pln">c </span><span class="str">'usermod -s git-shell gituser'</span></pre>

<p>
	الآن يمكن لمستخدم جيت استخدام مفتاح <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr> فقط لدفع وسحب مستودعات جيت، ولا يمكنه الوصول إلى قشرة تسجيل الدخول. ينبغي عليك أيضًا أن تُضف نفسك إلى المجموعة المقابلة لـمستخدم جيت، والتي في مثالنا يمثلها الخادم الذي يعتبر أيضًا مستخدم جيت.
</p>

<p>
	فمثلًا:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9924_17" style="">
<span class="pun">#</span><span class="pln"> usermod </span><span class="pun">-</span><span class="pln">a </span><span class="pun">-</span><span class="pln">G gituser seth</span></pre>

<p>
	الخطوة الوحيدة المتبقية هي إنشاء مستودع جيت، ونظرًا لأن لا أحد سيتفاعل معه مباشرة على الخادم (أي أنك لن تذهب إلى <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr> الخاص بالخادم وتعمل مباشرة في هذا المستودع)، اجعله مستودعًا خاليًا، وإذا كنت ترغب في استخدام المستودع على الخادم لإنجاز العمل، فانسخه من هناك واعمل عليه في المجلد الرئيسي الخاص بك.
</p>

<p>
	في الحقيقة، ليس عليك فعليًّا أن تجعل هذا المستودع فارغًا؛ بإمكانه العمل كمستودع عادي، لكن يجب أن تعلم أن المستودع المجرد bare repository لا يحتوي على شجرة عمل working tree، أي لا توجد فيه فروع للتنقل بينها من خلال أمر <code>checkout</code>، وهذا مهم (أن يكون مجردًا) لأنه لا يُسمح للمستخدمين البعيدين بالانتقال إلى فرع نشط (أي يتم العمل عليه حاليًّا)، فمن المؤكد أنك لن تكون سعيدًا في حال كنت تعمل على فرع ما وليكن "Dev" وفجأة يأتي شخص ويدفع تعديلاته ضمن عملك!
</p>

<p>
	يمكنك وضع هذا المستودع في أي مكان تريده، طالما أن المستخدمين والمجموعات الذين تريد منحهم إذنًا للوصول إليه يمكنهم فعل ذلك.
</p>

<p>
	إن لم ترد وضع المجلد في المجلد الرئيسي، مثلًا لأن الأذونات فيه حازمة ودقيقة للغاية، وتريد تخزينه في موقع آخر مثل ‎/opt أو /usr/local/share، فأنشئ مستودعًا مجردًا كمستخدم جذر:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9924_19" style="">
<span class="pun">#</span><span class="pln"> git init </span><span class="pun">--</span><span class="pln">bare </span><span class="pun">/</span><span class="pln">opt</span><span class="pun">/</span><span class="pln">jupiter</span><span class="pun">.</span><span class="pln">git
</span><span class="pun">#</span><span class="pln"> chown </span><span class="pun">-</span><span class="pln">R gituser</span><span class="pun">:</span><span class="pln">gituser </span><span class="pun">/</span><span class="pln">opt</span><span class="pun">/</span><span class="pln">jupiter</span><span class="pun">.</span><span class="pln">git
</span><span class="pun">#</span><span class="pln"> chmod </span><span class="pun">-</span><span class="pln">R </span><span class="lit">770</span><span class="pln"> </span><span class="pun">/</span><span class="pln">opt</span><span class="pun">/</span><span class="pln">jupiter</span><span class="pun">.</span><span class="pln">git</span></pre>

<p>
	الآن يمكن لأي مستخدم تمت مصادقته على أنه مستخدم جيت أو موجود في مجموعة مستخدم جيت أن ينفذ عمليات القراءة من مستودع jupiter.git والكتابة عليه.
</p>

<p>
	يمكنك تجريبه على جهازك كالتالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9924_23" style="">
<span class="pln">$ git clone gituser@example</span><span class="pun">.</span><span class="pln">com</span><span class="pun">:</span><span class="str">/opt/</span><span class="pln">jupiter</span><span class="pun">.</span><span class="pln">git jupiter</span><span class="pun">.</span><span class="pln">clone
</span><span class="typ">Cloning</span><span class="pln"> into </span><span class="str">'jupiter.clone'</span><span class="pun">...</span><span class="pln">
</span><span class="typ">Warning</span><span class="pun">:</span><span class="pln"> you appear to have cloned an empty repository</span><span class="pun">.</span></pre>

<p>
	تذكر أنه يجب على المطورين إدخال مفتاح <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr> العام الخاص بهم في ملف authorized_keys الخاص بمستخدم جيت، أو إذا كان لديهم حسابات على الخادم مثلك، فيجب أن يكونوا أعضاء في مجموعة مستخدم جيت.
</p>

<h2>
	خطافات جيت git hooks
</h2>

<p>
	إحدى الميزات الرائعة لاستخدام خادم جيت خاص بك هو أنه يتيح لك استخدام الخطافات، وهي برامج يتم تنفيذها قبل أو بعد أحداث محددة كالإيداع والسحب والدفع …إلخ. وبمزيد من الدقة هو ملف تنفيذي يتم وضعه في مجلد ‎.git/hooks واعتمادًا على مخطط تسمية قياسي يتم تنفيذه في الوقت المحدد، ويمكنك كتابة الشيفرة البرمجية التي ينفذها الخطاف بأي لغة تريدها، أي أنك غير مجبر على استخدام لغة محددة.
</p>

<p>
	أحيانًا توفر خدمات استضافة جيت واجهة تشبه الخطاف، لكنها لا تمنحك روابط جيت حقيقية ولا حتى إمكانية الوصول إلى نظام الملفات، وسنرى الآن مثالًا لاستخدام الخطافات، وهذا يتطلب منك إنشاء مستودع جيت إذا لم يكن لديك واحد بالفعل:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9924_25" style="">
<span class="pln">$ mkdir jupiter
$ cd jupiter
$ git init</span></pre>

<p>
	ثم أنشئ خطاف جيت يعرض الرسالة "hello world":
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9924_27" style="">
<span class="pln">$ echo </span><span class="str">"#\!/bin/tcsh"</span><span class="pln"> </span><span class="pun">&gt;</span><span class="pln"> </span><span class="pun">.</span><span class="pln">git</span><span class="pun">/</span><span class="pln">hooks</span><span class="pun">/</span><span class="pln">post</span><span class="pun">-</span><span class="pln">commit
$ echo </span><span class="str">"echo 'POST-COMMIT SCRIPT TRIGGERED'"</span><span class="pln"> </span><span class="pun">&gt;&gt;</span><span class="pln"> \
</span><span class="pun">~</span><span class="str">/jupiter/</span><span class="pun">.</span><span class="pln">git</span><span class="pun">/</span><span class="pln">hooks</span><span class="pun">/</span><span class="pln">post</span><span class="pun">-</span><span class="pln">commit
$ chmod </span><span class="pun">+</span><span class="pln">x </span><span class="pun">~</span><span class="str">/jupiter/</span><span class="pun">.</span><span class="pln">git</span><span class="pun">/</span><span class="pln">hooks</span><span class="pun">/</span><span class="pln">post</span><span class="pun">-</span><span class="pln">commit</span></pre>

<p>
	والآن اختبره:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9924_29" style="">
<span class="pln">$ echo </span><span class="str">"hello world"</span><span class="pln"> </span><span class="pun">&gt;</span><span class="pln"> foo</span><span class="pun">.</span><span class="pln">txt
$ git add foo</span><span class="pun">.</span><span class="pln">txt
$ git commit </span><span class="pun">-</span><span class="pln">m </span><span class="str">'first commit'</span><span class="pln">
</span><span class="pun">!</span><span class="pln"> POST</span><span class="pun">-</span><span class="pln">COMMIT SCRIPT TRIGGERED
</span><span class="pun">[</span><span class="pln">master </span><span class="pun">(</span><span class="pln">root</span><span class="pun">-</span><span class="pln">commit</span><span class="pun">)</span><span class="pln"> c8678e0</span><span class="pun">]</span><span class="pln"> first commit
</span><span class="lit">1</span><span class="pln"> file changed</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pln"> insertion</span><span class="pun">(+)</span><span class="pln">
create mode </span><span class="lit">100644</span><span class="pln"> foo</span><span class="pun">.</span><span class="pln">txt</span></pre>

<p>
	والآن أصبح لدينا خطاف جاهز ونشط.
</p>

<h2>
	خطاف الدفع إلى الويب
</h2>

<p>
	الاستخدام الشائع لخطافات جيت هو دفع التعديلات تلقائيًا إلى المجلد الموجود على خادم ويب إنتاجي، حيث أنها تعتبر طريقة رائعة للتخلي عن <a href="https://academy.hsoub.com/apps/web/wordpress/%D9%83%D9%8A%D9%81-%D8%AA%D8%B3%D8%AA%D8%AE%D8%AF%D9%85-ftp-%D9%84%D9%86%D9%82%D9%84-%D9%85%D9%84%D9%81%D8%A7%D8%AA-%D9%85%D8%AF%D9%88%D9%86%D8%A9-%D9%88%D9%88%D8%B1%D8%AF%D8%A8%D8%B1%D9%8A%D8%B3-%D8%A7%D9%84%D8%AE%D8%A7%D8%B5-%D8%A8%D9%83%D8%9F-r107/" rel="">بروتوكول نقل الملفات FTP</a>، والاحتفاظ بكامل التحكم في الإصدار لما هو قيد الإنتاج، ودمج ونشر المحتوى تلقائيًا. إذا تم إنجازه بطريقة صحيحة، فإنه سيعمل بروعة، وفعليًّا هكذا يجب أن تتم عمليات النشر على الويب.
</p>

<h2>
	متغيرات جيت
</h2>

<p>
	يتم تخصيص مجموعة مختلفة من المتغيرات المتعلقة بالإجراء الذي يتم تنفيذه لكل خطاف، وربما تحتاج أو لا تحتاج إلى استخدام هذه المتغيرات، حيث يعتمد ذلك على ما تكتبه، فإذا كان كل ما تريده هو رسالة بريد إلكتروني عامة تنبهك إلى أن شخصًا ما نفّذ عملية دفع، فأنت لست بحاجة إلى تفاصيل، وربما قد لا تحتاج حتى إلى كتابة البرنامج، أما إذا كنت تريد رؤية رسالة الإيداع ومؤلف الإيداع في هذا البريد الإلكتروني، فلا بد من البرنامج آنذاك.
</p>

<p>
	لا يتم تشغيل خطافات جيت من خلال المستخدم مباشرةً، لذا قد تكون معرفة كيفية جمع المعلومات المهمة أمرًا محيرًا. حقيقةً، يشبه خطاف جيت أي نص برمجي آخر، حيث يستلم المعطيات من مجرى الدخل القياسي stdin بنفس طريقة <a href="https://academy.hsoub.com/devops/linux/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%B5%D8%AF%D9%81%D8%A9-%D8%A8%D8%A7%D8%B4-bash-r606/" rel="">باش BASH</a> و<a href="https://academy.hsoub.com/programming/python/%D8%A7%D9%84%D9%85%D8%B1%D8%AC%D8%B9-%D8%A7%D9%84%D8%B4%D8%A7%D9%85%D9%84-%D8%A5%D9%84%D9%89-%D8%AA%D8%B9%D9%84%D9%85-%D9%84%D8%BA%D8%A9-%D8%A8%D8%A7%D9%8A%D8%AB%D9%88%D9%86-r735/" rel="">بايثون Python</a> و<a href="https://academy.hsoub.com/programming/cpp/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-c-r802/" rel="">سي بلس بلس C++‎</a> وأي لغة أخرى. الفرق هو أننا لا نقدم هذه المدخلات بأنفسنا، لذا لاستخدامها عليك أن تعرف ما يمكن توقعه.
</p>

<p>
	قبل إنشاء خطاف جيت، انظر إلى العينات التي يوفرها جيت في مجلد ‎.git/hooks‎ الخاص بمشروعك مثل ملف pre-push.sample، وانظر إلى ما ينصّه في قسم التعليقات:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9924_33" style="">
<span class="pun">#</span><span class="pln"> $1 </span><span class="pun">--</span><span class="pln"> </span><span class="pun">اسم</span><span class="pln"> </span><span class="pun">المستودع</span><span class="pln"> </span><span class="pun">البعيد</span><span class="pln"> </span><span class="pun">الذي</span><span class="pln"> </span><span class="pun">يتم</span><span class="pln"> </span><span class="pun">إجراء</span><span class="pln"> </span><span class="pun">عملية</span><span class="pln"> </span><span class="pun">دفع</span><span class="pln"> </span><span class="pun">إليه</span><span class="pln">
</span><span class="pun">#</span><span class="pln"> $2 </span><span class="pun">–</span><span class="pln"> </span><span class="pun">للمستودع</span><span class="pln"> </span><span class="pun">البعيد</span><span class="pln"> URL </span><span class="pun">عنوان</span><span class="pln"> 
</span><span class="pun">#</span><span class="pln"> </span><span class="pun">إذا</span><span class="pln"> </span><span class="pun">تمت</span><span class="pln"> </span><span class="pun">عملية</span><span class="pln"> </span><span class="pun">الدفع</span><span class="pln"> </span><span class="pun">من</span><span class="pln"> </span><span class="pun">دون</span><span class="pln"> </span><span class="pun">استخدام</span><span class="pln"> </span><span class="pun">اسم</span><span class="pln"> </span><span class="pun">المستودع</span><span class="pln"> </span><span class="pun">البعيد،</span><span class="pln"> </span><span class="pun">فإن</span><span class="pln"> </span><span class="pun">هذه</span><span class="pln"> </span><span class="pun">المعطيات</span><span class="pln"> </span><span class="pun">ستكون</span><span class="pln"> </span><span class="pun">متساوية</span><span class="pln">
</span><span class="pun">#</span><span class="pln"> </span><span class="pun">يتم</span><span class="pln"> </span><span class="pun">توفير</span><span class="pln"> </span><span class="pun">معلومات</span><span class="pln"> </span><span class="pun">تتعلق</span><span class="pln"> </span><span class="pun">بالإيداع</span><span class="pln"> </span><span class="pun">كما</span><span class="pln"> </span><span class="pun">يلي</span><span class="pln">
</span><span class="pun">#</span><span class="pln"> </span><span class="pun">&lt;</span><span class="pln">local ref</span><span class="pun">&gt;</span><span class="pln"> </span><span class="pun">&lt;</span><span class="pln">local sha1</span><span class="pun">&gt;</span><span class="pln"> </span><span class="pun">&lt;</span><span class="pln">remote ref</span><span class="pun">&gt;</span><span class="pln"> </span><span class="pun">&lt;</span><span class="pln">remote sha1</span><span class="pun">&gt;</span></pre>

<p>
	في الحقيقة ليست كل العينات واضحة إلى هذه الدرجة كما في العينة السابقة، ولا يزال توثيق مجموعة المتغيرات التي يتم تمريرها كمعطيات إلى الخطافات قليلًا (بإمكانك قراءة الشيفرة المصدرية لجيت لمعرفتها، لكن لا أعتقد أنك سترغب في ذلك).
</p>

<h2>
	مثال عن الخطافات التي تنجز مهام محددة بناءً على الفرع المُتأثر
</h2>

<p>
	يُعتبر الخطاف الذي يُنفذ إجراءات معينة ضمن فرع محدد، أحد المتطلبات الشائعة في بعض الأنظمة البرمجية، وفيما يلي مثال على كيفية التعامل مع مثل هذه المهمة.
</p>

<p>
	قبل كل شيء يجب أن تعلم أن جيت لا تتبع الخطافات الخاصة بها لأن الخطاف يعد جزءًا من جيت وليس جزءًا من مستودعك، ولهذا السبب خطافات جيت التي تشرف على عمليات الإيداع والدفع ربما يكون من المنطقي أكثر بقاءها في المستودع المجرد على الخادم، بدلاً من أن تكون جزءًا من مستودعاتك المحلية.
</p>

<p>
	سنكتب الآن خطافًا يتم تنفيذه بعد استلام الإيداع، الخطوة الأولى هي تحديد اسم الفرع:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9924_35" style="">
<span class="pun">#!</span><span class="str">/bin/</span><span class="pln">tcsh

foreach arg </span><span class="pun">(</span><span class="pln"> $</span><span class="pun">&lt;</span><span class="pln"> </span><span class="pun">)</span><span class="pln">
  </span><span class="kwd">set</span><span class="pln"> argv </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="pln"> $arg </span><span class="pun">)</span><span class="pln">
  </span><span class="kwd">set</span><span class="pln"> refname </span><span class="pun">=</span><span class="pln"> $1
end</span></pre>

<p>
	تقرأ حلقة for-loop هذه المُعطى الأول $1، ثم تعيد التكرار من أجل استبداله بالمُعطى الثاني ‎$2، ثم مرة أخرى من أجل المعطى الثالث ‎$3. هناك طريقة أفضل للقيام بذلك في باش Bash، عن طريق استخدام الأمر <code>read</code> ووضع القيم في مصفوفة.
</p>

<p>
	عندما يكون لدينا اسم المرجع <code>refname</code> للشيء الذي يتم إيداعه، يمكننا استخدام جيت لاكتشاف اسم الفرع المقروء:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9924_37" style="">
<span class="kwd">set</span><span class="pln"> branch </span><span class="pun">=</span><span class="pln"> </span><span class="pun">`</span><span class="pln">git rev</span><span class="pun">-</span><span class="pln">parse </span><span class="pun">--</span><span class="pln">symbolic </span><span class="pun">--</span><span class="pln">abbrev</span><span class="pun">-</span><span class="pln">ref $refname</span><span class="pun">`</span><span class="pln">
echo $branch </span><span class="pun">#</span><span class="pln">DEBUG</span></pre>

<p>
	بعد ذلك وازن اسم الفرع بالكلمات المفتاحية التي نريد أن نبني الإجراء عليها:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9924_40" style="">
<span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln"> </span><span class="str">"$branch"</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="str">"master"</span><span class="pln"> </span><span class="pun">)</span><span class="pln"> then
  echo </span><span class="str">"Branch detected: master"</span><span class="pln">
  git \
    </span><span class="pun">--</span><span class="pln">work</span><span class="pun">-</span><span class="pln">tree</span><span class="pun">=</span><span class="str">/path/</span><span class="pln">to</span><span class="pun">/</span><span class="pln">where</span><span class="pun">/</span><span class="pln">you</span><span class="pun">/</span><span class="pln">want</span><span class="pun">/</span><span class="pln">to</span><span class="pun">/</span><span class="pln">copy</span><span class="pun">/</span><span class="pln">stuff</span><span class="pun">/</span><span class="pln">to \
    checkout </span><span class="pun">-</span><span class="pln">f $branch </span><span class="pun">||</span><span class="pln"> echo </span><span class="str">"master fail"</span><span class="pln">
</span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln"> </span><span class="str">"$branch"</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="str">"dev"</span><span class="pln"> </span><span class="pun">)</span><span class="pln"> then
  echo </span><span class="str">"Branch detected: dev"</span><span class="pln">
  </span><span class="typ">Git</span><span class="pln"> \
    </span><span class="pun">--</span><span class="pln">work</span><span class="pun">-</span><span class="pln">tree</span><span class="pun">=</span><span class="str">/path/</span><span class="pln">to</span><span class="pun">/</span><span class="pln">where</span><span class="pun">/</span><span class="pln">you</span><span class="pun">/</span><span class="pln">want</span><span class="pun">/</span><span class="pln">to</span><span class="pun">/</span><span class="pln">copy</span><span class="pun">/</span><span class="pln">stuff</span><span class="pun">/</span><span class="pln">to \
    checkout </span><span class="pun">-</span><span class="pln">f $branch </span><span class="pun">||</span><span class="pln"> echo </span><span class="str">"dev fail"</span><span class="pln">
  </span><span class="kwd">else</span><span class="pln">
    echo </span><span class="str">"Your push was successful."</span><span class="pln">
    echo </span><span class="str">"Private branch detected. No action triggered."</span><span class="pln">
endif</span></pre>

<p>
	الآن نحوّل الشيفرة البرمجية إلى ملف تنفيذي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9924_42" style="">
<span class="pln">$ chmod </span><span class="pun">+</span><span class="pln">x </span><span class="pun">~</span><span class="str">/jupiter/</span><span class="pun">.</span><span class="pln">git</span><span class="pun">/</span><span class="pln">hooks</span><span class="pun">/</span><span class="pln">post</span><span class="pun">-</span><span class="pln">receive</span></pre>

<p>
	الآن عندما ينفذ المستخدم إيداعًا ضمن الفرع الرئيسي للخادم، يتم نسخ الشيفرة البرمجية إلى مجلد العمل، والإيداع ضمن الفرع dev يتم نسخه في مكان آخر، ولا يحدث أي إجراء في الفروع الأخرى.
</p>

<p>
	من السهل جدًا إنشاء برنامج للإيداع المسبق، مثلًا يتحقق فيما إذا كان شخص ما يحاول الدفع إلى فرع لا ينبغي أن يتم الدفع إليه، أو لتحليل رسائل الإيداع وما إلى ذلك.
</p>

<p>
	يمكن أن تكون خطافات جيت معقدة، ويمكن أن تكون مربكة بسبب مستوى التجريد الذي يفرضه العمل من خلال جيت، لكنها نظام قوي يسمح لك بتصميم جميع أنواع الإجراءات في البنية التحتية لجيت، لذلك فهي تستحق أن تتقنها.
</p>

<p>
	سوف نتعلم في المقال التالي والأخير من هذه السلسلة كيفية استخدام جيت لإدارة الكائنات الثنائية غير النصية، مثل ملفات الصوت والرسومات.
</p>

<p>
	ترجمة -وبتصرف- للمقال <a href="https://opensource.com/life/16/8/how-construct-your-own-git-server-part-6" rel="external nofollow">How to build your own Git server</a> لصاحبه Seth Kenlon.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
<li>
		المقال التالي: <a href="https://academy.hsoub.com/programming/workflow/git/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%A5%D8%AF%D8%A7%D8%B1%D8%A9-%D8%A7%D9%84%D9%83%D8%A7%D8%A6%D9%86%D8%A7%D8%AA-%D8%A7%D9%84%D8%AB%D9%86%D8%A7%D8%A6%D9%8A%D8%A9-binary-blobs-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%AC%D9%8A%D8%AA-git-r1606/" rel="">كيفية إدارة الكائنات الثنائية Binary Blobs باستخدام جيت Git</a>
	</li>
	<li>
		المقال السابق: <a href="https://academy.hsoub.com/programming/workflow/git/%D8%A3%D8%AF%D9%88%D8%A7%D8%AA-%D8%B1%D8%B3%D9%88%D9%85%D9%8A%D8%A9-%D9%84%D9%84%D8%A3%D8%AF%D8%A7%D8%A9-%D8%B3%D8%B7%D8%B1-%D8%A7%D9%84%D8%A3%D9%88%D8%A7%D9%85%D8%B1-%D8%AC%D9%8A%D8%AA-git-r1604/" rel="">أدوات رسومية للأداة سطر الأوامر جيت git</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/workflow/git/%D8%A8%D8%AF%D8%A1-%D8%A7%D9%84%D8%B9%D9%85%D9%84-%D9%85%D8%B9-%D9%86%D8%B8%D8%A7%D9%85-%D8%A5%D8%AF%D8%A7%D8%B1%D8%A9-%D8%A7%D9%84%D8%A5%D8%B5%D8%AF%D8%A7%D8%B1%D8%A7%D8%AA-%D8%AC%D9%8A%D8%AA-git-r1593/" rel="">بدء العمل مع نظام إدارة الإصدارات جيت Git </a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/workflow/git/%D8%A5%D9%86%D8%B4%D8%A7%D8%A1-%D8%A3%D9%88%D9%84-%D9%85%D8%B3%D8%AA%D9%88%D8%AF%D8%B9-%D9%84%D9%83-%D9%85%D9%86-%D8%AE%D9%84%D8%A7%D9%84-%D8%AC%D9%8A%D8%AA-git-r1594/" rel="">إنشاء أول مستودع لك من خلال جيت Git </a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/workflow/git/%D8%A7%D9%84%D8%AF%D9%84%D9%8A%D9%84-%D8%A7%D9%84%D9%85%D8%B1%D8%AC%D8%B9%D9%8A-%D9%84%D9%84%D8%B9%D9%85%D9%84-%D8%B9%D9%84%D9%89-%D9%86%D8%B8%D8%A7%D9%85-%D8%BA%D9%8A%D8%AA-git-r1587/" rel="">الدليل المرجعي للعمل على نظام غيت Git </a>
	</li>
</ul>
]]></description><guid isPermaLink="false">1605</guid><pubDate>Fri, 17 Jun 2022 10:04:59 +0000</pubDate></item><item><title>&#x623;&#x62F;&#x648;&#x627;&#x62A; &#x631;&#x633;&#x648;&#x645;&#x64A;&#x629; &#x644;&#x644;&#x623;&#x62F;&#x627;&#x629; &#x633;&#x637;&#x631; &#x627;&#x644;&#x623;&#x648;&#x627;&#x645;&#x631; &#x62C;&#x64A;&#x62A; Git</title><link>https://academy.hsoub.com/programming/workflow/git/%D8%A3%D8%AF%D9%88%D8%A7%D8%AA-%D8%B1%D8%B3%D9%88%D9%85%D9%8A%D8%A9-%D9%84%D9%84%D8%A3%D8%AF%D8%A7%D8%A9-%D8%B3%D8%B7%D8%B1-%D8%A7%D9%84%D8%A3%D9%88%D8%A7%D9%85%D8%B1-%D8%AC%D9%8A%D8%AA-git-r1604/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2022_06/62ac37b14ffdf_----.jpg.953cb7f45c5ce05c5223811f0e65a885.jpg" /></p>

<p>
	هناك العديد من التطبيقات ذات الواجهة الرسومية التي تقدم واجهات رسومية سهلة ومريحة للتعامل مع أداة <a href="https://academy.hsoub.com/programming/workflow/git/%d8%a5%d8%b9%d8%af%d8%a7%d8%af-git-%d9%84%d9%84%d9%85%d8%b1%d8%a9-%d8%a7%d9%84%d8%a3%d9%88%d9%84%d9%89-r260/" rel="">جيت Git</a> التي تعمل في <a href="https://academy.hsoub.com/devops/servers/%D9%85%D8%A7-%D9%87%D9%88-%D8%B3%D8%B7%D8%B1-%D8%A7%D9%84%D8%A3%D9%88%D8%A7%D9%85%D8%B1-%D8%9F-r353/" rel="">سطر الأوامر</a>، وهذه التطبيقات ستكون موضوع مقالتنا.
</p>

<h2>
	استخدام جيت في كيدي دولفين KDE Dolphin
</h2>

<p>
	دولفين Dolphin هو مدير ملفات وجزء من مجموعة برامج كيدي KDE، وهو مدير الملفات الافتراضي للإصدار الحالي من مجموعة برامج كيدي 4، ويمكن تثبيته اختياريًا على بيئة سطح المكتب، ويحتوي على الكثير من الخيارات والميزات، وهو قابل للتوسيع إلى حد كبير ويسمح لك بتثبيت مكونات إضافية توفر المزيد من الميزات الرائعة، وأهمها إدارة مستودع جيت مباشرة من خلال واجهة دولفين الرسومية.
</p>

<p>
	بدايةً ستحتاج إلى التأكد من تثبيت الإضافات، فبعض التوزيعات من دولفين تأتي مع عدد كبير جدًا من الإضافات، بينما يأتي بعضها الآخر مع الإضافات الأساسية فقط. لذلك إذا كنت لا ترى خيارات جيت في الخطوات القليلة التالية التي سنُجريها، فابحث في مستودعك عن شيء مثل dolphin-extras أو dolphin-plugins.
</p>

<p>
	لتفعيل إضافة جيت، انتقل إلى قائمة الإعدادات Settings في أي نافذة لدولفين واختر ضبط دولفين Configure Dolphin، ثم انقر فوق أيقونة الخدمات Services في العمود الأيسر، ثم ابحث ضمن قائمة المكونات الإضافية المتاحة حتى تجد جيت.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="101438" href="https://academy.hsoub.com/uploads/monthly_2022_06/4_dolphinconfig.jpg.5b617d212e583958d5de27ab8c897daa.jpg" rel=""><img alt="4_dolphinconfig.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="101438" data-unique="r825s0kth" src="https://academy.hsoub.com/uploads/monthly_2022_06/4_dolphinconfig.jpg.5b617d212e583958d5de27ab8c897daa.jpg" style="width: 450px; height: auto;"></a>
</p>

<p>
	احفظ التغييرات وأغلق نافذة دولفين وعندما تعيد تشغيل دولفين، انتقل إلى مستودع جيت وستلاحظ أن جميع الأيقونات تحتوي الآن على شعارات: المربعات الخضراء للملفات المخصصة، والمربعات الخضراء السميكة للملفات المعدلة، ولا يوجد أيقونات للملفات غير المتتبعة، وهكذا.
</p>

<p>
	الآن عند النقر بزر الفأرة الأيمن داخل مستودع جيت ستجد العديد من الخيارات، مثل تنفيذ عمليات checkout أو push أو pull، وحتى تنفيذ عمليات git add و git remove على ملفاتك.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="101439" href="https://academy.hsoub.com/uploads/monthly_2022_06/4_dolphingit.jpg.bb62b30752715dc0e668a5fa207bd9b1.jpg" rel=""><img alt="4_dolphingit.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="101439" data-unique="2jeqxjpia" src="https://academy.hsoub.com/uploads/monthly_2022_06/4_dolphingit.jpg.bb62b30752715dc0e668a5fa207bd9b1.jpg" style="width: 400px; height: auto;"></a>
</p>

<p>
	لا يمكنك نسخ مستودع أو تغيير المسارات للمستودعات البعيدة في دولفين، حيث يتعين عليك الذهاب إلى الطرفية من خلال النقر على F4 لإتمام هكذا أمر. إن هذه الميزة من كيدي رائعة للغاية، ولا يمكن أن ينتهي الحديث عنها عند هذا الحد. إن دمج جيت مع مدير الملفات لديك، يجعل العمل مع جيت سهلًا بتنفيذ الأوامر لك في الخلفية مما يجعلها وكأنها غير مرئية ويخفي تعقيدها لك، فكل ما تحتاجه يمكنك تنفيذه ببساطة بغض النظر عن المرحلة التي أنت عندها الآن.
</p>

<h2>
	سباركل شير SparkleShare
</h2>

<p>
	سباركل شير SparkleShare هو عبارة عن تطبيق سحابي <a href="https://academy.hsoub.com/programming/general/%D9%85%D8%A7-%D8%A7%D9%84%D9%85%D9%82%D8%B5%D9%88%D8%AF-%D8%A8%D9%85%D8%B5%D8%B7%D9%84%D8%AD-%D9%85%D9%81%D8%AA%D9%88%D8%AD-%D8%A7%D9%84%D9%85%D8%B5%D8%AF%D8%B1-open-source%D8%9F-r885/" rel="">مفتوح المصدر</a> للتخزين السحابي ومزامنة الملفات، ويستخدم افتراضيًا جيت كخلفية للتخزين. يُمكن تشبيهه بتطبيق Dropbox، ويمكن استخدامه على جميع الأنظمة المعروفة تقريبًا.
</p>

<p>
	إذا كنت تعمل على نظام لينكس، فيمكنك تثبيته من مستودع البرامج software repository الخاص بك، أما في حال كنت تعمل على نظام تشغيل آخر فيمكنك تنزيله من موقع سباركل شير، وتجدر الملاحظة إلى أنه بإمكانك تجاهل التعليمات الموجودة على موقع سباركل شير بأمان، والتي تتعلق بإعداد الخادم، وهذا ليس ما سنفعله هنا. عمومًا، يمكنك إعداد خادم سباركل شير إذا كنت تريد ذلك، ولكن سبارك لشير متوافق مع أي مستودع جيت، لذلك لا تحتاج إلى إنشاء خادم خاص بك.
</p>

<p>
	بعد تثبيته اذهب وشغل سبارك لشير، ثم انتقل إلى معالج الإعداد setup wizard، حيث ستحتاج إلى إكمال خطوتين بالإضافة إلى برنامج تعليمي مُختصر، وستتمكن أيضًا من إضافة اختصار على سطح المكتب في حال رغبت بذلك.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="101442" href="https://academy.hsoub.com/uploads/monthly_2022_06/4_sparklesetup.jpg.d0afeba0d981944aa6fc3788b0847791.jpg" rel=""><img alt="4_sparklesetup.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="101442" data-unique="7b8xxkt8f" src="https://academy.hsoub.com/uploads/monthly_2022_06/4_sparklesetup.jpg.d0afeba0d981944aa6fc3788b0847791.jpg" style="width: 450px; height: auto;"></a>
</p>

<p>
	الآن ستلاحظ وجود أيقونة برتقالية اللون تمثل مجلد سباركل شير في شريط المهام على جهازك، وفي البداية يكون سباركل شير غافل عن أي شيء موجود على حاسوبك، لذلك تحتاج إلى إضافة مشروع مُستضاف Hosted project.
</p>

<p>
	لإضافة مجلد إلى سباركل شير لكي يتتبعه، انقر فوق أيقونة سباركل شير من شريط المهام وحدد Add Hosted Project.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="101441" href="https://academy.hsoub.com/uploads/monthly_2022_06/4_sparklehost.jpg.df99ad160dff4d015b367bf27d675500.jpg" rel=""><img alt="4_sparklehost.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="101441" data-unique="8pa4uc8yn" src="https://academy.hsoub.com/uploads/monthly_2022_06/4_sparklehost.jpg.df99ad160dff4d015b367bf27d675500.jpg" style="width: 450px; height: auto;"></a>
</p>

<p>
	بإمكان سباركل شير العمل مع مشاريع جيت ذاتية الاستضافة، أو المشاريع المستضافة على خدمات جيت العامة مثل جيت هاب GitHub و<a href="https://academy.hsoub.com/apps/productivity/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%AA%D8%B7%D8%A8%D9%8A%D9%82-bitbucket-r456/" rel="">بيت بوكيت BitBucket</a>، ولتتمكن من الوصول الكامل لمشروعك، غالبًا ستحتاج إلى استخدام مُعرّف العميل Client ID الذي تمنحك إيّاه سباركل شير، وهو <a href="https://academy.hsoub.com/devops/security/ssh/%D8%A7%D9%84%D8%B9%D9%85%D9%84-%D9%85%D8%B9-%D8%AE%D9%88%D8%A7%D8%AF%D9%8A%D9%85-ssh-%D8%A7%D9%84%D8%B9%D9%85%D9%84%D8%A7%D8%A1-%D9%88%D8%A7%D9%84%D9%85%D9%81%D8%A7%D8%AA%D9%8A%D8%AD-r55/" rel="">مفتاح <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr></a> يعمل كمفتاح مصادقة مع الخدمة التي تستخدمها لاستضافة مشروعك، وهذا يشمل أيضًا خادم جيت الخاص بك والذي يجب أن يستخدم أيضًا المفتاح <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr> بدلًا من تسجيل الدخول باستخدام كلمة المرور. إذًا انسخ معرّف العميل ضمن ملف authorized_hosts المخصص لك كمستخدم لجيت على الخادم، أو في لوحة مفاتيح <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr> لمضيف جيت الذي تستخدمه.
</p>

<p>
	بعد إعداد المضيف الذي تريد استخدامه، يُحمّل سباركل شير مشروع جيت، كما يوفر لك إمكانية تنزيل سجل الإيداعات حسب اختيارك، ويمكنك رؤية الملفات في "SparkleShare/~".
</p>

<p>
	على عكس جيت المدمج في دولفين، فإن سباركل شير لا يزعجك بالإشعارات والتعقيدات إلى حد كبير جدًا، فعندما تُجري بعض التغييرات تتم مزامنة التغيير مع المستودع البعيد تلقائيًا في الخلفية أو عندما يُجري أحد شُركائك تغييرًا على المستودع سيجلبه ويحدث ملفاتك.
</p>

<p>
	بالنسبة للعديد من الأشخاص يكون ذلك مفيدًا، لكن البعض قد لا يحبذ ذلك لأنهم يرغبون بالتحكم بكل العمليات التي تحدث.
</p>

<h2>
	جيت-كولا Git-Cola
</h2>

<p>
	جيت-كولا Git-Cola هي واجهة رسومية أنيقة أخرى للعمل مع مستودعات جيت، وبدلًا من استخدام التطبيقات المدمجة للتفاعل مع مشروعك على جيت، يمكنك استخدام تطبيق مكتبي لمراقبة التغييرات التي تحدث على مشروعك والتعامل معها بالطريقة التي تختارها.
</p>

<p>
	من ميزات هذا التطبيق هي التركيز، فربما أنت لا تهتم بكل ملفات مشروعك البالغ عددها 125، حيث أنك تهتم فقط بعدد محدد منها ولنقل 3 ملفات فقط، لذلك يكون من الجيد وضع الملفات الأكثر أهمية في المقدمة.
</p>

<p>
	إذا كنت تعتقد أن هناك الكثير من خدمات الاستضافة لجيت على الويب، فأنت لم تر أي شيء بعد، فتطبيقات جيت المكتبية أكثر بكثير. في الحقيقة، جيت نفسه يحتوي ضمنيًا على واجهة رسومية.
</p>

<p>
	إن أكثر البرامج متعددة المنصات Cross-platform وأكثرها قابلية للتكوين هو تطبيق جيت-كولا مفتوح المصدر الذي كُتِب <a href="https://wiki.hsoub.com/Python" rel="external">بلغة Python</a> و Qt.
</p>

<p>
	إذا كنت تستخدم <a href="https://academy.hsoub.com/devops/linux/%D9%85%D8%A7-%D9%87%D9%88-%D9%86%D8%B8%D8%A7%D9%85-%D8%A7%D9%84%D8%AA%D8%B4%D8%BA%D9%8A%D9%84-%D9%84%D9%8A%D9%86%D9%83%D8%B3%D8%9F-r451/" rel="">نظام لينوكس</a>، فقد يكون جيت-كولا في مستودع البرامج لديك، وإلا نزِّله من الموقع وثبته على نظامك:
</p>

<pre class="ipsCode">
$ python setup.py install 
</pre>

<p>
	عندما يتم تشغيل جيت-كولا، يكون لديك ثلاثة أزرار: الأول لفتح مستودع موجود والثاني لإنشاء مستودع جديد والثالث لنسخ مستودع موجود، وبغض النظر عن الزر الذي ستختاره، سيكون لدينا في النهاية مستودع جيت.
</p>

<p>
	جيت-كولا ومعظم التطبيقات المكتبية الأخرى، لا تحاول أن تجعل كل العمليات تتم من خلال الواجهة، وإنما يتركون ذلك لأدوات <a href="https://academy.hsoub.com/files/24-%D8%A3%D9%86%D8%B8%D9%85%D8%A9-%D8%A7%D9%84%D8%AA%D8%B4%D8%BA%D9%8A%D9%84-%D9%84%D9%84%D9%85%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D9%86/" rel="">نظام التشغيل</a> مثل ثونار Thunar وإيماكس Emacs وغيرهما، أي بمعنى آخر قد أبدأ بإنشاء مستودع من خلال جيت-كولا، لكن بعد ذلك سأفتح هذا المستودع من خلال ثونار أو إيماكس لبدء العمل مع الإبقاء على جيت-كولا مفتوحًا كشاشة مراقبة، لأن إنشاء ملفات جديدة أو تغيير الملفات الموجودة، ستظهر في لوحة الحالة لجيت-كولا.
</p>

<p>
	التصميم الافتراضي لجيت-كولا غير ثابت إلى حد ما، أي أنه بإمكانك تغيير تصميم الواجهة الرسومية كما تحب، فمثلًا في الصورة التالية تم تغيير عدة أمور في تصميم الواجهة، حيث تم جعل اللوحة الموجودة في أقصى اليسار هي الحالة Status مع إظهار أي تغييرات يتم إجراؤها على الفرع الحالي ضمنها أيضًا، وفي اليمين لوحة Diff لمراجعة تغيير، ولوحة الإجراءات Actions لأزرار الوصول السريع إلى المهام الشائعة، وأخيرًا اللوحة الموجودة في أقصى اليمين هي لوحة Commit لكتابة رسائل الإيداع.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="101440" href="https://academy.hsoub.com/uploads/monthly_2022_06/4_gitcola.jpg.638e9fb8dceecd9d10eefee563a9f835.jpg" rel=""><img alt="4_gitcola.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="101440" data-unique="mvxzo5u6k" src="https://academy.hsoub.com/uploads/monthly_2022_06/4_gitcola.jpg.638e9fb8dceecd9d10eefee563a9f835.jpg" style="width: 450px; height: auto;"></a>
</p>

<p>
	عمومًا، أيًّا كان تصميمك، فما يلي هو شرح للمكونات التي تظهر في واجهة جيت-كولا:
</p>

<p>
	تظهر التغييرات في لوحة الحالة Status panel. انقر بزر الفأرة الأيمن فوق إدخال تغيير، أو حدد ملفًا وانقر فوق الزر Stage في لوحة الإجراءات Action، لجعل الملف ملفًا مرحليًّا (ملف مُدرج).
</p>

<p>
	تتغير أيقونة الملف المرحلي إلى مثلث أخضر للإشارة إلى أنه تم تعديله وإدراجه، ويمكنك لاحقًا إلغاء إدراجه عن طريق النقر بزر الفأرة الأيمن واختيار Unstage، أو بالنقر فوق الزر Unstage في لوحة الإجراءات.
</p>

<p>
	في أي وقت يمكنك مراجعة التغييرات من لوحة Diff، وعندما تكون جاهزًا للإيداع أدخل رسالة الإيداع وانقر فوق الزر "Commit".
</p>

<p>
	توجد أزرار أخرى في لوحة الإجراءات للمهام الشائعة الأخرى مثل <code>git pull</code> أو <code>git push</code>، وغيرها الكثير من الأوامر. قد يبدو أن جيت-كولا أقل تفاعلية من مدير ملفات متكامل تمامًا ومخصّص لجيت، ولكنه من ناحية أخرى يقدم عمليًا كل ما يفعله جيت، لذلك فهو في الواقع أكثر قوة، ويفيد المستخدمين في تعلم جيت أثناء استخدامه، ويشعر الخبراء بالراحة من خلال استخدام الواجهة والمصطلحات.
</p>

<h2>
	جيت أو الواجهات الرسومية لجيت؟
</h2>

<p>
	هذا الأمر يتعلق بما يتناسب مع رغباتك وطريقة عملك، فالبعض يفضل استخدام جيت عبر سطر الأوامر والبعض الآخر يفضل استخدامه من خلال الواجهات الرسومية.
</p>

<p>
	سنتعلم في المقال التالي كيفية إعداد خادم جيت وإدارته، وهذا يشمل آلية وصول المستخدم والإدارة، وتشغيل البرمجيات المخصصة.
</p>

<p>
	ترجمة -وبتصرف- للمقال <a href="https://opensource.com/life/16/8/graphical-tools-git" rel="external nofollow">3 graphical tools for Git</a> لصاحبه Seth Kenlon.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
<li>
		المقال التالي: <a href="https://academy.hsoub.com/programming/workflow/git/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%A8%D9%86%D8%A7%D8%A1-%D8%AE%D8%A7%D8%AF%D9%85-%D8%AC%D9%8A%D8%AA-%D9%84%D9%80-git-r1605/" rel="">كيفية بناء خادم جيت لـ Git</a>
	</li>
	<li>
		المقال السابق: <a href="https://academy.hsoub.com/programming/workflow/git/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%A7%D8%B3%D8%AA%D8%B9%D8%A7%D8%AF%D8%A9-%D8%A5%D8%B5%D8%AF%D8%A7%D8%B1%D8%A7%D8%AA-%D8%A7%D9%84%D9%85%D9%84%D9%81%D8%A7%D8%AA-%D8%A7%D9%84%D9%82%D8%AF%D9%8A%D9%85%D8%A9-%D9%81%D9%8A-%D8%AC%D9%8A%D8%AA-git-r1603/" rel="">كيفية استعادة إصدارات الملفات القديمة في جيت Git</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/workflow/git/%d9%85%d8%af%d8%ae%d9%84-%d8%a5%d9%84%d9%89-%d9%86%d8%b8%d8%a7%d9%85-%d8%a7%d9%84%d8%aa%d8%ad%d9%83%d9%85-%d9%81%d9%8a-%d8%a7%d9%84%d9%86%d8%b3%d8%ae-git-r240/" rel="">مدخل إلى نظام التحكم في النسخ Git</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/workflow/git/%D8%A7%D9%84%D8%A3%D8%B3%D8%A6%D9%84%D8%A9-%D8%A7%D9%84%D8%B9%D8%B4%D8%B1%D8%A9-%D8%A7%D9%84%D8%A3%D9%83%D8%AB%D8%B1-%D8%AA%D9%83%D8%B1%D8%A7%D8%B1%D8%A7-%D8%AD%D9%88%D9%84-git-r318/" rel="">الأسئلة العشرة الأكثر تكرارا حول Git</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">1604</guid><pubDate>Fri, 17 Jun 2022 10:00:57 +0000</pubDate></item><item><title>&#x643;&#x64A;&#x641;&#x64A;&#x629; &#x627;&#x633;&#x62A;&#x639;&#x627;&#x62F;&#x629; &#x625;&#x635;&#x62F;&#x627;&#x631;&#x627;&#x62A; &#x627;&#x644;&#x645;&#x644;&#x641;&#x627;&#x62A; &#x627;&#x644;&#x642;&#x62F;&#x64A;&#x645;&#x629; &#x641;&#x64A; &#x62C;&#x64A;&#x62A; Git</title><link>https://academy.hsoub.com/programming/workflow/git/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%A7%D8%B3%D8%AA%D8%B9%D8%A7%D8%AF%D8%A9-%D8%A5%D8%B5%D8%AF%D8%A7%D8%B1%D8%A7%D8%AA-%D8%A7%D9%84%D9%85%D9%84%D9%81%D8%A7%D8%AA-%D8%A7%D9%84%D9%82%D8%AF%D9%8A%D9%85%D8%A9-%D9%81%D9%8A-%D8%AC%D9%8A%D8%AA-git-r1603/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2022_06/62ac2e59ef98c_------.jpg.d2d8512ed3cf4bddbc7778880e78249f.jpg" /></p>

<p>
	ستتعلم في مقال اليوم كيفية معرفة موقعك الحالي ضمن السجل الزمني لمشروعك، وكيفية استعادة الإصدارات القديمة للملفات، وكيفية إنشاء فروع branch في جيت حتى تتمكن من تجربة أفكارك الجديدة والعبث بالملفات بأمان.
</p>

<p>
	يتم تحديد مكان تواجدك في سجل المشروع من خلال مؤشر يُسمى الرأس HEAD، وللانتقال عبر السجل الزمني لمشروعك، يجب عليك تحريك هذا الرأس ليشير إلى المكان الذي تريد، وهذه العملية تتم من خلال الأمر <code>git checkout</code>. هناك طريقتان لاستخدام هذا الأمر، الأولى هي استعادة ملف من خلال العودة إلى إيداع سابق (استعادة الملف إلى الحالة التي تم إيداعه بها في وقت سابق)، والثانية هي الانتقال إلى فرع آخر.
</p>

<h2>
	استعادة ملف في مستودع git
</h2>

<p>
	كثيرة هي السيناريوهات التي قد تؤول بنا إلى الحاجة إلى استعادة حالة حُفِظ فيها الملف في نقطة زمنية سابقة؛ على سبيل المثال أثناء عملنا على أحد الملفات وتحقيقنا تقدمًا جيدًا للغاية في العمل عليه، ثم إضافته ثم إيداعه، ثم بعد شرب فنجان شاي وأخذ قسط من الراحة نستنتج أننا بحاجة إلى تعديل آخر، وخلال إجراء هذا التعديل نلاحظ أن ما فعلناه كان عبثًا، فنندم وتؤول بنا الحاجة إلى استعادة الملف إلى حالته السابقة (قبل هذه الفوضى)، وهنا يأتي دور الأمر<code>git checkout</code>، حيث يتجلى الحل بالعودة إلى آخر إيداع نفذته، وفي هذه الحالة فهو يمثل الرأس:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_1511_6" style="">
<span class="pln">$ git checkout HEAD filename</span></pre>

<p>
	في حال قمت بإيداع إصدار سيئ لملفٍ ما من دون قصد، ودعت بك الحاجة إلى العودة إلى إيداع سابق، فابحث في سجل جيت لمشروعك لمعرفة الإيداعات السابقة التي قمت بتنفيذها، ثم اختر الإيداع الذي تراه مناسبًا:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_1511_8" style="">
<span class="pln">$ git log </span><span class="pun">--</span><span class="pln">oneline</span></pre>

<p>
	سيكون الخرج:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_1511_10" style="">
<span class="lit">79a4e5f</span><span class="pln"> bad take
f449007 </span><span class="typ">The</span><span class="pln"> second commit
</span><span class="lit">55df4c2</span><span class="pln"> </span><span class="typ">My</span><span class="pln"> great project</span><span class="pun">,</span><span class="pln"> first commit</span><span class="pun">.</span></pre>

<p>
	إن أردت الانتقال إلى الإيداع الأول ذي المعرف 55df4c2 فنفذ ما يلي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_1511_12" style="">
<span class="pln">$ git checkout </span><span class="lit">55df4c2</span><span class="pln"> filename</span></pre>

<p>
	الآن، بفرض أنك استعدت الإصدار الأقدم من الملف إلى موقعك الحالي (بإمكانك الاطلاع على موقع الحالي من خلال الأمر <code>git status</code>)، فستحتاج إلى إضافة الملف، ثم إيداعه لأنه تغير.
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_1511_14" style="">
<span class="pln">$ git add filename
$ git commit </span><span class="pun">-</span><span class="pln">m </span><span class="str">'restoring filename from first commit.'</span></pre>

<p>
	يمكنك الآن أن تبحث في سجل جيت للتحقق مما فعلته:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_1511_16" style="">
<span class="pln">$ git log </span><span class="pun">--</span><span class="pln">oneline
d512580 restoring filename </span><span class="kwd">from</span><span class="pln"> first commit
</span><span class="lit">79a4e5f</span><span class="pln"> bad take
f449007 </span><span class="typ">The</span><span class="pln"> second commit
</span><span class="lit">55df4c2</span><span class="pln"> </span><span class="typ">My</span><span class="pln"> great project</span><span class="pun">,</span><span class="pln"> first commit</span><span class="pun">.</span></pre>

<h2>
	العودة في الخط الزمني
</h2>

<p>
	الطريقة الأخرى لاستعادة ملف هي إرجاع مشروع جيت بأكمله، وهذا يمكن اعتباره مقدمة لفكرة الفروع.
</p>

<p>
	عندما تعود في السجل إلى الخلف، فهذا يعني أنك قد أرجعت الرأس إلى إصدار سابق من مشروعك، في الشيفرة التالية سنجعل المشروع يعود بأكمله إلى الحالة التي كان عليها عند الإيداع الأول:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_1511_18" style="">
<span class="pln">$ git log </span><span class="pun">--</span><span class="pln">oneline
d512580 restoring filename </span><span class="kwd">from</span><span class="pln"> first commit
</span><span class="lit">79a4e5f</span><span class="pln"> bad take
f449007 </span><span class="typ">The</span><span class="pln"> second commit
</span><span class="lit">55df4c2</span><span class="pln"> </span><span class="typ">My</span><span class="pln"> great project</span><span class="pun">,</span><span class="pln"> first commit</span><span class="pun">.</span><span class="pln">

$ git checkout </span><span class="lit">55df4c2</span></pre>

<p>
	إن العودة بهذه الطريقة قد يكون خَطِرًا ما لم تكن متأكدًا مما تفعله، لأن هذا الأمر يؤدي إلى تدمير كل ما أنجزته في مشروعك، وسيعود بك إلى حالة الإيداع الأول. افتراضيًّا، يفترض جيت أنك لا تريد القيام بذلك، لذا فهو يفصل الرأس عن المشروع ويتيح لك العمل حسب الحاجة دون الكتابة فوق الملفات السابقة، أي كأنه إجراء وقائي، واعتمادًا على ذلك يمكننا الانطلاق بفكرة الفروع، ففي هذه الحالة تكون الخطوة الأفضل هي أن نُنشئ فرعًا جديدًا بعد العودة بكامل المشروع إلى الإيداع الأول.
</p>

<p>
	إذًا في كثير من الحالات، ومنها ما رأيته في الحالة السابقة، أو في حال أردت تجريب نهج مختلف خلال رحلة تطوير العمل، أو في حال خطرت في ذهنك فكرة جديدة تتطلب العديد من التغييرات وشعرت أنك بحاجة إلى تجريبها أولًا لرؤية إذا ما كانت تعطي نتائج أفضل بالفعل، فإن الطريقة الآمنة للقيام بذلك هي إنشاء فرع جديد.
</p>

<p>
	تشبه هذه الفروع تقريبًا إنشاء نسخة جديدة من الشيفرة البرمجية الخاصة بك كما هي في الوقت الحالي، والتي يمكن استخدامها بعد ذلك لتطوير شيفرة جديد، وبمزيد من التفصيل.
</p>

<p>
	يُقصَد بالتفريع Branching الانتقال للعمل على خط تطوير مغاير لخط التطوير الرئيس والاستمرار في العمل على هذا الخط دون تداخل مع الخط الرئيس، وبذلك تكون قادرًا على تجريب فكرتك الجديدة، وبنفس الوقت تستطيع أن تكمل من حيث توقفت مع فكرتك الأولى في حال رأيت أن فكرتك الجديدة فاشلة، كما يمكنك دمجها مع الفرع الرئيس في حال رأيت أن هذه الفكرة أو هذا النهج أعطى نتائج أفضل.
</p>

<p>
	لإنشاء فرع جديد في جيت والانتقال إليه، يمكنك استخدام الأمر التالي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_1511_20" style="">
<span class="pln">$ git checkout </span><span class="pun">-</span><span class="pln">b remix
</span><span class="typ">Switched</span><span class="pln"> to a new branch </span><span class="str">'remix'</span></pre>

<p>
	أو يمكنك استخدام الكود التالي لإنشاء فرع جديد، لكن دون الانتقال إليه:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_1511_22" style="">
<span class="pln">git branch </span><span class="pun">&lt;</span><span class="pln">branch</span><span class="pun">-</span><span class="pln">name</span><span class="pun">&gt;</span></pre>

<p>
	بذلك تكون قد أنشأت الفرع الجديد، لكنك تبقى في الفرع الأساسي، وفي حال أردت الانتقال إلى الفرع الجديد، استخدم الأمر:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_1511_26" style="">
<span class="pln">git checkout </span><span class="pun">&lt;</span><span class="pln">branch</span><span class="pun">-</span><span class="pln">name</span><span class="pun">&gt;</span></pre>

<p>
	يمكنك أيضًا إنشاء فرع جديد، من فرع آخر (أي ليس من الفرع الحالي)، من خلال الأمر:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_1511_24" style="">
<span class="pln">git checkout </span><span class="pun">-</span><span class="pln">b </span><span class="pun">&lt;</span><span class="pln">new</span><span class="pun">-</span><span class="pln">branch</span><span class="pun">-</span><span class="pln">name</span><span class="pun">&gt;</span><span class="pln"> </span><span class="pun">&lt;</span><span class="kwd">from</span><span class="pun">-</span><span class="pln">branch</span><span class="pun">-</span><span class="pln">name</span><span class="pun">&gt;</span></pre>

<p>
	الآن في حال رأيت أن فكرتك الثانية أو أن النهج الجديد فاشل، يمكنك العودة ببساطة إلى الفرع الرئيس:
</p>

<pre class="ipsCode">
$ git checkout master
</pre>

<p>
	أما إذا رأيت أنها تعطي نتائج أفضل، فعد إلى فرعك الرئيس وادمجها ضمنه:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_1511_28" style="">
<span class="pln">$ git checkout master
$ git merge remix</span></pre>

<p>
	فكرة الفروع هي ميزة رائعة وقوية من جيت، ومن الشائع للمطورين إنشاء فرع جديد فور استنساخ المستودع؛ بهذه الطريقة، يتم احتواء جميع أعمالهم في فرعهم الخاص، ثم يمكنهم لاحقًا دمجه في الفرع الرئيسي.
</p>

<p>
	لا توجد طريقة "صحيحة" أو "خاطئة" في استخدام الفروع، ولكن التفريع يجعل من السهل فصل المهام والمساهمات، كما أنه بإمكانك إنشاء العدد الذي تريده من الفروع.
</p>

<h2>
	العمل على المستودعات البعيدة
</h2>

<p>
	أصبحت تعرف الآن كيفية الاحتفاظ بالمستودع على جهازك المحلي والتعامل معه، ولكن ماذا عن استخدامه عندما تعمل مع المساهمين الآخرين؟
</p>

<p>
	لتتمكن من التعاون مع المساهمين الآخرين في أي مشروع من خلال جيت، تحتاج إلى معرفة كيفية إدارة مستودعاتك البعيدة.
</p>

<p>
	المستودعات البعيدة هي إصدارات من مشروعك تتم استضافتها على الإنترنت أو الشبكة في مكان ما، ويمكن أن يكون لديك العديد من المستودعات، ويكون كل منها مخصص لك إما للقراءة فقط أو للقراءة والكتابة.
</p>

<p>
	يتضمن التعاون مع الآخرين إدارة هذه المستودعات البعيدة ودفع البيانات Push وسحبها pull منها وإليها عندما تحتاج إلى مشاركة العمل. تتضمن إدارة المستودعات البعيدة معرفة كيفية إضافة مستودعات بعيدة، وإدارة مختلف الفروع البعيدة وتعريفها على أنها متتبعة أم لا، وغيرها العديد من الأمور الأخرى.
</p>

<p>
	هناك العديد من الطرق لإعداد جيت، بحيث يمكن للعديد من الأشخاص العمل في مشروع في وقت واحد، لذلك سنركز في الوقت الحالي على العمل على نسخة معينة، سواء حصلت على هذه النسخة من خادم جيت المخصص لشخص ما أو من صفحة جيت هاب، أو من محرك أقراص مشترك على نفس الشبكة.
</p>

<p>
	الفرق الوحيد بين العمل في مستودع جيت الخاص بك والعمل على شيء تريد مشاركته مع الآخرين هو أنه في مرحلة ما، تحتاج إلى دفع تغييراتك إلى مستودع شخص آخر. نُطلق على المستودع الذي تعمل عليه اسم "المستودع المحلي" وأي مستودع آخر اسم "المستودع بعيد".
</p>

<p>
	عندما تقوم بنسخ مستودع مع أذونات قراءة وكتابة من مصدر آخر، فإن نسختك ترث المستودع البعيد كما هو كاملًا، وسيكون الاسم الافتراضي للمستودع الذي تم تنزيله هو origin، وهو الاسم المختصر الافتراضي الذي يعطيه جيت <a href="https://academy.hsoub.com/devops/servers/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%AE%D8%A7%D8%AF%D9%85-%D8%A7%D9%84%D9%88%D9%8A%D8%A8-r574/" rel="">للخادم</a> الذي نسخت منه المستودع، ويستخدم الاسم المختصر كمرجع للدلالة على المستودع بدلًا من كتابة مساره كاملًا (<a href="https://academy.hsoub.com/programming/general/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D8%B9%D9%86%D9%88%D8%A7%D9%86-url-%D9%88%D8%A3%D9%86%D9%88%D8%A7%D8%B9%D9%87-r1435/" rel="">عنوان URL</a> لذاك المستودع).
</p>

<p>
	يمكننا تغيير اسم المستودع من الأصل origin إلى اسم آخر أيضًا. عادة ما يحتفظ الناس باسم المستودع "الأصل" نفسه، لكن من الضروري تغيير اسم المستودع المحلي (المستودع الذي قمت بتنزيله على جهازك) إذا كان هناك العديد من المستودعات (المشاريع) التي تعمل عليها.
</p>

<p>
	يمكن استخدام الأمر التالي الذي يُظهر مسارات URL التي خزنها جيت للاستخدام عند القراءة من المستودع أو الكتابة فيه، وإن كان لديك أكثر من مستودع بعيد فسيعرضها كلها.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_1511_47" style="">
<span class="pln">$ git remote </span><span class="pun">--</span><span class="pln">verbose
origin  seth@example</span><span class="pun">.</span><span class="pln">com</span><span class="pun">:~/</span><span class="pln">myproject</span><span class="pun">.</span><span class="typ">Git</span><span class="pln"> </span><span class="pun">(</span><span class="pln">fetch</span><span class="pun">)</span><span class="pln">
origin  seth@example</span><span class="pun">.</span><span class="pln">com</span><span class="pun">:~/</span><span class="pln">myproject</span><span class="pun">.</span><span class="typ">Git</span><span class="pln"> </span><span class="pun">(</span><span class="pln">push</span><span class="pun">)</span></pre>

<p>
	الحصول على نسخة من المستودع البعيد أمرًا مفيدًا، لأنه بمثابة أخذ نسخة احتياطية يمكن العمل عليها من خارج الموقع الذي يستضيفها، كما أنه يسمح لشخص آخر بالعمل في المشروع.
</p>

<p>
	يمكنك إضافة مستودع جديد باسم مختصر يعد مرجعا للمستودع، من خلال الأمر التالي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_1511_34" style="">
<span class="pln">git remote add </span><span class="pun">[</span><span class="pln">shortname</span><span class="pun">]</span><span class="pln"> </span><span class="pun">[</span><span class="pln">url</span><span class="pun">]</span></pre>

<p>
	على سبيل المثال:
</p>

<pre class="ipsCode">
$ git remote add seth@example.com:~/myproject.Git
</pre>

<p>
	إذا قمت بإجراء تعديلات على الملفات وأردت إرسالها إلى المستودع البعيد ولديك أذونات القراءة والكتابة في المستودع، فاستخدم الأمر <code>git push</code>:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_1511_36" style="">
<span class="pln">git push </span><span class="pun">[</span><span class="pln">remote</span><span class="pun">-</span><span class="pln">name</span><span class="pun">]</span><span class="pln"> </span><span class="pun">[</span><span class="pln">branch</span><span class="pun">-</span><span class="pln">name</span><span class="pun">]</span></pre>

<p>
	حيث <code>[remote-name]</code> يمثل الفرع على الخادم البعيد و <code>[branch-name]</code> على <a href="https://academy.hsoub.com/devops/servers/%D8%AF%D9%84%D9%8A%D9%84-%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D8%AE%D8%A7%D8%AF%D9%85-%D9%88%D9%8A%D8%A8-%D9%85%D8%AD%D9%84%D9%8A-%D8%AE%D8%B7%D9%88%D8%A9-%D8%A8%D8%AE%D8%B7%D9%88%D8%A9-r422/" rel="">الخادم المحلي</a>، حيث أنه في المرة الأولى التي تدفع فيها التغييرات يجب عليك أيضًا إرسال معلومات الفرع الخاص بك، ومن الأفضل دومًا عدم العمل على الفرع الرئيسي <code>master</code>، ما لم يُطلب منك القيام بذلك:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_1511_38" style="">
<span class="pln">$ git checkout </span><span class="pun">-</span><span class="pln">b seth</span><span class="pun">-</span><span class="pln">dev
$ git add exciting</span><span class="pun">-</span><span class="pln">new</span><span class="pun">-</span><span class="pln">file</span><span class="pun">.</span><span class="pln">txt
$ git commit </span><span class="pun">-</span><span class="pln">m </span><span class="str">'first push to remote'</span><span class="pln">
$ git push </span><span class="pun">-</span><span class="pln">u origin HEAD</span></pre>

<p>
	يؤدي هذا إلى دفع موقعك الحالي HEAD والفرع الموجود عليه إلى المستودع البعيد، وبعد أن تقوم بدفع فرعك أول مرة يمكنك الاستغناء عن الخيار <code>‎-u</code>:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_1511_40" style="">
<span class="pln">$ git add another</span><span class="pun">-</span><span class="pln">file</span><span class="pun">.</span><span class="pln">txt
$ git commit </span><span class="pun">-</span><span class="pln">m </span><span class="str">'another push to remote'</span><span class="pln">
$ git push origin HEAD</span></pre>

<h2>
	دمج الفروع
</h2>

<p>
	عندما تعمل بمفردك في مستودع جيت، يمكنك دمج أي فرع ضمن فرعك الرئيسي وقتما تشاء، أما عند العمل جنبًا إلى جنب مع أحد الشُركاء، فمن المحتمل أن ترغب في مراجعة التغييرات قبل دمجها في الفرع الرئيسي الخاص بك:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_1511_42" style="">
<span class="pln">$ git checkout contributor
$ git pull
$ less blah</span><span class="pun">.</span><span class="pln">txt  </span><span class="com"># review the changed files</span><span class="pln">
$ git checkout master
$ git merge contributor</span></pre>

<p>
	إذا كنت تستخدم جيت هاب GitHub أو جيت لاب GitLab أو أي خدمة ويب مشابهة، فالعملية تكون مختلفة، فهناك من المعتاد أن تنسخ المشروع وتعامله كما لو كان مستودعك الخاص، حيث يمكنك العمل في المستودع وإرسال التغييرات إلى حسابك على جيت هاب أو جيت لاب دون الحصول على إذن من أي شخص، لأنه المستودع الخاص بك.
</p>

<p>
	إذا كنت تريد أن يتلقى الشخص الذي نسخت مشروعه تغييراتك، فيمكنك إنشاء <a href="https://academy.hsoub.com/programming/workflow/git/%D9%83%D9%8A%D9%81-%D8%AA%D8%B3%D8%A7%D9%87%D9%85-%D9%81%D9%8A-%D9%85%D8%B4%D8%A7%D8%B1%D9%8A%D8%B9-%D9%85%D9%81%D8%AA%D9%88%D8%AD%D8%A9-%D8%A7%D9%84%D9%85%D8%B5%D8%AF%D8%B1-%D8%B9%D9%84%D9%89-github-r265/" rel="">طلب سحب pull request</a>، من خلال الواجهة الخلفية لخدمة الويب وذلك لإرسال تعديلاتك إلى المالك الأساسي والسماح له بمراجعة التغييرات وسحبها.
</p>

<p>
	عادةً ما يتم تنفيذ المشاريع من خلال خدمة ويب مثل جيت هاب، لكن جميع أوامر جيت لإدارة نسختك من المشروع تبقى نفسها بما في ذلك عملية الدفع push، وعندما تريد إرسال تغييراتك تعود إلى خدمة الويب لفتح طلب سحب كما ذكرنا، وبذلك يتم إنجاز المهمة.
</p>

<h2>
	خاتمة
</h2>

<p>
	انتهينا من المقال الذي شرحنا فيه طرق استعادة نسخ قديمة من الملفات الموجودة في مستودع git وكيفية التعامل مع المستودعات والفروع فيما يخص ذلك، وسنلقي في المقال القادم نظرةً على بعض الوظائف الإضافية الملائمة لمساعدتك على دمج جيت بشكل مريح في سير عملك اليومي.
</p>

<p>
	ترجمة -وبتصرف- للمقال <a href="https://opensource.com/life/16/7/how-restore-older-file-versions-git" rel="external nofollow">How to restore older file versions in Git</a> لصاحبه Seth Kenlon.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
<li>
		المقال التالي: <a href="https://academy.hsoub.com/programming/workflow/git/%D8%A3%D8%AF%D9%88%D8%A7%D8%AA-%D8%B1%D8%B3%D9%88%D9%85%D9%8A%D8%A9-%D9%84%D9%84%D8%A3%D8%AF%D8%A7%D8%A9-%D8%B3%D8%B7%D8%B1-%D8%A7%D9%84%D8%A3%D9%88%D8%A7%D9%85%D8%B1-%D8%AC%D9%8A%D8%AA-git-r1604/" rel="">أدوات رسومية للأداة سطر الأوامر جيت Git</a>
	</li>
	<li>
		المقال السابق: <a href="https://academy.hsoub.com/programming/workflow/git/%D8%A5%D9%86%D8%B4%D8%A7%D8%A1-%D8%A3%D9%88%D9%84-%D9%85%D8%B3%D8%AA%D9%88%D8%AF%D8%B9-%D9%84%D9%83-%D9%85%D9%86-%D8%AE%D9%84%D8%A7%D9%84-%D8%AC%D9%8A%D8%AA-git-r1594/" rel="">إنشاء أول مستودع لك من خلال جيت Git</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/workflow/git/%D8%A7%D9%84%D8%A5%D8%B4%D8%B1%D8%A7%D9%81-%D8%B9%D9%84%D9%89-%D9%85%D8%B4%D8%A7%D8%B1%D9%8A%D8%B9-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A7%D8%AA-%D9%85%D9%81%D8%AA%D9%88%D8%AD%D8%A9-%D8%A7%D9%84%D9%85%D8%B5%D8%AF%D8%B1-%D8%B9%D8%A8%D8%B1-%D8%BA%D9%8A%D8%AA-%D9%87%D8%A8-github-r1585/" rel="">الإشراف على مشاريع البرمجيات مفتوحة المصدر عبر غيت هب GitHub</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">1603</guid><pubDate>Fri, 17 Jun 2022 09:57:20 +0000</pubDate></item><item><title>&#x625;&#x646;&#x634;&#x627;&#x621; &#x623;&#x648;&#x644; &#x645;&#x633;&#x62A;&#x648;&#x62F;&#x639; &#x644;&#x643; &#x645;&#x646; &#x62E;&#x644;&#x627;&#x644; &#x62C;&#x64A;&#x62A; Git</title><link>https://academy.hsoub.com/programming/workflow/git/%D8%A5%D9%86%D8%B4%D8%A7%D8%A1-%D8%A3%D9%88%D9%84-%D9%85%D8%B3%D8%AA%D9%88%D8%AF%D8%B9-%D9%84%D9%83-%D9%85%D9%86-%D8%AE%D9%84%D8%A7%D9%84-%D8%AC%D9%8A%D8%AA-git-r1594/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2022_05/2_githubupload.jpg.7da0f098a2b23058e0472b61c2cc1e50.jpg" /></p>

<p>
	سنتعرف الآن عن كيفية إنشاء مستودع جيت Git خاص بك، وكيفية إضافة الملفات إلى هذا المستودع وتنفيذ عمليات الإيداع. تحدثنا في المقالات السابقة عن كيفية التفاعل مع جيت كمستخدمين نهائيين، حيث نذهب إلى المشروع المفتوح المصدر المنشور على جيت ونقوم بنسخه إلى جهازنا للاستفادة منه.
</p>

<p>
	من المعروف أن جيت هي الأداة الأفضل للتعامل مع المشاريع البرمجية الكبيرة أو الصغيرة، وحتى المشاريع الغير برمجية كما سبق وتحدثنا في المقالة الأولى، فمن الممكن أن تستخدمها لإدارة إصدارات مجلة أو يوميات أو رواية أو غيرها.
</p>

<h2>
	آلية عمل جيت
</h2>

<p>
	عندما نتحدث عن التصوير الحاسوبي (التصوير الرقمي)، فإننا نميل إلى تسميته باللقطات snapshots، أي وكأنه ألبوم صور يحتوي على صور في لحظات زمنية مختلفة، لكن عند التحدث عن جيت فربما يكون التسجيل الصوتي التشابهي وصفًا مناسبًا أكثر.
</p>

<p>
	أقراص أشرطة الاستديو التقليدية تحتوي على عدة مكونات، مثل البكرات التي تدور للأمام أو للخلف، وشريط لحفظ الموجات الصوتية، ورأس تشغيل لاكتشاف الموجات الصوتية على الشريط وإخراجها للمستمع. هذه الأشرطة يمكنك تشغيلها للأمام، كما يمكنك إرجاعها للعودة إلى نقطة سابقة محددة في الشريط، كما يمكنك تقديمها للأمام إلى نقطة لاحقة.
</p>

<p>
	الآن تخيل معي فرقة موسيقية في السبعينات تسجل على شريط، من المنطقي أن هذه الفرقة تتدرب مرارًا وتكرارًا على أجزاء هذه الأغنية بغية الوصول إلى الأداء المثالي، ثم بعد ذلك إنتاج الأفكار الأساسية أو الهياكل أو الترتيب الذي سيطورون منه العمل الموسيقي الخاص بهم، فربما يقررون البدء بتسجيل أصوات الطبول، ثم الجيتار، ثم الكمان، ثم الغناء. الآن في كل مرة تؤدي فيها الفرقة تسجيلًا لأحد الأصوات السابقة، يُعيد مهندس الاستوديو لف الشريط إلى نقطة البداية، أي أنه يتم تشغيل الصوت السابق في الخلفية أثناء تسجيل الصوت الثاني، أي عندما تقوم بعزف الغيتار سيكون صوت الطبول في الخلفية، وهذا ما يسمى بوضع الحلقة، حيث تتم إعادة الشريط إلى البداية بعد تسجيل كل صوت. يمكنك أيضًا نسخ واستبدال بكرة من الشريط بالكامل، في حال أردت مزج شيء جديد لاحقًا.
</p>

<p>
	الآن بعد أن تعرّفنا على آلية التسجيل الصوتي في السبعينات، يمكننا أن نشبه هذه الآلية بآلية عمل جيت.
</p>

<h2>
	إنشاء مستودع جيت
</h2>

<p>
	أول خطوة هي الذهاب إلى أحد المتاجر وشراء شريط التسجيل، وهذا يكافئ المستودع في جيت حيث سننجز فيه كامل العمل الخاص. يمكن لأي مجلد موجود على حاسوبك أن يصبح مستودعًا لجيت، لكننا الآن سنقوم بإنشاء مستودع جديد عن طريق ثلاث أوامر:
</p>

<ul>
<li>
		إنشاء مجلد جديد (يمكنك أيضًا إنشاؤه مباشرةً من خلال واجهة المستخدم الرسومية).
	</li>
	<li>
		الانتقال إلى موقع المجلد من خلال الطرفية.
	</li>
	<li>
		تهيئته بحيث يصبح مجلدًا يديره جيت.
	</li>
</ul>
<p>
	وهذه هي الأوامر المطلوبة بالترتيب:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4429_6" style="">
<span class="pln">$ mkdir </span><span class="pun">~/</span><span class="pln">jupiter  </span><span class="pun">#</span><span class="pln"> make directory
$ cd </span><span class="pun">~/</span><span class="pln">jupiter     </span><span class="pun">#</span><span class="pln"> change into the </span><span class="kwd">new</span><span class="pln"> directory
$ git init </span><span class="pun">.</span><span class="pln">       </span><span class="pun">#</span><span class="pln"> initialise  your </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Git</span><span class="pln"> repo</span></pre>

<p>
	الآن أصبح المجلد jupiter عبارة عن مستودع جيت ولكنه فارغ حاليًّا.
</p>

<p>
	هذا كل ما يتطلب الأمر منك لإنشاء مستودع، ومن الآن أصبح بإمكانك نسخه والرجوع إلى الخلف أو الأمام في التاريخ، وإنشاء مخططات زمنية بديلة، وكل الأمور الأخرى التي يوفرها لك جيت.
</p>

<p>
	العمل داخل مستودع جيت هو نفس العمل الذي تنجزه مع أي مجلد آخر؛ بمعنى عمليات إنشاء الملفات أو نسخها داخل المجلد أو حفظ الملفات فيه وغيرها من العمليات الأخرى هي نفسها مع المجلدات العادية، وجيت لا تؤدي أي عملية إلى عندما تستدعيها.
</p>

<p>
	في مستودع جيت المحلي، يمكن أن يكون الملف بإحدى الحالات التالية:
</p>

<ul>
<li>
		غير متتبع Untracked: ملفات يتم إنشاؤها في المستودع، ولكن لم تتم إضافتها إلى جيت حتى الآن.
	</li>
	<li>
		متتبع Tracked: ملف تمت إضافته إلى جيت.
	</li>
	<li>
		مُدرج Staged: ملف مُدرج (أو مرحلي)، أي تم إدراجه تمهيدًا إلى إيداعه في مستودع جيت.
	</li>
</ul>
<p>
	أي ملف تضيفه إلى مستودع جيت يكون في البداية ملف غير متتبع، أي أن الملف يكون موجود على حاسوبك، لكنك لم تخبر جيت عنه حتى الآن.
</p>

<p>
	جيت يخبرك بالملفات التي يتم تتبعها والتي لا يتم تتبعها من خلال الأمر <code>git status</code>:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4429_8" style="">
<span class="pln">$ echo </span><span class="str">"hello world"</span><span class="pln"> </span><span class="pun">&gt;</span><span class="pln"> foo
$ git status
</span><span class="typ">On</span><span class="pln"> branch master
</span><span class="typ">Untracked</span><span class="pln"> files</span><span class="pun">:</span><span class="pln">
</span><span class="pun">(</span><span class="pln">use </span><span class="str">"git add &lt;file&gt;..."</span><span class="pln"> to include in what will be committed</span><span class="pun">)</span><span class="pln">    
    foo    
nothing added but untracked files present </span><span class="pun">(</span><span class="pln">use </span><span class="str">"git add"</span><span class="pln"> to track</span><span class="pun">)</span></pre>

<p>
	كما تلاحظ، يخبرك جيت أيضًا بكيفية بدء تتبع الملفات.
</p>

<h2>
	استخدام جيت من خلال خدمات الويب الشهيرة
</h2>

<p>
	إنشاء المستودعات في جيت هاب Github وجيت لاب Gitlab أكثر سهولة، فكل ما عليك فعله هو نقرة على الزر New Repository واتباع التعليمات، ومن الممارسات الجيدة عند إنشاء المستودعات إنشاء ملف README، هذا الملف عبارة عن توضيح للهدف الذي تم إنشاء المستودع من أجله. بالنسبة لنسخ المستودع فلا يختلف الأمر عن المعتاد، لكن الحصول على إذن الكتابة على هذا المستودع في جيت هاب أكثر تعقيدًا إلى حد ما، لأنه من أجل المصادقة على جيت هاب، يجب أن يكون لديك <a href="https://academy.hsoub.com/devops/security/ssh/%D8%A7%D9%84%D8%B9%D9%85%D9%84-%D9%85%D8%B9-%D8%AE%D9%88%D8%A7%D8%AF%D9%8A%D9%85-ssh-%D8%A7%D9%84%D8%B9%D9%85%D9%84%D8%A7%D8%A1-%D9%88%D8%A7%D9%84%D9%85%D9%81%D8%A7%D8%AA%D9%8A%D8%AD-r55/" rel="">مفتاح <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr></a>.
</p>

<p>
	في حال كنت تعمل على حاسوب مثبت عليه إحدى توزيعات لينوكس، فيمكنك إنشاء مفتاح من خلال الأمر التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4429_13" style="">
<span class="pln">$ <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">ssh</abbr></span><span class="pun">-</span><span class="pln">keygen</span></pre>

<p>
	ثم انسخ مفتاحك الجديد، وهو نص عادي يمكنك فتحه في محرر نص عادي، أو استخدام الأمر<code>cat</code>:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4429_15" style="">
<span class="pln">$ cat </span><span class="pun">~</span><span class="str">/.<abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">ssh</abbr>/</span><span class="pln">id_rsa</span><span class="pun">.</span><span class="pln">pub</span></pre>

<p>
	الآن الصق مفتاحك في ملف ضبط <a href="https://academy.hsoub.com/devops/security/ssh/%D8%A3%D9%86%D9%81%D8%A7%D9%82-ssh%D8%8C-%D9%85%D8%A7%D9%87%D9%8A%D8%AA%D9%87%D8%A7-%D9%88%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF%D9%87%D8%A7-r76/" rel=""><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr></a> الخاص بجيت هاب، أو تكوين GitLab الخاص بك.
</p>

<p>
	بما أنك نسخت مشروع جيت هاب الخاص بك عبر مفتاح <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr>، ستتمكن من إعادة الكتابة إلى المستودع الخاص بك.
</p>

<p>
	أو كحل بديل، يمكنك استخدام واجهة تحميل الملفات الخاصة بغيت هاب لإضافة الملفات دون الحاجة إلى استخدام جيت على نظامك.
</p>

<p style="text-align: center;">
	<img alt="2_githubupload.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="100318" data-unique="k2304lapz" src="https://academy.hsoub.com/uploads/monthly_2022_05/2_githubupload.jpg.56529d27dfc2aa9a4d3eb8b8a8348fa4.jpg" style="width: 450px; height: auto;"></p>

<h2 id="-">
	الملفات المتتبعة
</h2>

<p>
	كما لاحظت منذ قليل عندما استخدمت الأمر <code>git status</code>، فهو يخبرك بضرورة إضافة الملف لكي يبدأ بتتبعه، وذلك من خلال الأمر <code>git add</code> الذي يقوم بوضع الملف في منقطة مرحلية خاصة تنتظر فيها الملفات إلى حين إيداعها، أو الاحتفاظ بها ضمن لقطة snapshot إلى وقت لاحق. الهدف من الأمر <code>git add</code> هو التمييز بين الملفات التي تريد تضمينها في لقطة، والملفات الجديدة أو المؤقتة التي تريد أن يتجاهلها جيت، على الأقل في الوقت الحالي.
</p>

<p>
	بمجرد إضافة ملف، سيتعرف عليه جيت كملف متتبع:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4429_19" style="">
<span class="pln">$ git add foo
$ git status
</span><span class="typ">On</span><span class="pln"> branch master
</span><span class="typ">Changes</span><span class="pln"> to be committed</span><span class="pun">:</span><span class="pln">
</span><span class="pun">(</span><span class="pln">use </span><span class="str">"git reset HEAD &lt;file&gt;..."</span><span class="pln"> to unstage</span><span class="pun">)</span><span class="pln">
</span><span class="kwd">new</span><span class="pln"> file</span><span class="pun">:</span><span class="pln">   foo</span></pre>

<p>
	إن إضافة الملف من خلال الأمر <code>git add</code> لا تؤدي إلى إضافة الملف إلى نظام التتبع في جيت مباشرةً، وإنما يجهزه لذلك، أي أنه يصبح في حالة مرحلية كما ذكرنا، وفي هذه الأثناء يظل بإمكانك إجراء التعديلات عليه قبل إيداعه.
</p>

<p>
	لكن انتبه، طالما لم تقم بإيداعه بعد، فلن تتمكن من العودة بالزمن للوراء، أي مثلًا في حال كنت قد وصلت لحالة مثالية في مشروعك، ثم جاء أحد أطفالك وبدأ العبث بحاسوبك ومسح كل ما أنجزته، فستكون في ورطة.
</p>

<p>
	إذا رأيت أن الملف ليس جاهزًا حقًا ليتم إيداعه (حفظه في سجلات جيت)، فيمكنك حينئذٍ إخراجه من المنطقة المرحلية، تمامًا كما وصفت رسالة جيت التي رأيناها منذ قليل:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4429_21" style="">
<span class="pln">$ git reset HEAD foo</span></pre>

<h2 id="-">
	إيداع الملفات
</h2>

<p>
	في لحظةٍ ما لابد وأن تقرر إيداع ملفاتك، وخلال دورة حياة المشروع تختلف عدد المرات التي تقوم فيها بإيداع ملفاتك، وهذا يعود لك بالطبع، فكلما احتجت حفظ حالة معينة لحالة الملفات يجدر بك تنفيذ هذا الأمر، على سبيل المثال في حال كنت تقوم ببناء واجهة رسومية، وفي لحظةٍ ما نجحت في إظهار شكل محدد ضمن هذه الواجهة، فربما ترغب بحفظ ملفاتك عند هذه الحالة (لكيلا يُفاجئك طفلك مثلًا).
</p>

<p>
	إن تنفيذ أمر الإيداع يعني تسجيل جميع الملفات الموجودة ضمن المنطقة المرحلية في المستودع، أي أن جيت يسجل الملفات التي يتم تعقبها، أي الملفات التي تمت إضافتها من خلال الأمر <code>git add</code> والتي تم تعديلها منذ آخر إيداع، وفي حال لم يكن هناك أي إيداع سابق، فسيتم تضمين جميع الملفات المتتبعة في الإيداع لأنها انتقلت من حالة غير موجود إلى موجود، وهذا يمثل تعديل كبير جدًا من وجهة نظر جيت.
</p>

<p>
	لتنفيذ عملية الإيداع نستخدم الأمر التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4429_23" style="">
<span class="pln">$ git commit </span><span class="pun">-</span><span class="pln">m </span><span class="str">'My great project, first commit.'</span></pre>

<p>
	هذا يؤدي إلى حفظ جميع الملفات ضمن نقطة زمنية ثابتة لديها مؤشر مرجعي للرجوع إلى هذا الإيداع (هذه النقطة) في سجل جيت الخاص بك:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4429_29" style="">
<span class="pln">$ git log </span><span class="pun">--</span><span class="pln">oneline
</span><span class="lit">55df4c2</span><span class="pln"> </span><span class="typ">My</span><span class="pln"> great project</span><span class="pun">,</span><span class="pln"> first commit</span><span class="pun">.</span></pre>

<p>
	للحصول على تقرير مفصل أكثر، يمكنك استخدام الأمر <code>git log</code> دون خيار <code>‎</code>--oneline.
</p>

<p>
	الرقم المرجعي للإيداع في هذا المثال هو 55df4c2، ويطلق عليه قيمة الإيداع المشفرة commit hash، ويمثل كل الأشياء التي سجلتها جنبًا إلى جنب مع التسجيلات السابقة، وفي حال أردت الرجوع إلى حالة سابقة (نقطة زمنية)، فيمكنك استخدام هذا الرقم المرجعي للعودة إلى الخلف، وكلما قمت بالمزيد من التغييرات والإيداعات، زاد عدد هذه التجزئات التي تعمل كمراجع إلى إصدارات مختلفة من إنتاجك، ولهذا السبب يطلقون على جيت نظام التحكم في الإصدار.
</p>

<p>
	في المقالة التالية، سوف نتعرف على الأمر <code>git head</code> بتفصيل أكبر، وسنكتشف معًا كيفية السفر عبر الزمن في جيت.
</p>

<p>
	ترجمة -وبتصرف- للمقال <a href="https://opensource.com/life/16/7/creating-your-first-git-repository" rel="external nofollow">Creating your first Git repository</a> لصاحبه Seth Kenlon.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
<li>
		المقال التالي: <a href="https://academy.hsoub.com/programming/workflow/git/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%A7%D8%B3%D8%AA%D8%B9%D8%A7%D8%AF%D8%A9-%D8%A5%D8%B5%D8%AF%D8%A7%D8%B1%D8%A7%D8%AA-%D8%A7%D9%84%D9%85%D9%84%D9%81%D8%A7%D8%AA-%D8%A7%D9%84%D9%82%D8%AF%D9%8A%D9%85%D8%A9-%D9%81%D9%8A-%D8%AC%D9%8A%D8%AA-git-r1603/" rel="">كيفية استعادة إصدارات الملفات القديمة في جيت Git</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/workflow/git/%D8%A8%D8%AF%D8%A1-%D8%A7%D9%84%D8%B9%D9%85%D9%84-%D9%85%D8%B9-%D9%86%D8%B8%D8%A7%D9%85-%D8%A5%D8%AF%D8%A7%D8%B1%D8%A9-%D8%A7%D9%84%D8%A5%D8%B5%D8%AF%D8%A7%D8%B1%D8%A7%D8%AA-%D8%AC%D9%8A%D8%AA-git-r1593/" rel="">بدء العمل مع نظام إدارة الإصدارات جيت Git </a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/workflow/git/%D8%A7%D9%84%D8%AF%D9%84%D9%8A%D9%84-%D8%A7%D9%84%D9%85%D8%B1%D8%AC%D8%B9%D9%8A-%D9%84%D9%84%D8%B9%D9%85%D9%84-%D8%B9%D9%84%D9%89-%D9%86%D8%B8%D8%A7%D9%85-%D8%BA%D9%8A%D8%AA-git-r1587/" rel="">الدليل المرجعي للعمل على نظام غيت Git</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/workflow/git/%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-git-%D9%84%D9%84%D9%85%D8%B1%D8%A9-%D8%A7%D9%84%D8%A3%D9%88%D9%84%D9%89-r260/" rel="">إعداد Git للمرة الأولى</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">1594</guid><pubDate>Fri, 17 Jun 2022 09:55:33 +0000</pubDate></item><item><title>&#x627;&#x644;&#x62F;&#x644;&#x64A;&#x644; &#x627;&#x644;&#x645;&#x631;&#x62C;&#x639;&#x64A; &#x644;&#x644;&#x639;&#x645;&#x644; &#x639;&#x644;&#x649; &#x646;&#x638;&#x627;&#x645; &#x63A;&#x64A;&#x62A; Git</title><link>https://academy.hsoub.com/programming/workflow/git/%D8%A7%D9%84%D8%AF%D9%84%D9%8A%D9%84-%D8%A7%D9%84%D9%85%D8%B1%D8%AC%D8%B9%D9%8A-%D9%84%D9%84%D8%B9%D9%85%D9%84-%D8%B9%D9%84%D9%89-%D9%86%D8%B8%D8%A7%D9%85-%D8%BA%D9%8A%D8%AA-git-r1587/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2022_05/62920a33291bb_-----Git.png.2e60257923414d2b8eaf1bdccbdd3691.png" /></p>

<p>
	يدير فريق مطوِّري <a href="https://academy.hsoub.com/programming/general/%D9%85%D8%A7-%D8%A7%D9%84%D9%85%D9%82%D8%B5%D9%88%D8%AF-%D8%A8%D9%85%D8%B5%D8%B7%D9%84%D8%AD-%D9%85%D9%81%D8%AA%D9%88%D8%AD-%D8%A7%D9%84%D9%85%D8%B5%D8%AF%D8%B1-open-source%D8%9F-r885/" rel="">البرامج مفتوحة المصدر</a> والمشرفون عليها مشاريعهم عادةً من خلال نظام غيت، وهو نظام إدارة الإصدارات الموزعة التي تدعم المشاركة.
</p>

<p>
	يقدم لك هذا الدليل المُعَدّ على نمط الورقة المرجعية cheat sheet مرجعًا سريعًا للأوامر التي تفيدك في العمل والمشاركة في مستودع غيت. ولتثبيت نظام غيت وإعداده اِقرأ المقالة "<a href="https://academy.hsoub.com/programming/workflow/git/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%A7%D9%84%D9%85%D8%B3%D8%A7%D9%87%D9%85%D8%A9-%D9%81%D9%8A-%D8%A7%D9%84%D9%85%D8%B4%D8%A7%D8%B1%D9%8A%D8%B9-%D9%85%D9%81%D8%AA%D9%88%D8%AD%D8%A9-%D8%A7%D9%84%D9%85%D8%B5%D8%AF%D8%B1-%D8%A7%D8%A8%D8%AF%D8%A3-%D8%A8%D8%AA%D8%B9%D9%84%D9%85-%D9%86%D8%B8%D8%A7%D9%85-git-r1580/" rel="">كيف تساهم في المشاريع مفتوحة المصدر: ابدأ بتعلم نظام غيت Git</a>".
</p>

<p>
	إليك بعض الملاحظات قبل البدء بهذا الدليل:
</p>

<ul>
<li>
		أُعِدّ هذا الدليل على نمط الورقة المرجعية وأُضيفت إليه مقتطفاتٌ مستقلة من موجّه الأوامر.
	</li>
	<li>
		انتقل إلى أي قسم ذي صلة بالمهمة التي تحاول تنفيذها.
	</li>
	<li>
		عندما ترى نصًا مظللًا ضمن الأوامر في هذا الدليل، تذكر أن تستبدل هذا النص بنصٍ يشير إلى الإيداعات commits والملفات الموجودة في <em>مستودعك</em>.
	</li>
</ul>
<h2>
	الإعداد والتهيئة
</h2>

<p>
	تحقَّق من إصدار نظام غيت لديك بالاستعانة بالأمر التالي، والذي سيؤكد أيضًا أن النظام مثبَّتٌ على جهازك:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_1462_7" style="">
<span class="pln">$ git </span><span class="pun">--</span><span class="pln">version</span></pre>

<p>
	يتيح لك غيت ضبط بعض الإعدادات، التي تُطبَّق على جميع المستودعات الموجودة على جهازك المحلي. على سبيل المثال، اِضبط اسم مستخدمٍ سيستخدمه غيت ليوثِّق به أية تعديلات تجريها على مستودع محلي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_1462_9" style="">
<span class="pln">$ git config </span><span class="pun">--</span><span class="kwd">global</span><span class="pln"> user</span><span class="pun">.</span><span class="pln">name </span><span class="highlight"><span class="str">"firstname lastname"</span></span></pre>

<p>
	اضبط عنوان البريد الإلكتروني ليُربَط مع كل علامة سجل محفوظة history marker على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_1462_11" style="">
<span class="pln">$ git config </span><span class="pun">--</span><span class="kwd">global</span><span class="pln"> user</span><span class="pun">.</span><span class="pln">email </span><span class="highlight"><span class="str">"valid-email"</span></span></pre>

<p>
	اضبط محرر النصوص الذي تفضله أيضًا:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_1462_14" style="">
<span class="pln">$ git config </span><span class="pun">--</span><span class="pln">global core</span><span class="pun">.</span><span class="pln">editor </span><span class="highlight"><span class="str">"nano"</span></span></pre>

<p>
	يمكنك تهيئة دليل العمل working directory الحالي على أنه مستودع غيت باستخدام الأمر <code>init</code> على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_1462_16" style="">
<span class="pln">$ git init</span></pre>

<p>
	لنسخ مستودع غيت مُستضاف عن بُعد، ستستخدم الأمر <code>git clone</code> مع عنوان url للمستودع أو موقع الخادم (في حالة إضافة موقع الخادم، ستستخدم الأمر <code><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">ssh</abbr></code>):
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4149_9" style="">
<span class="pln">$ git clone https</span><span class="pun">:</span><span class="com">//www.github.com/username/repo-name</span></pre>

<p>
	اِعرض المستودع البعيد لدليل غيت الحالي لديك:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_1462_20" style="">
<span class="pln">$ git remote</span></pre>

<p>
	للحصول على خرج مطوَّل verbose، استخدم الراية <code>v-</code> على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_1462_22" style="">
<span class="pln">$ git remote </span><span class="pun">-</span><span class="pln">v</span></pre>

<p>
	أضِف فرع غيت الأولي primary، ,الذي قد يكون عنوان url، أو مُستضافًا على خادم (في هذه الحالة اتصل بالخادم باستخدام الأمر <code><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">ssh</abbr></code>):
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4149_11" style="">
<span class="pln">$ git remote add upstream https</span><span class="pun">:</span><span class="com">//www.github.com/username/repo-name</span></pre>

<h2>
	التحضير للإدراج
</h2>

<p>
	عندما تعدل ملفًا وتضع علامةً عليه للانتقال إلى الإيداع التالي، فإنه يُعد ملفًا مُدرجًا staged. يمكن التحقق من حالة مستودع غيت لديك، بحيث يتضمن الملفات المضافة المُدرجة وغير المُدرجة على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_1462_27" style="">
<span class="pln">$ git status</span></pre>

<p>
	استخدم الأمر <code>add</code> لإدراج الملفات المُعدَّلة، إذ يمكنك تنفيذه عدّة مرات قبل ملف الإيداع؛ وإذا أجريت تعديلات لاحقة تريد إدراجها في الإيداع التالي، عليك تنفيذ الأمر <code>add</code> مجددًا. كما يمكنك تحديد ملفٍ معين في الأمر <code>add</code> على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_1462_29" style="">
<span class="pln">$ git add </span><span class="highlight"><span class="pln">my_script</span><span class="pun">.</span><span class="pln">py</span></span></pre>

<p>
	ويمكنك باستخدام النقطة <code>.</code> إضافة جميع الملفات الموجودة في الدليل الحالي، وهذا يشمل الملفات التي تبدأ بالنقطة <code>.</code>:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_1462_31" style="">
<span class="pln">$ git add </span><span class="pun">.</span></pre>

<p>
	إذا أردت إضافة جميع الملفات الموجودة في الدليل الحالي إضافةً إلى الملفات الموجودة في الدلائل الفرعية، فيمكنك استخدام الراية <code>all-</code> أو <code>A-</code>:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_1462_33" style="">
<span class="pln">$ git add </span><span class="pun">-</span><span class="pln">A</span></pre>

<p>
	يمكنك إزالة ملف من مرحلة الإدراج مع الاحتفاظ بالتعديلات ضمن دليل العمل الخاص بك باستخدام الأمر <code>reset</code>:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_1462_35" style="">
<span class="pln">$ git reset my_script</span><span class="pun">.</span><span class="pln">py</span></pre>

<h2>
	الإيداع
</h2>

<p>
	بمجرد انتهائك من إدراج التحديثات التي أجريتها، فأنت جاهزٌ لإضافة إيداع، والذي سيسجِّل التعديلات التي أجريتها على المستودع. لإيداع ملفاتٍ مُدرجة، نفِّذ الأمر <code>commit</code> وأضف رسالة إيداعٍ ذات مغزًى حتى تتمكن من متابع الإيداعات:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_1462_37" style="">
<span class="pln">$ git commit </span><span class="pun">-</span><span class="pln">m </span><span class="str">"Commit message"</span></pre>

<p>
	يمكنك اختصار جميع الملفات التي تتابعها من خلال إضافة إيداعٍ لها في خطوةٍ واحدة:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_1462_39" style="">
<span class="pln">$ git commit </span><span class="pun">-</span><span class="pln">am </span><span class="str">"Commit message"</span></pre>

<p>
	يمكنك تعديل رسالة الإيداع بإضافة الراية <code>amend--</code>:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_1462_41" style="">
<span class="pln">$ git commit </span><span class="pun">--</span><span class="pln">amend </span><span class="pun">-</span><span class="pln">m </span><span class="str">"New commit message"</span></pre>

<h2>
	الفروع
</h2>

<p>
	الفرع في غيت هو مؤشرٌ متنقلٌ لأحد الإيداعات في المستودع، ويتيح لك عزل العمل وإدارة تطوير الخصائص وعمليات الدمج. إذا أردت معرفة المزيد عن الفروع اقرأ <a href="https://git-scm.com/book/en/v1/Git-Branching-What-a-Branch-Is" rel="external nofollow">توثيق غيت</a>.
</p>

<p>
	اعرض جميع الفروع الحالية بتنفيذ الأمر <code>branch</code>، إذ ستظهر علامة النجمة (*) بجوار فرعك النشط حاليًا:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_1462_43" style="">
<span class="pln">$ git branch</span></pre>

<p>
	أنشئ فرعًا جديدًا. ستبقى في فرعك النشط حاليًا حتى تبدّل إلى الفرع الجديد:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_1462_45" style="">
<span class="pln">$ git branch </span><span class="highlight"><span class="kwd">new</span><span class="pun">-</span><span class="pln">branch</span></span></pre>

<p>
	بدِّل إلى أيّ فرعٍ موجود، وتحقق منه في دليل العمل الحالي لديك:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_1462_50" style="">
<span class="pln">$ git checkout </span><span class="highlight"><span class="pln">another</span><span class="pun">-</span><span class="pln">branch</span></span></pre>

<p>
	يمكنك دمج عمليتي إنشاء فرع جديد والتحقق منه باستخدام الراية <code>b-</code> على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_1462_47" style="">
<span class="pln">$ git checkout </span><span class="pun">-</span><span class="pln">b </span><span class="highlight"><span class="kwd">new</span><span class="pun">-</span><span class="pln">branch</span></span></pre>

<p>
	أعِد تسمية فرعك على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4149_13" style="">
<span class="pln">$ git branch </span><span class="pun">-</span><span class="pln">m current</span><span class="pun">-</span><span class="pln">branch</span><span class="pun">-</span><span class="pln">name </span><span class="kwd">new</span><span class="pun">-</span><span class="pln">branch</span><span class="pun">-</span><span class="pln">name</span></pre>

<p>
	ادمج سجلات الفرع المحدد مع الفرع الذي تعمل فيه حاليًا:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_1462_54" style="">
<span class="pln">$ git merge </span><span class="highlight"><span class="pln">branch</span><span class="pun">-</span><span class="pln">name</span></span></pre>

<p>
	بإمكانك إلغاء عملية الدمج في حال وجود تعارضات على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_1462_56" style="">
<span class="pln">$ git merge </span><span class="pun">--</span><span class="pln">abort</span></pre>

<p>
	كما يمكنك تحديد إيداعٍ معيّن لدمجه باستخدام الأمر <code>cherry-pick</code> وكتابة سلسلة المحارف التي تشير إلى ذلك الإيداع:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_1462_58" style="">
<span class="pln">$ git cherry</span><span class="pun">-</span><span class="pln">pick </span><span class="highlight"><span class="pln">f7649d0</span></span></pre>

<p>
	عندما تدمج فرعًا ولم تعد بحاجة إليه، يمكنك حذفه على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_1462_60" style="">
<span class="pln">$ git branch </span><span class="pun">-</span><span class="pln">d </span><span class="highlight"><span class="pln">branch</span><span class="pun">-</span><span class="pln">name</span></span></pre>

<p>
	إذا لم تدمج فرعًا مع الفرع الرئيسي، لكنك متأكد من رغبتك في حذفه، فيمكنك <strong>فرض</strong> حذف الفرع:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4149_43" style="">
<span class="pln">$ git branch </span><span class="pun">-</span><span class="pln">D branch</span><span class="pun">-</span><span class="pln">name</span></pre>

<h2>
	المشاركة والتحديث
</h2>

<p>
	يمكنك استخدام الأمر <code>fetch</code> لتنزيل التعديلات من مستودع آخر، مثل المستودع الأوّلي البعيد على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4149_41" style="">
<span class="pln">$ git fetch upstream</span></pre>

<p>
	يُستخدم الأمر التالي لدمج الإيداعات التي جلبناها fetched. تذكر أن بعض المستودعات قد تستخدِم <code>master</code> بدلاً من <code>main</code>:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_1462_66" style="">
<span class="pln">$ git merge upstream</span><span class="pun">/</span><span class="pln">main</span></pre>

<p>
	ومن أجل دفع أو نقل إيداعات الفرع المحلي إلى فرع المستودع البعيد، استخدم الأمر التالي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_1462_68" style="">
<span class="pln">$ git push origin main</span></pre>

<p>
	ولجلب ودمج أية إيداعات من فرع المتابعة tracking البعيد:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_1462_70" style="">
<span class="pln">$ git pull</span></pre>

<h2>
	الفحص Inspecting
</h2>

<p>
	اِعرض سجل الإيداع للفرع النشط حاليًا:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_1462_72" style="">
<span class="pln">$ git log</span></pre>

<p>
	اِعرض الإيداعات التي عدَّلت ملفًا معينًا، إذ يتبَع هذا العرض الملف بغض النظر عن إعادة التسمية:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4149_39" style="">
<span class="pln">$ git log </span><span class="pun">--</span><span class="pln">follow my_script</span><span class="pun">.</span><span class="pln">py</span></pre>

<p>
	اعرض الإيداعات الموجودة في فرعٍ محدد وليست موجودة في الفرع الآخر، إذ سيعرض الأمر التالي الإيداعات في الفرع a-branch وغير الموجودة في الفرع b-branch:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4149_17" style="">
<span class="pln">$ git log a</span><span class="pun">-</span><span class="pln">branch </span><span class="pun">..</span><span class="pln"> b</span><span class="pun">-</span><span class="pln">branch</span></pre>

<p>
	اطلع على السجلات المرجعية <code>reflog</code> لتعرف آخر مرةٍ حُدِّث فيها أحدث إيداعٍ في الفروع والمراجع الأخرى ضمن المستودع:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_1462_80" style="">
<span class="pln">$ git reflog</span></pre>

<p>
	اعرض أي كائنٍ في غيت من خلال سلسلة محارف إيداعه أو القيمة المعمَّاة Hash بصياغةٍ قابلة للقراءة على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4149_37" style="">
<span class="pln">$ git show de754f5</span></pre>

<h2>
	عرض التغييرات
</h2>

<p>
	يعرض الأمر<code>git diff</code> الفروقات بين الإيداعات والفروع وغيرها. يمكنك الاطلاع على المزيد عنها من خلال قراءة <a href="https://git-scm.com/docs/git-diff" rel="external nofollow">توثيق غيت</a>. يُستخدم الأمر التالي لموازنة الملفات المُعدّلة الموجودة في مرحلة الإدراج:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_1462_84" style="">
<span class="pln">$ git diff </span><span class="pun">--</span><span class="pln">staged</span></pre>

<p>
	اعرض التغييرات على ما هو موجود في الفرع a-branch وغير الموجود في الفرع b-branch على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4149_19" style="">
<span class="pln">$ git diff a</span><span class="pun">-</span><span class="pln">branch </span><span class="pun">..</span><span class="pln"> b</span><span class="pun">-</span><span class="pln">branch</span></pre>

<p>
	اِعرض التغييرات بين إيداعين محدّدين على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4149_21" style="">
<span class="pln">$ git diff </span><span class="lit">61ce3e6</span><span class="pln"> </span><span class="pun">..</span><span class="pln"> e221d9c</span></pre>

<p>
	تتبع مسار التغييرات من خلال حذف ملف من مشروعك ونظِّم هذا الحذف لإضافته إلى إيداع على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4149_35" style="">
<span class="pln">$ git rm file</span></pre>

<p>
	أو غيِّر مسار ملفٍ موجود، ثم نظِّم الانتقال:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4149_33" style="">
<span class="pln">$ git mv existing</span><span class="pun">-</span><span class="pln">path </span><span class="kwd">new</span><span class="pun">-</span><span class="pln">path</span></pre>

<p>
	تحقَّق من سجل الإيداع لتعرف ما إذا نُقلت أية مسارات:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_1462_94" style="">
<span class="pln">$ git log </span><span class="pun">--</span><span class="pln">stat </span><span class="pun">-</span><span class="pln">M</span></pre>

<h2>
	الإخفاء Stashing
</h2>

<p>
	ستجد أحيانًا نفسك بعد إجراء بعض التعديلات على جزءٍ من الشيفرة البرمجية وقبل الانتهاء مضطرًا إلى بدء العمل على أمرٍ آخر، وأنت لست مستعدًا لاعتماد التعديلات التي أجريتها حتى الآن، لكنك لا تريد أن يضيع عملك. في هذه الحالة، سيتيح لك الأمر <code>git stash</code> حفظ تعديلاتك المحلية في مكان ما والعودة مرةً أخرى إلى دليل العمل الذي يتوافق مع أحدث إيداع HEAD وتدعى هذه العملية بعملية الإخفاء أو الادخار stashing. لإخفاء عملك الحالي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_1462_96" style="">
<span class="pln">$ git stash</span></pre>

<p>
	اطلِّع على ما اخفيته حاليًا:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_1462_101" style="">
<span class="pln">$ git stash list</span></pre>

<p>
	تُسمى الأعمال المُخبأة كما يلي: {stash@{0، و {stash@{1 وهكذا. لعرض معلومات عن عملٍ مُخبأ stash معين:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_1462_99" style="">
<span class="pln">$ git stash show stash@</span><span class="pun">{</span><span class="lit">0</span><span class="pun">}</span></pre>

<p>
	أضف <code>apply</code> لاستخراج الملفات الموجودة في عملٍ مُخبأ حالي منه مع الاحتفاظ به:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_1462_103" style="">
<span class="pln">$ git stash apply stash@</span><span class="pun">{</span><span class="lit">0</span><span class="pun">}</span></pre>

<p>
	إذا أردت استخراج الملفات من العمل المُخبأ ولم تعد بحاجته، أضف <code>pop</code>:
</p>

<pre class="ipsCode">
$ git stash pop stash@{0}
</pre>

<p>
	إذا لم تعد بحاجة الملفات المحفوظة في ملفٍ مُخبأ معين، أضف <code>drop</code> لإلغائه:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_1462_105" style="">
<span class="pln">$ git stash drop stash@</span><span class="pun">{</span><span class="lit">0</span><span class="pun">}</span></pre>

<p>
	إذا كان لديك عدة أعمال مُدخرة محفوظة لم تعد تحتاج إلى استخدام أيٍّ منها، أضِف <code>clear</code> لإزالتها:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_1462_107" style="">
<span class="pln">$ git stash clear</span></pre>

<h2>
	تجاهل الملفات
</h2>

<p>
	إذا أردت الاحتفاظ بالملفات في دليل غيت المحلي لديك لكنك لا تريد إضافة إيداعٍ لهم إلى المشروع، أضِف هذه الملفات إلى ملف "gitignore." لديك حتى لا تتسبب بأية تعارضات.
</p>

<p>
	استخدم محرر نصوص مثل نانو، لإضافة الملفات إلى ملف "gitignore." على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_1462_109" style="">
<span class="pln">$ nano </span><span class="pun">.</span><span class="pln">gitignore</span></pre>

<p>
	إذا أردت أن تجد نماذج لملفات "gitignore."، اطلع على <a href="https://github.com/github/gitignore" rel="external nofollow">مستودع قالب gitignore.</a> لموقع غيت هَب GitHub.
</p>

<h2>
	إعادة تأسيس الفروع
</h2>

<p>
	تتيح لنا عملية إعادة التأسيس Rebase نقل الفروع من خلال تغيير الإيداع المبنية عليه، كما تتيح لك إزالة squash الإيداعات أو إعادة صياغتها.
</p>

<p>
	يمكنك بدء عملية إعادة التأسيس، إما باستدعاء عدد الإيداعات التي أنشأتها وتريد إعادة تأسيسها (العدد هو 5 في مثالنا التالي):
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4149_23" style="">
<span class="pln">$ git rebase </span><span class="pun">-</span><span class="pln">i HEAD</span><span class="pun">~</span><span class="lit">5</span></pre>

<p>
	أو يمكنك إعادة التأسيس بالاعتماد على سلسلة محارف إيداع معين أو القيمة المُعمَّاة Hash:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4149_31" style="">
<span class="pln">$ git rebase </span><span class="pun">-</span><span class="pln">i </span><span class="lit">074a4e5</span></pre>

<p>
	بعد إزالة أو إعادة صياغة الإيداعات، يمكنك متابعة عملية إعادة تأسيس فرعك على أحدث إصدار من الشيفرة البرمجية الأولية للمشروع. تذكر أن بعض المستودعات قد تستخدم master بدلًا من main:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4149_29" style="">
<span class="pln">$ git rebase upstream</span><span class="pun">/</span><span class="pln">main</span></pre>

<p>
	لتتعلم المزيد عن إعادة التأسيس والتحديث اقرأ <a href="https://academy.hsoub.com/programming/workflow/git/%D8%A5%D8%B9%D8%A7%D8%AF%D8%A9-%D8%AA%D8%A3%D8%B3%D9%8A%D8%B3-%D8%AA%D9%81%D8%B1%D9%8A%D8%B9%D8%A7%D8%AA-%D8%B7%D9%84%D8%A8-%D8%A7%D9%84%D8%B3%D8%AD%D8%A8-%D9%88%D8%AA%D8%AD%D8%AF%D9%8A%D8%AB%D9%87-%D9%81%D9%8A-git-r1584/" rel="">كيف تعيد تأسيس طلب سحب وتحدِّثه</a> الذي يمكن تطبيقه على أي نوع إيداعٍ تريده.
</p>

<h3>
	التراجع وإعادة الضبط
</h3>

<p>
	يمكنك التراجع عن التعديلات التي أجريتها على إيداعٍ معين باستخدام الأمر <code>revert</code>، إذ يجب أن تكون شجرة العمل نظيفةً حتى يتحقق ذلك:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4149_27" style="">
<span class="pln">$ git revert </span><span class="lit">1fc6665</span></pre>

<p>
	تحتاج أحيانًا إلى إعادة ضبط دليل شجرة العمل حتى بعد عملية إعادة التأسيس، إذ يمكنك باستخدام الأمر التالي إعادة الضبط إلى إيداعٍ معين، و<strong>حذف كافة التعديلات</strong>:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4149_25" style="">
<span class="pln">$ git reset </span><span class="pun">--</span><span class="pln">hard </span><span class="lit">1fc6665</span></pre>

<p>
	لفرض دفع push أحدث إيداعٍ معروف وغير متعارض لديك إلى المستودع الأصلي، عليك استخدام <code>force--</code> على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_1462_121" style="">
<span class="pln">$ git push </span><span class="pun">--</span><span class="pln">force origin main</span></pre>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<p>
		تحذير: تكون عملية فرض الدفع إلى الفرع الرئيسي main (الأساسي master أحيانًا) غالبًا غير محبَّذة ما لم يكن لديك سببٌ وجيهٌ فعلًا لتنفيذها؛ لذلك استخدمها بحذر عند العمل على مستودعاتك الخاصة، واعمل على تجنُّبها عندما تشارك في عملٍ ما.
	</p>
</blockquote>

<p>
	لإزالة الملفات والدلائل الفرعية غير المتتبعة من دليل غيت للحصول على فرع عملٍ نظيف، استخدم الأمر <code>git clean</code>:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_1462_123" style="">
<span class="pln">$ git clean </span><span class="pun">-</span><span class="pln">f </span><span class="pun">-</span><span class="pln">d</span></pre>

<p>
	إذا أردت تعديل مستودعك المحلي ليبدو مثل الفرع الرئيسي الأولي الحالي (أي عندما توجد كثيرٌ من التعارضات)، يمكنك تنفيذ استعادة الإعدادات الأصلية hard reset على النحو التالي:
</p>

<pre class="ipsCode">
$ git reset --hard upstream/main
</pre>

<p>
	<strong>ملاحظة</strong>: سيجعل تنفيذ هذا الأمر مستودعك المحلي يبدو تمامًا مثل الفرع الأولي، و<strong>ستُتلف</strong> أية إيداعات أنشأتها ولم تسحبها إلى الفرع الأولي.
</p>

<h2>
	الخاتمة
</h2>

<p>
	يتناول هذا الدليل بعض أكثر أوامر غيت شيوعًا، والتي قد تستخدمها عند إدارة المستودعات والمشاركة في البرامج.
</p>

<p>
	توجد العديد من الأوامر التي قد تجدها مفيدةً لعملك على غيت. لمعرفة المزيد حول جميع الخيارات المتاحة لك، يمكنك تنفيذ الأمر التالي للحصول على معلومات مفيدة:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_1462_125" style="">
<span class="pln">$ git </span><span class="pun">--</span><span class="pln">help</span></pre>

<p>
	كما يمكنك قراءة المزيد حول غيت والاطلاع على ملفات توثيق غيت في قسم <a href="https://academy.hsoub.com/programming/workflow/git/" rel="">Git</a> في أكاديمية حسوب وإن واجهتك أي مشكلة فأضف سؤالك في <a href="https://academy.hsoub.com/questions/c3-programming/" rel="">قسم الأسئلة والأجوبة</a> لطلب المساعدة.
</p>

<p>
	ترجمة -وبتصرف- للمقال <a href="https://www.digitalocean.com/community/cheatsheets/how-to-use-git-a-reference-guide" rel="external nofollow">How To Use Git: A Reference Guide</a> لصاحبته Lisa Tagliaferri.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
<li>
		<a href="https://academy.hsoub.com/programming/workflow/git/%D9%81%D9%8A%D8%AF%D9%8A%D9%88-%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-git-r658/" rel="">[فيديو] أساسيات Git</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/workflow/git/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D9%86%D8%B8%D8%A7%D9%85-%D8%A7%D9%84%D8%AA%D8%AD%D9%83%D9%85-%D9%81%D9%8A-%D8%A7%D9%84%D9%86%D8%B3%D8%AE-git-r240/" rel="">مدخل إلى نظام التحكم في النسخ Git</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/workflow/git/%D9%85%D8%A8%D8%A7%D8%AF%D8%A6-git-%D8%A7%D9%84%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A9-r256/" rel="">مبادئ Git الأساسية</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/workflow/git/%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-git-%D9%84%D9%84%D9%85%D8%B1%D8%A9-%D8%A7%D9%84%D8%A3%D9%88%D9%84%D9%89-r260/" rel="">إعداد Git للمرة الأولى</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/workflow/git/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D8%B3%D9%8A%D8%B1-%D8%B9%D9%85%D9%84-%D9%86%D8%B8%D8%A7%D9%85-%D8%A7%D9%84%D8%AA%D8%AD%D9%83%D9%85-%D9%81%D9%8A-%D8%A7%D9%84%D9%86%D8%B3%D8%AE-git-r267/" rel="">أساسيات سير عمل نظام التحكم في النسخ git</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">1587</guid><pubDate>Fri, 17 Jun 2022 05:39:55 +0000</pubDate></item><item><title>&#x628;&#x62F;&#x621; &#x627;&#x644;&#x639;&#x645;&#x644; &#x645;&#x639; &#x646;&#x638;&#x627;&#x645; &#x625;&#x62F;&#x627;&#x631;&#x629; &#x627;&#x644;&#x625;&#x635;&#x62F;&#x627;&#x631;&#x627;&#x62A; &#x62C;&#x64A;&#x62A; Git</title><link>https://academy.hsoub.com/programming/workflow/git/%D8%A8%D8%AF%D8%A1-%D8%A7%D9%84%D8%B9%D9%85%D9%84-%D9%85%D8%B9-%D9%86%D8%B8%D8%A7%D9%85-%D8%A5%D8%AF%D8%A7%D8%B1%D8%A9-%D8%A7%D9%84%D8%A5%D8%B5%D8%AF%D8%A7%D8%B1%D8%A7%D8%AA-%D8%AC%D9%8A%D8%AA-git-r1593/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2022_05/6295f66566dbf_---.jpg.a449b7108fdca91315835eec5533cbd3.jpg" /></p>

<p>
	تحدثنا في <a href="https://academy.hsoub.com/programming/workflow/git/%D9%85%D8%A7-%D9%87%D9%88-git%D8%9F-r1592/" rel="">المقالة السابقة</a> عن جيت Git وعن الغرض الذي يؤديه ومن بإمكانه استخدامه، أما اليوم سنتحدث عن كيفية نسخ مستودعات جيت العامة، وعن كيفية استخراج ملفات محددة دون الحاجة إلى نسخ كامل العمل.
</p>

<p>
	جيت أداة مشهورة وتحظى بشعبية كبيرة جدًا ولاسيما عند المبرمجين لكونها تجعل عملية إدارة الإصدارات أمرًا أكثر سهولة ورتابة، لذا لابد لك من تعلمها. بدايةً، لابد لك من فهم أساسيات جيت حتى تتمكن من استخدامه لتنزيل ما تحتاجه من ملفات أو حتى المساهمة في الأعمال التي يتم نشرها. في الواقع، فإنك بمجرد أن تصبح قادرًا على ذلك (التنزيل والمساهمة)، ستكون قد حققت الغاية التي تهدف إليها هذه الأداة، حيث أن الغاية الأساسية لها كما ذكرنا في المقال السابق هو نشر العلم ومشاركته مع الآخرين، من خلال زيادة المحتوى مفتوح المصدر عبر <a href="https://academy.hsoub.com/devops/networking/%D8%A2%D9%84%D9%8A%D8%A9-%D8%B9%D9%85%D9%84-%D8%B4%D8%A8%D9%83%D8%A9-%D8%A7%D9%84%D8%A5%D9%86%D8%AA%D8%B1%D9%86%D8%AA-r571/" rel="">الإنترنت</a> وجعله متاحًا للجميع، أي القدرة على مشاركة الشيفرات البرمجية والوصول إليها والتعديل عليها من قبل الآخرين كما يحلو لهم.
</p>

<h2>
	القراءة والكتابة
</h2>

<p>
	عمومًا، هناك طريقتين للتفاعل مع مستودع جيت، هما القراءة منه أو الكتابة عليه. يمكن تشبيه المستودع بالملف، حيث أنك في بعض الأحيان تفتحه بغاية القراءة منه أو لإجراء بعض التعديلات عليه.
</p>

<p>
	سنتحدث في مقالتنا هذه عن القراءة من المستودع فقط، ونغطي الكتابة في مقال آخر.
</p>

<h2>
	جيت أم جيت هاب؟
</h2>

<p>
	جيت ليس نفسه جيت هاب GitHub أو جيت لاب GitLab أو <a href="https://academy.hsoub.com/apps/productivity/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%AA%D8%B7%D8%A8%D9%8A%D9%82-bitbucket-r456/" rel="">بت باكت Bitbucket</a>، جيت هو برنامج سطر أوامر command-line، وهو يبدو كالتالي:
</p>

<pre class="ipsCode prettyprint lang-lua prettyprinted" id="ips_uid_572_11" style="">
<span class="pln">$ git
usage</span><span class="pun">:</span><span class="pln"> </span><span class="typ">Git</span><span class="pln"> </span><span class="pun">[--</span><span class="pln">version</span><span class="pun">]</span><span class="pln"> </span><span class="pun">[--</span><span class="pln">help</span><span class="pun">]</span><span class="pln"> </span><span class="pun">[-</span><span class="pln">C </span><span class="str">&lt;path&gt;</span><span class="pun">]</span><span class="pln">
  </span><span class="pun">[-</span><span class="pln">p </span><span class="pun">|</span><span class="pln"> </span><span class="pun">--</span><span class="pln">paginate </span><span class="pun">|</span><span class="pln"> </span><span class="pun">--</span><span class="kwd">no</span><span class="pun">-</span><span class="pln">pager</span><span class="pun">]</span><span class="pln"> </span><span class="pun">[--</span><span class="pln">bare</span><span class="pun">]</span><span class="pln">
  </span><span class="pun">[--</span><span class="typ">Git</span><span class="pun">-</span><span class="pln">dir</span><span class="pun">=&lt;</span><span class="pln">path</span><span class="pun">&gt;]</span><span class="pln"> </span><span class="str">&lt;command&gt;</span><span class="pln"> </span><span class="pun">[&lt;</span><span class="pln">args</span><span class="pun">&gt;]</span></pre>

<p>
	كون جيت أداة <a href="https://academy.hsoub.com/programming/general/%D9%85%D8%A7-%D8%A7%D9%84%D9%85%D9%82%D8%B5%D9%88%D8%AF-%D8%A8%D9%85%D8%B5%D8%B7%D9%84%D8%AD-%D9%85%D9%81%D8%AA%D9%88%D8%AD-%D8%A7%D9%84%D9%85%D8%B5%D8%AF%D8%B1-open-source%D8%9F-r885/" rel="">مفتوحة المصدر</a>، سمح هذا للعديد من المبرمجين والمطورين والمهتمين بتطويره وإضافة العديد من الخصائص والإضافات إليه، والعديد من هذه الإضافات أصبحت اليوم ذات شعبية كبيرة.
</p>

<p>
	ستتعلم في هذه السلسلة من المقالات كيفية استخدام جيت من خلاله سطر الأوامر فقط، أي من دون الاعتماد على أي نوع من الواجهات (حقيقةً يمكنك تجاهل كيفية استخدام الواجهات، ويمكنك الاعتماد على سطر الأوامر فقط). عمومًا، نستعرض في المقالات القادمة بعضًا من خدمات جيت المشهورة التي تستخدم لإنجاز المشاريع.
</p>

<h2>
	تثبيت جيت
</h2>

<p>
	جيت يأتي مثبت مع جميع توزيعات لينوكس الأساسية، حيث يمكنك أن تجده ضمن مستودع البرامج software repository (بالنسبة لمستخدمي توزيعة BSD، فهو موجود ضمن شجرة المنافذ Ports tree ضمن قسم devel). عمومًا، يمكنك تثبيته باستخدام مدير حزم لينكس توزيعات ديبيان من خلال الأمر التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_572_14" style="">
<span class="pln">$ sudo apt install git</span></pre>

<p>
	بالنسبة <a href="https://academy.hsoub.com/files/24-%D8%A3%D9%86%D8%B8%D9%85%D8%A9-%D8%A7%D9%84%D8%AA%D8%B4%D8%BA%D9%8A%D9%84-%D9%84%D9%84%D9%85%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D9%86/" rel="">لأنظمة التشغيل</a> غير مفتوحة المصدر مثل نظام ويندوز، انتقل إلى هذا الرابط <a href="https://git-scm.com/download" rel="external nofollow">تعليمات التثبيت</a>.
</p>

<p>
	طبعًا أوامر جيت هي نفسها، أي بغض النظر عن نوع نظام التشغيل الذي تستخدمه، لكن بالنسبة لمستخدمي نظام ويندوز ينبغي عليهم تكييف أوامر جيت لتلائم ملفات ويندوز، أو تثبيت Cygwin لتشغيل جيت محليًا، وذلك تجنبًا لحدوث تعارضات مع نظام ملفات ويندوز.
</p>

<h2>
	الوصول إلى جيت
</h2>

<p>
	غالبيتنا لا يحتاج إلى استخدام جيت يوميًا، فمعظم استخدامنا لجيت يتمثّل في الذهاب أحيانًا إلى أحد المستودعات وتنزيل ملف أو عدة ملفات ثم المغادرة وقد لانحتاج لفتح جيت مرة أخرى لفترة من الزمن.
</p>

<p>
	هناك طريقتان للوصول إلى جيت، الأولى من خلال <a href="https://academy.hsoub.com/devops/servers/%D9%85%D8%A7-%D9%87%D9%88-%D8%B3%D8%B7%D8%B1-%D8%A7%D9%84%D8%A3%D9%88%D8%A7%D9%85%D8%B1-%D8%9F-r353/" rel="">سطرالأوامر</a>، والثانية من خلال إحدى الخدمات المنتشرة على الإنترنت، والتي توفر لنا وصولًا سريعًا وسهلًا من خلال متصفح الويب (جيت هاب مثلًا).
</p>

<p>
	لنفترض أنك تريد تثبيت سلة المهملات Trash-Bin لاستخدامها في الطرفية Terminal، وذلك لأنك لسوء الحظ تتعرض كثيرًا لحالات مثل حذف ملفات عن طريق الخطأ أو مثلًا كنت تريد حذف بعض الملفات فقط من مجلد ولكنك حذفت الملفات عن طريق الخطأ من المجلدات الفرعية أيضًا، وذلك من خلال الأمر rm.
</p>

<p>
	ربما سمعت عن الأداة Trashy، لذا في حال أردت تثبيتها أنصحك بإلقاء نظرة على التوثيق الرسمي لها قبل ذلك.
</p>

<p>
	<strong>تنويه</strong>: لحسن الحظ يتم استضافة Trashy على غيت لاب بشكل افتراضي، ويمكنك الاطلاع عليها من <a href="https://gitlab.com/trashy/trashy" rel="external nofollow">هنا</a>.
</p>

<h2>
	تحميل مستودع جيت بالكامل و تخزينه على جهازك
</h2>

<p>
	الطريقة الأولى التي سنتعامل بها مع جيت هي أشبه بما يسمى landgrab، وتعني الحصول أو الاستيلاء السريع على شيء ما، حيث أننا سننسخ كل شيء، ولاحقًا نفرز بناءً على محتويات هذه الأشياء. بما أن المستودع يتم استضافته على مخدم جيت، فهناك طريقتان لإتمام العملية السابقة، الأولى من خلال سطر الأوامر، والثانية من خلال واجهة الويب.
</p>

<p>
	لجلب كامل المستودع من خلال جيت، نستخدم الأمر <code>git clone</code> إضافةً إلى تحديد عنوان URL لمستودع جيت المطلوب الحصول عليه، وفي حال لم تكن متأكدًا من عنوان المستودع، فيمكنك التأكد من العنوان من الصفحة الرئيسية للمستودع، حيث يكون معروضًا هناك.
</p>

<p>
	على سبيل المثال، عنوان URL لمستودع Trashy من جيت لاب يكون معروضًا كما يلي:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="100314" href="https://academy.hsoub.com/uploads/monthly_2022_05/1_gitlab-url.jpg.89d0301b44e382ee1072f32ca81a7a6c.jpg" rel=""><img alt="1_gitlab-url.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="100314" data-unique="uhm266dpq" src="https://academy.hsoub.com/uploads/monthly_2022_05/1_gitlab-url.jpg.89d0301b44e382ee1072f32ca81a7a6c.jpg" style="width: 450px; height: auto;"></a>
</p>

<p>
	هذا العنوان يكون موجود في الصفحة الرئيسية في المستودع، كل ما عليك فعله هو نسخه ولصقه.
</p>

<p>
	قد تلاحظ أنه في بعض الخدمات يتم توفير روابط <a href="https://academy.hsoub.com/devops/security/ssh/%D8%A3%D9%86%D9%81%D8%A7%D9%82-ssh%D8%8C-%D9%85%D8%A7%D9%87%D9%8A%D8%AA%D9%87%D8%A7-%D9%88%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF%D9%87%D8%A7-r76/" rel=""><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr></a> و HTTPS، لذا تجدر الملاحظة إلى أنه لا يمكنك استخدام روابط <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr> إلا إذا كان لديك وصول <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr> إلى المضيف (تمكّن العديد من خدمات الاستضافة لجيت استخدام هذه الروابط من خلال السماح لك بتحميل مفتاح <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr> العام الخاص بك)، وإلا يجب عليك استخدام عنوان URL الخاص ببروتوكول HTTPS فقط.
</p>

<p>
	بعد الحصول على عنوان URL، يصبح موضوع استنساخ المستودع بسيطًا، فكل ما عليك فعله هو استخدام الأمر <code>git clone</code> متبوعًا بالعنوان، كما يمكنك أيضًا (إذا أحببت) تحديد مجلد لوضعه فيه.
</p>

<p>
	افتراضيًا، يتم نسخ مجلد جيت إلى مجلدك الحالي؛ على سبيل المثال، يتم وضع 'trashy.git' في مجلدك الحالي باسم 'trashy'. بالنسبة لي، أنا استخدم الامتداد .clone كاختصار للمستودعات التي يمكن قراءتها فقط، و .git للمستودعات التي يمكن قراءتها والكتابة عليها، ولكن هذا يعود لك، فهو لا يمثل قاعدة رسمية.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_572_23" style="">
<span class="pln">$ git clone https</span><span class="pun">:</span><span class="com">//gitlab.com/trashy/trashy.git trashy.clone</span><span class="pln">
</span><span class="typ">Cloning</span><span class="pln"> into </span><span class="str">'trashy.clone'</span><span class="pun">...</span><span class="pln">
remote</span><span class="pun">:</span><span class="pln"> </span><span class="typ">Counting</span><span class="pln"> objects</span><span class="pun">:</span><span class="pln"> </span><span class="lit">142</span><span class="pun">,</span><span class="pln"> done</span><span class="pun">.</span><span class="pln">
remote</span><span class="pun">:</span><span class="pln"> </span><span class="typ">Compressing</span><span class="pln"> objects</span><span class="pun">:</span><span class="pln"> </span><span class="lit">100</span><span class="pun">%</span><span class="pln"> </span><span class="pun">(</span><span class="lit">91</span><span class="pun">/</span><span class="lit">91</span><span class="pun">),</span><span class="pln"> done</span><span class="pun">.</span><span class="pln">
remote</span><span class="pun">:</span><span class="pln"> </span><span class="typ">Total</span><span class="pln"> </span><span class="lit">142</span><span class="pln"> </span><span class="pun">(</span><span class="pln">delta </span><span class="lit">70</span><span class="pun">),</span><span class="pln"> reused </span><span class="lit">103</span><span class="pln"> </span><span class="pun">(</span><span class="pln">delta </span><span class="lit">47</span><span class="pun">)</span><span class="pln">
</span><span class="typ">Receiving</span><span class="pln"> objects</span><span class="pun">:</span><span class="pln"> </span><span class="lit">100</span><span class="pun">%</span><span class="pln"> </span><span class="pun">(</span><span class="lit">142</span><span class="pun">/</span><span class="lit">142</span><span class="pun">),</span><span class="pln"> </span><span class="lit">25.99</span><span class="pln"> </span><span class="typ">KiB</span><span class="pln"> </span><span class="pun">|</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> bytes</span><span class="pun">/</span><span class="pln">s</span><span class="pun">,</span><span class="pln"> done</span><span class="pun">.</span><span class="pln">
</span><span class="typ">Resolving</span><span class="pln"> deltas</span><span class="pun">:</span><span class="pln"> </span><span class="lit">100</span><span class="pun">%</span><span class="pln"> </span><span class="pun">(</span><span class="lit">70</span><span class="pun">/</span><span class="lit">70</span><span class="pun">),</span><span class="pln"> done</span><span class="pun">.</span><span class="pln">
</span><span class="typ">Checking</span><span class="pln"> connectivity</span><span class="pun">...</span><span class="pln"> done</span><span class="pun">.</span></pre>

<p>
	بمجرد نسخ المستودع بنجاح، يمكنك تصفح الملفات الموجودة فيه تمامًا كما لو أنك تتصفح أي مجلد آخر على جهاز الحاسوب الخاص بك.
</p>

<p>
	الطريقة الثانية لجلب نسخة من المستودع هي من خلال واجهة الويب، حيث يوفر كل من جيت هاب وجيت لاب لقطات لأي مستودع على هيئة ملفات بامتداد ‎.zip“‎” أي ملفات مضغوطة.
</p>

<p>
	بالنسبة لجيت هاب فيمكنك تحميل المستودع من خلال الضغط على الزر الأخضر الكبير الذي يكون موجودًا في صفحة المستودع، أما بالنسبة لجيت لاب، فيكون على شكل زر رمادي غير واضح كثيرًا وعلى يمين نافذة المتصفح.
</p>

<p style="text-align: center;">
	<img alt="1_gitlab-zip.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="100315" data-unique="e1qcz366d" src="https://academy.hsoub.com/uploads/monthly_2022_05/1_gitlab-zip.jpg.1bce86b0606a2cb2aef45faa5c09d878.jpg" style="width: 450px; height: auto;"></p>

<h2 id="-">
	الحصول على ملف محدد من مستودع جيت
</h2>

<p>
	هناك طريقة أخرى للحصول على ملف من مستودع جيت، تتجلى هذه الطريقة بالذهاب إلى المستودع وجلبه مباشرةً، لكن هذه الطريقة لا يمكن القيام بها إلى من خلال واجهات الويب، حيث يمكنك النظر إلى نسخة ملفات المستودع الخاصة بشخص آخر.
</p>

<p>
	تكمن مشكلة استخدام هذه الطريقة في أنك قد تجد أن بعض الملفات غير موجودة ضمن مستودع جيت في الحالة الخام Raw (أي بدون تنزيله وبنائه)، حيث قد يكون الملف موجودًا بشكل كامل فقط بعد تنفيذ أمر make لبناء الملف، وهو الأمر الذي لن يحدث حتى تقوم قم بتنزيل المستودع، وقراءة ملف README أو INSTALL، ثم تنفيذ أوامر التثبيت والبناء. عمومًا، إذا كنت متأكدًا من وجود الملف يمكنك القيام بهذه العملية دون الحاجة لتنزيل المستودع.
</p>

<p>
	في GitLab و GitHub، انقر فوق روابط الملفات Files لعرض الملف، واعرض الملف في الحالة الخام Raw، ثم احفظه من خلال متصفح الويب الذي تستخدمه، على سبيل المثال في Firefox نختار File ثم Save Page As.
</p>

<p>
	في مستودع GitWeb، يكون هناك رابط للعرض بالحالة الخام Raw ضمن قائمة الملفات.
</p>

<p style="text-align: center;">
	<img alt="1_webgit-file.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="100316" data-unique="l1179grcu" src="https://academy.hsoub.com/uploads/monthly_2022_05/1_webgit-file.jpg.301f4a422923f745aba5cdd29e295509.jpg" style="width: 450px; height: auto;"></p>

<h2 id="-">
	أفضل الممارسات
</h2>

<p>
	يمثل نسخ مستودع جيت بأكمله الطريقة الصحيحة للتفاعل مع جيت، وذلك لعدة أسباب، أولها سهولة تحديث النُسخ (الإصدارات) باستخدام الأمر <code>git pull</code>، حيث أنك لن تضطر في هذه الحالة إلى العودة إلى موقع الويب في كل مرة تحتاج فيها إلى الحصول على نسخة جديدة من الملف عندما يتم إجراء تحسين عليها.
</p>

<p>
	السبب الثاني يتجلى في حالة إجراء تحسينات أو تعديلات بنفسك، حيث سيكون من الأسهل إرسال هذه التعديلات إلى مؤلفها الأصلي في حال كان كل شيء جيد ومرتب في مستودع جيت.
</p>

<p>
	بدايةً، سيكون من الجيد لك التدرب على نسخ مستودعات جيت من الإنترنت إلى حاسوبك كما تعلمنا، وفي حال لم تكن تعرف كيفية استخدام الطرفية Terminal جيدًا، فتابع الفقرة التالية.
</p>

<h2 id="-">
	أساسيات الطرفية
</h2>

<p>
	بدايًة، يجب أن تضع في ذهنك أن جميع الملفات على جهاز الحاسوب لها مسار “path.“ لنفرض الآن أنك تريد فتح ملف بالطريقة الاعتيادية، وليكن اسم الملف monkey، في هذه الحالة يتوجب عليك الذهاب إلى موقع الملف، وهذا يتضمن التنقل بين عدة مجلدات وصولًا إلى موقع الملف، على سبيل المثال الذهاب إلى المجلد HOME ثم Pictures وأخيرًا المجلد InktoberSketches الذي يتضمن الملف monkey المطلوب، وبالتالي يكون مسار الملف المطلوب هو:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_572_27" style="">
<span class="pln">$HOME</span><span class="pun">/</span><span class="typ">Pictures</span><span class="pun">/</span><span class="typ">InktoberSketches</span><span class="pun">/</span><span class="pln">monkey</span><span class="pun">.</span><span class="pln">kra</span></pre>

<p>
	عموماً، تبدأ جميع مسارات الملفات بالمجلد ‎$HOME“‎” (أو إذا أردت يمكنك استبدالها بالمؤثر ~) متبوعة بقائمة من المجلدات وتنتهي باسم الملف المطلوب.
</p>

<p>
	إذا كنت ترغب في نسخ مستودع جيت إلى مجلد المستندات Documents الخاص بك، فيمكنك فتح الطرفية وتنفيذ هذا الأمر:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_572_29" style="">
<span class="pln">$ git clone https</span><span class="pun">:</span><span class="com">//gitlab.com/foo/bar.git $HOME/Documents/bar.clone</span></pre>

<p>
	بعد تنفيذ هذا الأمر، يمكنك الذهاب إلى مجلد المستندات، وستجد مجلد “bar.clone“ فيها.
</p>

<p>
	يمكنك بعد ذلك زيارة هذا المستودع في وقت لاحق، واستخدام الأمر <code>git pull</code> لمعرفة ما إذا كانت هناك تحديثات للمشروع:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_572_31" style="">
<span class="pln">$ cd $HOME</span><span class="pun">/</span><span class="typ">Documents</span><span class="pun">/</span><span class="pln">bar</span><span class="pun">.</span><span class="pln">clone
$ pwd
bar</span><span class="pun">.</span><span class="pln">clone
$ git pull</span></pre>

<p>
	حاليًّا، هذه هي أوامر الطرفية التي تحتاج معرفتها للبدء، لذا يمكنك الذهاب والمحاولة بنفسك حتى تعتاد عليها.
</p>

<p>
	ترجمة -وبتصرف- للمقال <a href="https://opensource.com/life/16/7/stumbling-git" rel="external nofollow">Getting started with Git</a> لصاحبه Seth Kenlon.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
<li>
		المقال التالي: <a href="https://academy.hsoub.com/programming/workflow/git/%D8%A5%D9%86%D8%B4%D8%A7%D8%A1-%D8%A3%D9%88%D9%84-%D9%85%D8%B3%D8%AA%D9%88%D8%AF%D8%B9-%D9%84%D9%83-%D9%85%D9%86-%D8%AE%D9%84%D8%A7%D9%84-%D8%AC%D9%8A%D8%AA-git-r1594/" rel="">إنشاء أول مستودع لك من خلال جيت Git</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/workflow/git/%D8%A7%D9%84%D8%AF%D9%84%D9%8A%D9%84-%D8%A7%D9%84%D9%85%D8%B1%D8%AC%D8%B9%D9%8A-%D9%84%D9%84%D8%B9%D9%85%D9%84-%D8%B9%D9%84%D9%89-%D9%86%D8%B8%D8%A7%D9%85-%D8%BA%D9%8A%D8%AA-git-r1587/" rel="">الدليل المرجعي للعمل على نظام غيت Git </a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/workflow/git/%D9%85%D8%A8%D8%A7%D8%AF%D8%A6-git-%D8%A7%D9%84%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A9-r256/" rel="">مبادئ Git الأساسية</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/workflow/git/%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-git-%D9%84%D9%84%D9%85%D8%B1%D8%A9-%D8%A7%D9%84%D8%A3%D9%88%D9%84%D9%89-r260/" rel="">إعداد Git للمرة الأولى</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/workflow/git/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D9%86%D8%B8%D8%A7%D9%85-%D8%A7%D9%84%D8%AA%D8%AD%D9%83%D9%85-%D9%81%D9%8A-%D8%A7%D9%84%D9%86%D8%B3%D8%AE-git-r240/" rel="">مدخل إلى نظام التحكم في النسخ Git</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">1593</guid><pubDate>Sun, 19 Jun 2022 15:07:01 +0000</pubDate></item><item><title>&#x645;&#x627; &#x647;&#x648; Git&#x61F;</title><link>https://academy.hsoub.com/programming/workflow/git/%D9%85%D8%A7-%D9%87%D9%88-git%D8%9F-r1592/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2022_05/6295f1fddb0cd_-Git-.jpg.5468dd69401b2aeda71542389b3dbf45.jpg" /></p>

<p>
	ستتعلم في هذه السلسلة كيفية استخدام نظام إدارة الإصدارات جيت Git، وفي هذه المقدمة للسلسلة ستتعرف على الهدف من استخدام الأداة جيت ومن يجب أن يستخدمها.
</p>

<p>
	هذا المقال جزء من سلسلة مقالات حول جيت Git، وإليك روابط جميع المقالات ضمن هذه السلسلة:
</p>

<ol>
<li>
		ماهو جيت git؟
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/workflow/git/%D8%A8%D8%AF%D8%A1-%D8%A7%D9%84%D8%B9%D9%85%D9%84-%D9%85%D8%B9-%D9%86%D8%B8%D8%A7%D9%85-%D8%A5%D8%AF%D8%A7%D8%B1%D8%A9-%D8%A7%D9%84%D8%A5%D8%B5%D8%AF%D8%A7%D8%B1%D8%A7%D8%AA-%D8%AC%D9%8A%D8%AA-git-r1593/" rel="">بدء العمل مع نظام إدارة الإصدارات جيت</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/workflow/git/%D8%A5%D9%86%D8%B4%D8%A7%D8%A1-%D8%A3%D9%88%D9%84-%D9%85%D8%B3%D8%AA%D9%88%D8%AF%D8%B9-%D9%84%D9%83-%D9%85%D9%86-%D8%AE%D9%84%D8%A7%D9%84-%D8%AC%D9%8A%D8%AA-git-r1594/" rel="">إنشاء أول مستودع لك من خلال جيت</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/workflow/git/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%A7%D8%B3%D8%AA%D8%B9%D8%A7%D8%AF%D8%A9-%D8%A5%D8%B5%D8%AF%D8%A7%D8%B1%D8%A7%D8%AA-%D8%A7%D9%84%D9%85%D9%84%D9%81%D8%A7%D8%AA-%D8%A7%D9%84%D9%82%D8%AF%D9%8A%D9%85%D8%A9-%D9%81%D9%8A-%D8%AC%D9%8A%D8%AA-git-r1603/" rel="">كيفية استعادة إصدارات الملفات القديمة في جيت</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/workflow/git/%D8%A3%D8%AF%D9%88%D8%A7%D8%AA-%D8%B1%D8%B3%D9%88%D9%85%D9%8A%D8%A9-%D9%84%D9%84%D8%A3%D8%AF%D8%A7%D8%A9-%D8%B3%D8%B7%D8%B1-%D8%A7%D9%84%D8%A3%D9%88%D8%A7%D9%85%D8%B1-%D8%AC%D9%8A%D8%AA-git-r1604/" rel="">ثلاث أدوات رسومية للأداة جيت</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/workflow/git/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%A8%D9%86%D8%A7%D8%A1-%D8%AE%D8%A7%D8%AF%D9%85-%D8%AC%D9%8A%D8%AA-%D9%84%D9%80-git-r1605/" rel="">كيفية بناء خادم جيت</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/workflow/git/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%A5%D8%AF%D8%A7%D8%B1%D8%A9-%D8%A7%D9%84%D9%83%D8%A7%D8%A6%D9%86%D8%A7%D8%AA-%D8%A7%D9%84%D8%AB%D9%86%D8%A7%D8%A6%D9%8A%D8%A9-binary-blobs-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%AC%D9%8A%D8%AA-git-r1606/" rel="">كيفية إدارة الكائنات الثنائية Bainary Blobs باستخدام جيت</a>
	</li>
</ol>
<p>
	ربما سمعت كثيرًا عن الأداة جيت، وربما دفعك الفضول إلى طرح العديد من التساؤلات مثل هل يمكن استخدام جيت فقط لمشاركة شيفراتك البرمجية مع الآخرين، أم أنه بإمكانك استخدام جيت على المستوى الشخصي من دون مشاركته مع الآخرين، وهل يجب أن يكون لديك حساب على GitHub لاستخدام جيت؟ ولماذا استخدام جيت أساسًا؟ وما هي فوائد جيت؟ وهل جيت هو الخيار الوحيد؟
</p>

<p>
	لذا انسَ ما تعرفه أو ما تعتقد أنك تعرفه عن جيت، ودعنا نتعرف عليه من البداية.
</p>

<h2>
	ما هو نظام إدارة الإصدار؟
</h2>

<p>
	بدايةً يجب أن نعلم أن جيت هو نظام إدارة الإصدار (وتسمى أيضًا "إدارة النُسخ") version control system واختصارًا <abbr title="Version Control Systems | أنظمة التحكم بالنُّسخ">VCS</abbr>. هناك العديد من أنظمة التحكم في الإصدار: مثل CVS و SVN و Mercurial و Fossil وبالطبع جيت.
</p>

<p>
	يُمثل جيت اللبنة الأساسية للعديد من الخدمات، مثل جيت هاب GitHub وجيت لاب GitLab، ولكن يمكنك استخدام جيت لوحدها، أي بعيداً عن أي خدمة.
</p>

<p>
	إن سبق وتعاونت مع شخص أو ربما عدة أشخاص على تنفيذ مشروع رقمي مثل تصميم وتطوير المواقع الإلكترونية أو تصميم وتطوير تطبيقات الجوال أو الأجهزة المحمولة أو كتابة المحتوى الرقمي أو <a href="https://academy.hsoub.com/marketing/inbound-marketing/%d8%a7%d9%84%d8%aa%d8%b3%d9%88%d9%8a%d9%82-%d8%a8%d8%a7%d9%84%d9%85%d8%ad%d8%aa%d9%88%d9%89%d8%8c-%d9%85%d8%b9%d9%86%d8%a7%d9%87-%d9%88%d8%a3%d9%87%d9%85%d9%8a%d8%aa%d9%87-r72/" rel="">التسويق بالمحتوى</a> أو <a href="https://academy.hsoub.com/entrepreneurship/ecommerce/" rel="">التجارة الإلكترونية</a> أو غيرها من المشاريع، فبالتأكيد تعرف جيداً كيف تسير أمور التنسيق بين الشركاء على إدارة تنفيذ هذه المشاريع، حيث يكون لديك نسختك الخاصة من المشروع، ثم ترسلها إلى شريكك، الذي يجري بدوره بعض التعديلات، وبالتالي يصبح هناك نسختان (النسخة التي لديك والنسخة المُعدلة مع شريكك)، ثم يقوم شريكك بإرسال تعديلاته إليك لكي تطلع عليها وتقوم بدمجها في نسختك من أجل الحصول على نسخة جديدة واحدة مرةً أخرى، ويصبح الأمر معقداً أكثر في حال احتجت إلى إجراء المزيد من التعديلات على نسختك، وبالتالي يصبح بين يديك ثلاثة نُسخ؛ النسخة المدمجة التي عملتم عليها كلاكما، والنسخة التي غيرتها، والنسخة التي غيّرها شريكك.
</p>

<p>
	يشير جيسون فان جومستر Jason van Gumster في مقالته <a href="https://opensource.com/life/16/2/version-control-isnt-just-programmers" rel="external nofollow">التحكم في الإصدار ليس للمبرمجين فقط</a> إلى أن الفنانين يحتاجون أيضًا إلى التحكم في الإصدار، حيث تظهر هذه الحاجة في أعمالنا الفردية أيضًا.
</p>

<p>
	عند التعامل مع المشاريع العلمية أو حتى الفنية عادةً ما يتم تطوير نسخة تجريبية من شيء ما؛ نسخة أولى وثانية وثالثة و بمسميات مختلفة مثل project_justTesting.kdenlive و project_betterVersion.kdenlive، و project_best_FINAL.kdenlive وهكذا حتى نصل إلى النُسخة النهائية الأفضل.
</p>

<p>
	سواءً أكان تعديلًا برمجيًا صغيرًا في حلقة for أو أي تغييرٍ آخر، فإن نظام التحكم بالإصدارات يأتي لتسهيل الأمور وتقديم الأفضل لنا.
</p>

<h2>
	لقطات Git
</h2>

<p>
	يأخذ Git لقطات snapshots (تمثيل للحالة الحالية لملفاتك) من المشروع ويخزنها كنسخ فريدة، إذا قررت لسبب ما أن تتراجع عن بعض التعديلات، فيمكنك ببساطة العودة إلى إحدى النسخ السابقة تبعًا لما يناسبك.
</p>

<p>
	في حال كنت تتعاون مع شريكك لتنفيذ مشروع ما، فقد يقوم شريكك بإرسال بعض التعديلات لك، هذه التعديلات بإمكانك دمجها ضمن فرع العمل الخاص بك، وبعد ذلك يمكن لشريكك أن يحصل على النسخة المدمجة من المشروع ومتابعة العمل على النُسخة الجديد.
</p>

<p>
	عمومًا فإن جيت ليس أداةً سحرية، فقد تحدث أحيانًا بعض التعارضات (على سبيل المثال أنت عدلت السطر الأخير من الكتاب، لكن شريكك حذف هذا السطر بالكامل، فكيف يمكننا التعامل مع هذه الحالات؟)، ولكن على الرغم من ذلك، فإن جيت يسمح لك بإدارة أنواع عديدة من التعديلات المحتملة على نفس مشروع، وكذلك الاحتفاظ بتاريخ جميع التعديلات التي تم إجراؤها، وحتى أنه يسمح بالنُسخ المتوازية.
</p>

<h2>
	أوامر غيت
</h2>

<p>
	جيت هي الأداة السائدة للتحكم في الإصدار هذه الأيام. إليك كيفية استخدام هذه الأداة بشكل فعال.
</p>

<h3>
	الأساسيات - عند العمل مع جيت بمفردك أو مع الآخرين
</h3>

<p>
	إليك أهم الأوامر الأساسية من أوامر غيت يليها شرحها:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_429_38" style="">
<span class="pln">git status</span></pre>

<p>
	يستخدم هذا الأمر للتحقق من حالة ملفات المستودع، حيث أنه يذكرنا بالحالة التي توقفنا عندها، ويعرض لنا ملخصًا للتغييرات المحلية والملفات التي لم يتم تتبعها والإيداعات البعيدة.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_429_16" style="">
<span class="pln">git diff</span></pre>

<p>
	يستخدم هذا الأمر لعرض التغييرات المحلية المحددة للملفات المتتبعة، ويمكنك القول بأنك تحتاج هذه الأمر للإجابة على سؤالين مُحددين: ما الذي قُمت بالتعديل عليه ولم تقم بإدراجه بعد، وما الذي قمت بإدراجه لكن لم تقم بإيداعه بعد. بالرغم من أنه بإمكان git status الإجابة على هذين السؤالين، إلا أن الأمر git diff كفيل بالإجابة عنها بشكل أدق، حيث سيخبرك عن أي سطر تمت إضافته وعن أي سطر تمت إزالته.
</p>

<p>
	يمكنك أن تستخدم مع هذا الأمر الراية <code>‎--name-only</code> لرؤية أسماء الملفات التي تم تغييرها.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_429_18" style="">
<span class="pln">git add</span></pre>

<p>
	يستخدم لإدراج تعديلات على الملفات المتتبعة وغير المتتبعة.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_429_44" style="">
<span class="pln">git commit</span></pre>

<p>
	يستخدم لإنشاء إيداع جديد يتضمن التغييرات التي أضفتها، وتشبه نقطة الحفظ في الألعاب Save Point حيث يمكن من خلالها العودة إلى نسخة معينة تم الحفظ عندها. في حال أردت إرفاق عملية الإيداع برسالة توضيحية (تسمى رسالة الإيداع) استخدم <code>‎-m</code> وأضف رسالة ذات معنى معبر.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_429_20" style="">
<span class="pln">git push</span></pre>

<p>
	لإرسال التغييرات إلى المستودع البعيد الذي تم إنشاؤه (من الشائع استخدامه أكثر مع GitLab أو GitHub).
</p>

<h3>
	رايات flags مهمة - للحفاظ على كل شيء منظما
</h3>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9289_13" style="">
<span class="pln">git reset HEAD </span><span class="pun">--</span></pre>

<p>
	يؤدي إلى إزالة كل التغييرات التي لم يتم إيداعها والعودة إلى آخر إيداع، وهذا ما يشير إليه HEAD، وبتعبير أدق فإن HEAD هو مؤشر يشير دائمًا إلى الإيداع الحالي، وقد ينتمي أو لا ينتمي أحيانًا إلى الفرع الحالي.
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_9289_15" style="">
<span class="pln">git add </span><span class="pun">-</span><span class="pln">u</span></pre>

<p>
	يستخدم لإدراج الملفات المحدثة فقط، والتي تم إيداعها مسبقًا.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_429_36" style="">
<span class="pln">git log --graph
--pretty=oneline
--abbrev-commit</span></pre>

<p>
	لتأريخ الفرع بشكل أرتب وأجمل أنشئ قشرة shell أو استخدم الاختصارات Aliases (الأمر <code>git alias</code>) لتسهيل الوصول، على سبيل المثال <code>git lg</code>.
</p>

<h3>
	العمل مع مستودع بعيد
</h3>

<p>
	إليك أهم الأوامر يليها شرحها:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9289_19" style="">
<span class="pln">git fetch </span><span class="pun">--</span><span class="pln">all</span></pre>

<p>
	يستخدم هذا الأمر لتنزيل جميع الإيداعات والملفات والمراجع إلى الفروع الموجودة في جميع المستودعات البعيدة حتى تتمكن من دفع أو سحب ما تريد العمل عليه.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_429_34" style="">
<span class="pln">git pull --rebase </span><span class="tag">&lt;remote&gt;&lt;branch&gt;</span></pre>

<p>
	يستخدم لدمج جميع الإيداعات بدءًا من آخر إيداع مشترك لك من الفرع البعيد دون إنشاء إيداع دمج.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_429_26" style="">
<span class="pln">git stash</span></pre>

<p>
	يستخدم لحفظ التغييرات التي لم يتم إيداعها محليًا (المرحليّة وغير المرحليّة) مما يسمح لك بإجراء التغييرات وتبديل الفروع وتنفيذ أوامر جيت الأخرى.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_429_29" style="">
<span class="pln">git stash pop</span></pre>

<p>
	لإعادتها، حيث أن pop يزيل التغييرات من stash ويعيد تطبيقها على نسخة العمل.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_429_31" style="">
<span class="pln">gi t add [-A or . or -- </span><span class="tag">&lt;filename&gt;</span><span class="pln">]</span></pre>

<p>
	لتحديد الملفات التي تضيفها إلى إيداعاتك، خصوصًا إذا كنت ترغب في فتح طلب لدمجها في مشروع أولي.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_429_52" style="">
<span class="pln">git commit </span><span class="pun">-</span><span class="pln">m </span><span class="str">"commit message"</span></pre>

<p>
	تم شرحه مسبقًا.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_429_56" style="">
<span class="pln">git push origin </span><span class="tag">&lt;branch&gt;</span></pre>

<p>
	دفع الفرع الحالي إلى المستودع البعيد الذي يحمل العنوان "origin" والفرع المسمى branch.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_429_54" style="">
<span class="pln">git checkout -b </span><span class="tag">&lt;new_branch&gt;</span></pre>

<p>
	اختصار:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_429_58" style="">
<span class="pln">git branch</span></pre>

<p>
	والأمر:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_429_60" style="">
<span class="pln">git checkout</span></pre>

<p>
	وهو أمر مفيد عندما تريد تجربة فكرة ويكون لديك فرع جديد لتجربتها فيه ويمكن دمجها أو حذفها لاحقًا.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_429_63" style="">
<span class="pln">git checkout master &amp;&amp; git pull --rebase</span></pre>

<p>
	يستخدمان في حال أردنا الوصول إلى أحدث إيداع في مشروع لا تتابعه إلا نادرًا.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_429_65" style="">
<span class="pln">git reset </span><span class="pun">--</span><span class="pln">hard origin</span><span class="pun">/</span><span class="pln">master</span></pre>

<p>
	يستخدم عند الحاجة إلى الوصول إلى حالة معروفة.
</p>

<p>
	تنبيه: يؤدي هذا إلى مسح جميع التغييرات، حتى الإيداعات، بدءًا من الإيداع الأخير و وصولًا إلى المستودع البعيد origin في الفرع master.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_429_67" style="">
<span class="pln">git push origin master</span></pre>

<p>
	عندما تُجري بعض العمليات الصحيحة، يمكنك استخدامه لإرسال تغييراتك إلى المستودع البعيد المسمى origin في الفرع master.
</p>

<h3>
	تعليمات الحصول على المساعدة
</h3>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_429_69" style="">
<span class="pln">git </span><span class="tag">&lt;cmd&gt;</span><span class="pln"> -h</span></pre>

<p>
	لمراجعة مختصرة للرايات الخاصة بالأمر المحدد.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_429_71" style="">
<span class="pln">git </span><span class="tag">&lt;cmd&gt;</span><span class="pln"> --help</span></pre>

<p>
	لمشاهدة جميع الخيارات المتاحة للأمر المحدد.
</p>

<h3>
	الفروع الأساسية
</h3>

<p>
	تمثل الفروع سلسلة من الارتباطات وإليك أهم الأوامر للتعامل معها يليها شرحها:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_429_73" style="">
<span class="pln">git branch </span><span class="pun">--</span><span class="pln">all</span></pre>

<p>
	قائمة بجميع الفروع المحلية والبعيدة.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_429_75" style="">
<span class="pln">git checkout </span><span class="tag">&lt;branch&gt;</span></pre>

<p>
	التبديل إلى فرع موجود.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_429_78" style="">
<span class="pln">git checkout -b </span><span class="tag">&lt;branch&gt;</span><span class="pln"> master</span></pre>

<p>
	إنشاء فرع قائم على الفرع master ثم الانتقال إليه.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_429_81" style="">
<span class="pln">git checkout master &amp;&amp; git merge </span><span class="tag">&lt;branch&gt;</span></pre>

<p>
	دمج التغييرات في الفرع master.
</p>

<h3>
	سلسلة أوامر: سلسلة أوامر نستخدمها بشكل يومي مع غيت
</h3>

<p>
	استخدم الأمر cd للانتقال إلى مشروعك المحلي الذي تريد بدء إصداره باستخدام (المجلد الذي يحتوي ملفات المشروع على جهازك).
</p>

<p>
	بعد ذلك كل ما عليك فعله هو تنفيذ الأمر<code>git init</code> لأول مرة لإعداد المجلد وتتبع الإصدار:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9289_24" style="">
<span class="pln">git init
git status
git add </span><span class="pun">--</span><span class="pln">all
git status
git commit </span><span class="pun">-</span><span class="pln">m </span><span class="str">"meaningful initial commit message"</span><span class="pln">
git show</span></pre>

<p>
	بعد ذلك تبدأ بتعديلاتك على ملفاتك المحلية، ثم تقوم بإيداعها على فترات منتظمة:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9289_26" style="">
<span class="pln">git diff
git commit </span><span class="pun">-</span><span class="pln">a </span><span class="pun">-</span><span class="pln">m </span><span class="str">"Another commit message. -a performs the add step for you"</span><span class="pln">
git status
git log </span><span class="pun">--</span><span class="pln">graph </span><span class="pun">--</span><span class="pln">pretty</span><span class="pun">=</span><span class="pln">oneline </span><span class="pun">--</span><span class="pln">abbrev</span><span class="pun">-</span><span class="pln">commit</span></pre>

<p>
	بعد فترة، قد يصبح لديك 3 إيداعات، وبالتالي سيكون من الأفضل اعتبارها إيداعًا واحدًا:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9289_28" style="">
<span class="pln">git log </span><span class="pun">--</span><span class="pln">graph </span><span class="pun">--</span><span class="pln">pretty</span><span class="pun">=</span><span class="pln">oneline </span><span class="pun">--</span><span class="pln">abbrev</span><span class="pun">-</span><span class="pln">commit
git reset </span><span class="pun">--</span><span class="pln">soft HEAD</span><span class="pun">~</span><span class="lit">3</span><span class="pln">
git diff </span><span class="pun">--</span><span class="pln">cached
git commit </span><span class="pun">-</span><span class="pln">a </span><span class="pun">-</span><span class="pln">m </span><span class="str">"Better commit message for last 3 commits"</span></pre>

<p>
	وأخيرًا ، ربما تحتاج لحذف بعض الملفات غير الضرورية في المجلد الحالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9289_30" style="">
<span class="pln">git status
git diff </span><span class="pun">--</span><span class="pln">cached
git add </span><span class="pun">-</span><span class="pln">u
git commit </span><span class="pun">-</span><span class="pln">m </span><span class="str">"Another commit message. -u adds updates, including deleted files"</span><span class="pln">
git status
git log </span><span class="pun">--</span><span class="pln">graph </span><span class="pun">--</span><span class="pln">pretty</span><span class="pun">=</span><span class="pln">oneline </span><span class="pun">--</span><span class="pln">abbrev</span><span class="pun">-</span><span class="pln">commit
git push origin master</span></pre>

<h2>
	التطوير الموزع باستخدام جيت
</h2>

<p>
	يُعتبر العمل على نفس المشروع من خلال أجهزة منفصلة أمرًا معقدًا، لأنك بحاجة إلى الحصول على آخر نسخة من المشروع عندما تريد متابعة العمل وإجراء التعديلات التي تريدها، ثم مشاركة هذه التعديلات مع شُركائك في المشروع. الأسلوب التقليدي للقيام بهذا الأمر هو استخدام خدمات مشاركة الملفات عن طريق <a href="https://academy.hsoub.com/devops/networking/%D8%A2%D9%84%D9%8A%D8%A9-%D8%B9%D9%85%D9%84-%D8%B4%D8%A8%D9%83%D8%A9-%D8%A7%D9%84%D8%A5%D9%86%D8%AA%D8%B1%D9%86%D8%AA-r571/" rel="">الانترنت</a>، أو مرفقات البريد الإلكتروني، وكلاهما طرق غير فعّالة وتعرضك للعديد من الأخطاء.
</p>

<p>
	الهدف الرئيسي من تصميم جيت هو تحقيق مفهوم التطوير الموزع distributed development؛ فإذا كنت شريكًا في مشروع ما، يمكنك استنساخ المستودع الخاص بالمشروع repository، ثم العمل عليه كما لو أنه النسخة الوحيدة الموجودة، ثم من خلال استخدام بعض الأوامر البسيطة يمكنك التراجع عن أيّة تغييرات قام بها أحد الشركاء الآخرين، كما وبإمكانك أيضاً نقل تعديلاتك إلى الآخرين.
</p>

<p>
	إذًا لن يكون هناك أي التباس حول من لديه نسخة معينة من المشروع، أو النسخة الأساسية، أو التي توجد تعديلات فيها، فكل نسخة يتم تطويرها محلياً بشكل كامل، ثم يتم دفعها Push أو سحبها pull بما يتناسب مع هدف المشروع.
</p>

<h2>
	واجهات جيت
</h2>

<p>
	بصورة عامة، فإن جيت عبارة عن تطبيق يعمل على <a href="https://academy.hsoub.com/devops/linux/%D9%85%D8%A7-%D9%87%D9%88-%D9%86%D8%B8%D8%A7%D9%85-%D8%A7%D9%84%D8%AA%D8%B4%D8%BA%D9%8A%D9%84-%D9%84%D9%8A%D9%86%D9%83%D8%B3%D8%9F-r451/" rel="">نظام التشغيل لينكس Linux</a>، وبما أنه <a href="https://academy.hsoub.com/programming/general/%D9%85%D8%A7-%D8%A7%D9%84%D9%85%D9%82%D8%B5%D9%88%D8%AF-%D8%A8%D9%85%D8%B5%D8%B7%D9%84%D8%AD-%D9%85%D9%81%D8%AA%D9%88%D8%AD-%D8%A7%D9%84%D9%85%D8%B5%D8%AF%D8%B1-open-source%D8%9F-r885/" rel="">مفتوح المصدر</a> ومصمم تصميمًا جيدًا، قام المطورون حول العالم بتصميم طرق أخرى للوصول إليه.
</p>

<p>
	يُعتبر جيت أداة مجانية تمامًا وبإمكان الجميع استخدامه، ويأتي على شكل حزم كل منها مخصص للعمل على <a href="https://academy.hsoub.com/files/24-%D8%A3%D9%86%D8%B8%D9%85%D8%A9-%D8%A7%D9%84%D8%AA%D8%B4%D8%BA%D9%8A%D9%84-%D9%84%D9%84%D9%85%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D9%86/" rel="">نظام تشغيل</a> مختلف ("مثل" Linux و BSD و Illumos وأنظمة تشغيل أخرى شبيهة بيونكسـ Unix)، ويمكنك معرفة إصدار حزمة جيت المثبتة لديك بالشكل التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9289_35" style="">
<span class="pln">$ git </span><span class="pun">--</span><span class="pln">version
git version </span><span class="lit">2.5</span><span class="pun">.</span><span class="lit">3</span></pre>

<p>
	إن واجهات جيت الأكثر شهرة معظمها قائم على الويب: مواقع مثل <a href="https://academy.hsoub.com/apps/productivity/%25D9%2585%25D8%25AF%25D8%25AE%25D9%2584-%25D8%25A5%25D9%2584%25D9%2589-%25D8%25AA%25D8%25B7%25D8%25A8%25D9%258A%25D9%2582-bitbucket-r456/" rel="">bitbucket</a> و <a href="https://about.gitlab.com/" rel="external nofollow">gitlab</a> و <a href="https://github.com/" rel="external nofollow">github</a> و <a href="https://sourceforge.net/" rel="external nofollow">sourceforge</a> و <a href="http://nongnu.org/" rel="external nofollow">Savannah</a> جميعها توفر إمكانية استضافة الشيفرة على الإنترنت والهدف الرئيسي لهذه المواقع هو تعظيم المحتوى مفتوح المصدر للعامة، إضافةً إلى أنها توفر (وبدرجات مختلفة) واجهات المستخدم الرسومية المبنية على المتصفحات لتسهيل استخدام جيت.
</p>

<p>
	واجهة GitLab تظهر بالشكل التالي:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="100312" href="https://academy.hsoub.com/uploads/monthly_2022_05/0_gitlab.png.8f4304c1af0a7fb48e87419912c3fa97.png" rel=""><img alt="0_gitlab.png" class="ipsImage ipsImage_thumbnailed" data-fileid="100312" data-unique="id2vubl0g" src="https://academy.hsoub.com/uploads/monthly_2022_05/0_gitlab.png.8f4304c1af0a7fb48e87419912c3fa97.png" style="width: 450px; height: auto;"></a>
</p>

<p>
	إضافة إلى ذلك من الممكن أن يكون لخدمة جيت أو للمطورين المستقلين؛ واجهة مخصصة لا تعتمد على الويب، وبالتالي هي مفيدة في حال لم تكن ترغب بالعمل من خلال المتصفحات. أوضح مثال على ذلك هو مدير الملفات، على سبيل المثال يمكن لمدير ملفات KDE مثل <a href="https://userbase.kde.org/Dolphin" rel="external nofollow">Dolphin</a> التحقق من حالة ملفات المستودع <code>git status</code> وتوليد أوامر الإيداع commit والسحب والدفع.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="100311" href="https://academy.hsoub.com/uploads/monthly_2022_05/0_dolphin.jpg.a5ef5c477a984e42212b94d1a9e82abf.jpg" rel=""><img alt="0_dolphin.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="100311" data-unique="mpi5t3nri" src="https://academy.hsoub.com/uploads/monthly_2022_05/0_dolphin.jpg.a5ef5c477a984e42212b94d1a9e82abf.jpg" style="width: 450px; height: auto;"></a>
</p>

<p>
	تطبيق <a href="http://sparkleshare.org/" rel="external nofollow">Sparkleshare</a> يستخدم جيت كأساس لواجهة مشاركة الملفات الخاصة كما هو الحال مع تطبيق Dropbox.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="100313" href="https://academy.hsoub.com/uploads/monthly_2022_05/0_sparkleshare_1.jpg.311876cffc0d9acca5bf7658c5c0618f.jpg" rel=""><img alt="0_sparkleshare_1.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="100313" data-unique="h0u59tlm6" src="https://academy.hsoub.com/uploads/monthly_2022_05/0_sparkleshare_1.jpg.311876cffc0d9acca5bf7658c5c0618f.jpg" style="width: 450px; height: auto;"></a>
</p>

<p>
	للمزيد من المعلومات راجع الصفحة الرسمية التالية <a href="https://git.wiki.kernel.org/index.php/InterfacesFrontendsAndTools#Graphical_Interfaces" rel="external nofollow">Git wiki</a> التي تعرض قائمة كاملة بمشاريع واجهة جيت الرسومية.
</p>

<h2>
	من يجب أن يستخدم جيت؟
</h2>

<p>
	السؤال الأفضل والأكثر دقة يجب أن يكون متى؟ ولماذا؟
</p>

<h2>
	متى يجب أن أستخدم جيت، وما الذي يجب أن أستخدمه من أجله؟
</h2>

<p>
	لتحقيق أفضل استفادة من جيت، عليك أن تفكر قليلًا خارج الصندوق فيما يتعلق بتنسيقات الملفات.
</p>

<p>
	أُنشِئ جيت في الأساس لإدارة الشيفرة المصدر التي تمثل عدة سطور نصية على شكل تعليمات برمجية، وهو لا يهتم و لا يعرف ماهية هذه الأسطر، فكل ما يهمه أنها نص (أسطر برمجية أو رواية أو مقالة..إلخ)، لذا فإن جيت يعد خيارًا رائعًا لإدارة الإصدارات وتتبعها مهما كان نوعها طالما أنها نصية.
</p>

<p>
	لكن ما هو النص؟ عندما تقوم بكتابة شيءٍ ما من خلال استخدام أحد التطبيقات المكتبية مثل <a href="https://academy.hsoub.com/apps/productivity/liberoffice/%25D9%2585%25D9%2582%25D8%25AF%25D9%2585%25D8%25A9-%25D8%25A5%25D9%2584%25D9%2589-%25D8%25AD%25D8%25B2%25D9%2585%25D8%25A9-%25D8%25A3%25D8%25AF%25D9%2588%25D8%25A7%25D8%25AA-%25D8%25A7%25D9%2584%25D9%2585%25D9%2583%25D8%25AA%25D8%25A8-%25D8%25A7%25D9%2584%25D8%25AD%25D8%25B1-libreoffice-r1/" rel="">Libre Office</a>، فغالبًا قد لا تضع النص كما هو، أي ربما قد يكون النص الذي تكتبه موضوعاً ضمن ملفات XML، وربما أيضًا قمت بضغط ملفات XML مع بعضها البعض ضمن مجلد واحد من خلال أحد برامج الضغط مثل ZIP، وذلك لجمعها مع بعضها لتسهيل الرجوع إليها أو لضمان أن جميع الأشياء المهمة التي تريدها موجودة في ملف واحد عندما تريد إرسالها لشخص ما.
</p>

<p>
	إن أنواع الملفات التي نحفظ بها مشاريعنا والتي نعتقد أنها أنواع معقدة لحفظ البيانات مثل <a href="https://opensource.com/life/11/11/introduction-kdenlive" rel="external nofollow">Kdenlive</a>، أو SVG من <a href="http://inkscape.org/" rel="external nofollow">inkscape</a> هي في الواقع مكونة من ملفات XML، وتستطيع جيت إدارتها بسهولة.
</p>

<p>
	إذا كنت تستخدم "يونكس" Unix، فيمكنك معرفة مما يتكون منه الملف باستخدام الأمر file كما يلي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9289_42" style="">
<span class="pln">$ file </span><span class="pun">~</span><span class="str">/path/</span><span class="pln">to</span><span class="pun">/</span><span class="pln">my</span><span class="pun">-</span><span class="pln">file</span><span class="pun">.</span><span class="pln">blah

my</span><span class="pun">-</span><span class="pln">file</span><span class="pun">.</span><span class="pln">blah</span><span class="pun">:</span><span class="pln"> ASCII text

$ file </span><span class="pun">~</span><span class="str">/path/</span><span class="pln">to</span><span class="pun">/</span><span class="pln">different</span><span class="pun">-</span><span class="pln">file</span><span class="pun">.</span><span class="pln">kra</span><span class="pun">:</span><span class="pln"> </span><span class="typ">Zip</span><span class="pln"> data </span><span class="pun">(</span><span class="pln">MIME type </span><span class="str">"application/x-krita"</span><span class="pun">)</span></pre>

<p>
	وإذا أردت التأكد من ذلك، يمكنك عرض محتويات الملف باستخدام الأمر head كما يلي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9289_44" style="">
<span class="pln">$ head </span><span class="pun">~</span><span class="str">/path/</span><span class="pln">to</span><span class="pun">/</span><span class="pln">my</span><span class="pun">-</span><span class="pln">file</span><span class="pun">.</span><span class="pln">blah</span></pre>

<p>
	إذا رأيت ملفًا يحتوي نصًا يمكن قراءته ببساطة فهو غالبًا ملف نصي عادي، أما في حال رأيت أنه يحتوي على رموز كثيرة غير مفهومة وبعض المحارف النصية هنا وهناك فهو غالبًا ليس ملف نصي عادي وإنما نوع آخر من الملفات.
</p>

<p>
	لكيلا تكون عرضةً للخطأ، جيت يمكنه إدارة تنسيقات الملفات الأخرى، لكنه يعاملهم وكأنهم "كائنات ببيانات ثنائية" blobs. الاختلاف أنه في حالة الملفات النصية يمكن أن تكون لقطتين snapshots (أو "إيداعين" commits كما نسميها) مختلفتين بسطر أو ثلاث أسطر، أما إذا كان لديك ملف يمثل صورة وتم تعديلها ضمن لقطتين مختلفتين، فلن يتمكن Git أن يعبر عن هذا التغيير، وذلك لأن الصور مختلفة عن النص، فتعديل الصور ليس أمراً سهلاً كما في النص، على سبيل المثال في النص التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9289_46" style="">
<span class="str">"&lt;sky&gt;ugly greenish-blue&lt;/sky&gt;"</span></pre>

<p>
	فإن تعديله إلى:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9289_48" style="">
<span class="str">"&lt;sky&gt;blue-with-fluffy-clouds&lt;/sky&gt;"</span></pre>

<p>
	يمثل أمرًا بسيطًا، لكن إجراء التعديلات على الصور هو أمر أكثر تعقيدًا من مجرد إضافة وحذف كما في حالة مع النص.
</p>

<p>
	غالباً ما نقوم برفع الكائنات التي تمثل بيانات ثنائية مثل أيقونات PNG وجداول البيانات والمخططات الانسيابية إلى Git، لذا يمكنك أنت أيضًا رفع هكذا تنسيقات في حال كنت تعمل على جيت إلا في حال كانت هذه الملفات ضخمة، فلن تتمكن من رفعها.
</p>

<p>
	في حال كنت تعمل على مشروع يتضمن ملفات نصية وكائنات تمثل بيانات ثنائية حجمها كبير (كما في حالة ألعاب الفيديو التي تحتوي شيفرات مصدرية متساوية لكل من البيانات الرسومية والصوتية)، فهنا بإمكانك القيام بأحد الأمرين التاليين: إما ابتكار حل خاص بك، على سبيل المثال استخدام المؤشرات على محرك أقراص شبكة مشترك، أو استخدام أدوات إضافية مثل أداة جوي هيس الممتازة <a href="https://git-annex.branchable.com/" rel="external nofollow">git annex</a>، أو مشروع <a href="https://github.com/alebedev/git-media" rel="external nofollow">Git-Media</a>.
</p>

<p>
	كما تلاحظ فإن جيت هي أداة يمكن للجميع استخدامها، وهي طريقة رائعة لإدارة إصدارات ملفاتك، وهي أداة قوية وليست مخيفة كما تبدو للوهلة الأولى.
</p>

<p>
	ترجمة -وبتصرف- للمقال <a href="https://opensource.com/resources/what-is-git" rel="external nofollow">?What is Git</a> لصاحبه Seth Kenlon.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
<li>
		<a href="https://academy.hsoub.com/programming/workflow/git/%D9%85%D8%A8%D8%A7%D8%AF%D8%A6-git-%D8%A7%D9%84%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A9-r256/" rel="">مبادئ Git الأساسية</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/workflow/git/%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-git-%D9%84%D9%84%D9%85%D8%B1%D8%A9-%D8%A7%D9%84%D8%A3%D9%88%D9%84%D9%89-r260/" rel="">إعداد Git للمرة الأولى</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/workflow/git/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D9%86%D8%B8%D8%A7%D9%85-%D8%A7%D9%84%D8%AA%D8%AD%D9%83%D9%85-%D9%81%D9%8A-%D8%A7%D9%84%D9%86%D8%B3%D8%AE-git-r240/" rel="">مدخل إلى نظام التحكم في النسخ Git</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">1592</guid><pubDate>Wed, 15 Jun 2022 15:06:00 +0000</pubDate></item><item><title>&#x627;&#x644;&#x625;&#x634;&#x631;&#x627;&#x641; &#x639;&#x644;&#x649; &#x645;&#x634;&#x627;&#x631;&#x64A;&#x639; &#x627;&#x644;&#x628;&#x631;&#x645;&#x62C;&#x64A;&#x627;&#x62A; &#x645;&#x641;&#x62A;&#x648;&#x62D;&#x629; &#x627;&#x644;&#x645;&#x635;&#x62F;&#x631; &#x639;&#x628;&#x631; &#x63A;&#x64A;&#x62A; &#x647;&#x628; GitHub</title><link>https://academy.hsoub.com/programming/workflow/git/%D8%A7%D9%84%D8%A5%D8%B4%D8%B1%D8%A7%D9%81-%D8%B9%D9%84%D9%89-%D9%85%D8%B4%D8%A7%D8%B1%D9%8A%D8%B9-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A7%D8%AA-%D9%85%D9%81%D8%AA%D9%88%D8%AD%D8%A9-%D8%A7%D9%84%D9%85%D8%B5%D8%AF%D8%B1-%D8%B9%D8%A8%D8%B1-%D8%BA%D9%8A%D8%AA-%D9%87%D8%A8-github-r1585/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2022_05/6291f6bd39539_-------GitHub.png.cdf7d0d76df0a309a9ee68b1e802f5f8.png" /></p>

<p>
	عندما تشرف maintain على مستودع برنامجٍ <a href="https://academy.hsoub.com/programming/general/%D9%85%D8%A7-%D8%A7%D9%84%D9%85%D9%82%D8%B5%D9%88%D8%AF-%D8%A8%D9%85%D8%B5%D8%B7%D9%84%D8%AD-%D9%85%D9%81%D8%AA%D9%88%D8%AD-%D8%A7%D9%84%D9%85%D8%B5%D8%AF%D8%B1-open-source%D8%9F-r885/" rel="">مفتوح المصدر</a>، فإنك تتولى دورًا قياديًا، سواءً كنت مؤسِّس المشروع الذي أطلقه وأتاحه للاستخدام والمساهمات، أو كنت تعمل ضمن فريق وتشرف على جانبٍ محددٍ من المشروع، فأنت تقدم خدمةً مهمةً لمجتمع المطورين العام.
</p>

<p>
	على الرغم من أن مساهمات مجتمع المطورين مفتوحة المصدر التي تجري من خلال <a href="https://academy.hsoub.com/programming/workflow/git/%D8%A5%D8%B9%D8%A7%D8%AF%D8%A9-%D8%AA%D8%A3%D8%B3%D9%8A%D8%B3-%D8%AA%D9%81%D8%B1%D9%8A%D8%B9%D8%A7%D8%AA-%D8%B7%D9%84%D8%A8-%D8%A7%D9%84%D8%B3%D8%AD%D8%A8-%D9%88%D8%AA%D8%AD%D8%AF%D9%8A%D8%AB%D9%87-%D9%81%D9%8A-git-r1584/" rel="">طلبات السحب</a> ضروريةٌ لضمان تحقيق البرنامج الفائدة القصوى للمستخدمين النهائيين، لكن يوجد للمشرفين تأثيرٌ حقيقي على صياغة مجمَل المشروع؛ إذ يشارك المشرفون على المستودعات لدرجة هائلة في المشاريع مفتوحة المصدر التي يديرونها، من التنظيم والتطوير اليومي إلى التفاعل مع الجمهور وتقديم ملاحظاتٍ فوريةٍ وفعالةٍ للمساهمين.
</p>

<p>
	سيتناول هذا الدليل بعض النصائح حول الإشراف على المستودعات العامة للبرامج مفتوحة المصدر، إذ يترافق كونك قائدًا لمشروعٍ مفتوح المصدر مع مسؤولياتٍ تقنية وغير تقنية للمساهمة في تعزيز قاعدة المستخدمين والدائرة المجتمعية حول مشروعك. إن تولي دور المشرف هو فرصة للتعلُّم من الآخرين، واكتساب الخبرة في إدارة المشاريع، ومراقبة نمو مشروعك وتغيره عندما يصبح المستخدمون مساهمين مستثمرين.
</p>

<h2>
	كتابة توثيق مفيد
</h2>

<p>
	يساهم التوثيق Documentation الشامل وحسن التنظيم الذي يخدم الفئات المستهدفة في مشروعك على توسيع قاعدة مستخدميه، وستصبح قاعدة المستخدمين هذه مع مرور الوقت هي <a href="https://academy.hsoub.com/programming/workflow/git/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%A7%D9%84%D9%85%D8%B3%D8%A7%D9%87%D9%85%D8%A9-%D9%81%D9%8A-%D8%A7%D9%84%D9%85%D8%B4%D8%A7%D8%B1%D9%8A%D8%B9-%D9%85%D9%81%D8%AA%D9%88%D8%AD%D8%A9-%D8%A7%D9%84%D9%85%D8%B5%D8%AF%D8%B1-%D8%A7%D8%A8%D8%AF%D8%A3-%D8%A8%D8%AA%D8%B9%D9%84%D9%85-%D9%86%D8%B8%D8%A7%D9%85-git-r1580/" rel="">المساهمة في مشروعك مفتوح المصدر</a>.
</p>

<p>
	قد يفيدك جعل كتابة التوثيق جزءًا من عملية التطوير الخاصة بك، لأنك ستفكر في الشيفرة البرمجية التي تكتبها على أية حال، وربما تدِّون ملاحظاتٍ عنها، فتستغل بذلك أن الأفكار حديثة في ذهنك؛ وربما ترغب في كتابة التوثيق قبل الشيفرة البرمجية، فتكون بذلك متبعًا لفلسفة نهج التطوير المستند على التوثيق، إذ يوثق هذا النهج خصائص البرنامج أولًا ثم يبرمجها بعد كتابة وظيفة كلٍ منها.
</p>

<p>
	إليك بعض ملفات التوثيق التي يجب الاحتفاظ بها في مجلد المستوى الأعلى top-level directory الخاص بك، إلى جانب ملف شيفرتك البرمجية:
</p>

<ul>
<li>
		ملف README.md، الذي يقدم ملخصًا عن المشروع وأهدافك منه.
	</li>
	<li>
		ملف CONTRIBUTING.md، الذي يحتوي على تعليمات المساهمة.
	</li>
	<li>
		ترخيص برنامجك، والذي يمكن أن يشجع الأشخاص على تقديم مساهماتٍ أكثر. ويمكنك قراءة المزيد حول <a href="http://choosealicense.com" rel="external nofollow">اختيار ترخيص لبرنامجٍ مفتوح المصدر</a>.
	</li>
</ul>
<p>
	يوجد للتوثيق عدّة صيغٍ، ويمكن أن يُوجَّه لجماهير مختلفة، إذ يمكنك اختيار نوعٍ واحد أو أكثر من الأنواع التالية على أنه جزءٌ من توثيقك بناءً على مجال عملك:
</p>

<ul>
<li>
		<strong>دليل عام general guide</strong>: لتعريف المستخدمين بالمشروع.
	</li>
	<li>
		<strong>دروس تعليمية Tutorials</strong>: لشرح حالات الاستخدام المختلفة.
	</li>
	<li>
		<strong>الأسئلة الشائعة FAQs</strong>: للإجابة على أكثر الأسئلة التي يطرحها المستخدمون.
	</li>
	<li>
		<strong>أدلة اكتشاف الأخطاء وتصحيحها Troubleshooting guides</strong>: لمساعدة المستخدمين على حل المشاكل.
	</li>
	<li>
		<strong>مرجع للواجهة البرمجية <abbr title="Application Programming Interface | واجهة برمجية">API</abbr> reference</strong>: الذي يوفر للمستخدمين طريقةً سريعةً للعثور على معلومات <a href="https://academy.hsoub.com/programming/general/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%A7%D9%84%D9%88%D8%A7%D8%AC%D9%87%D8%A7%D8%AA-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A9-api-r1314/" rel="">الواجهة البرمجية <abbr title="Application Programming Interface | واجهة برمجية">API</abbr></a>.
	</li>
	<li>
		<strong>ملاحظات الإصدار Release notes</strong>: إضافةً إلى <a href="https://academy.hsoub.com/programming/general/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%A7%D9%84%D8%AA%D8%B9%D8%A7%D9%85%D9%84-%D9%85%D8%B9-%D8%A7%D9%84%D8%A3%D8%AE%D8%B7%D8%A7%D8%A1-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A9-r1342/" rel="">الأخطاء البرمجية</a> bugs المعروفة وذلك لإعلام المستخدمين ماذا يتوقعون في كل إصدار.
	</li>
	<li>
		<strong>الخصائص المخطط لها Planned features</strong>: لمتابعتها وشرح الخصائص المُخطط إضافتها لاحقًا.
	</li>
	<li>
		<strong>مقاطع فيديو توجيهية Video walkthroughs</strong>: لتزويد المستخدمين بنهج وسائط متعددة لاستخدام برنامجك.
	</li>
</ul>
<p>
	قد تلائم أنواعٌ معينة من التوثيق مشروعك أكثر من غيرها، ولكن سيساعد تقديم أكثر من نهجٍ واحدٍ في البرنامج قاعدة المستخدمين لديك على فهم آلية التفاعل مع عملك بصورةٍ أفضل.
</p>

<p>
	عند كتابة التوثيق أو تسجيل مقطع صوت أو فيديو، يجب أن تكون واضحًا قدر الإمكان، إذ يُستحسن ألا تضع افتراضاتٍ حول إمكانيات جمهورك التقنية، وعليك أيضًا التعامل مع التوثيق من القشرة إلى اللب، أي شرح وظائف برنامجك بصورةٍ عامة، مثل أتمتة مهام الخادم وإنشاء موقع إلكتروني وتحريك العفاريت لتطوير لعبة، قبل الخوض في التفاصيل.
</p>

<p>
	أصبحت اللغة الإنجليزية لغةً عالميةً في مجال التكنولوجيا، ومع ذلك عليك دراسة هوية المستخدمين المستهدفين وكيفية الوصول إليهم؛ إذ قد تكون اللغة الإنجليزية هي الخيار الأفضل للتواصل مع قاعدة مستخدمين واسعة، لكن عليك أن تُبقي في ذهنك أن توثيقك سيكون مُوجَّهًا للعديد من الأشخاص الذين لا تكون اللغة الإنجليزية لغتهم الأم، لذا اعمل على تفضيل لغةٍ يسهل الوصول إليها ولا تربك القراء أو المشاهدين.
</p>

<p>
	حاول كتابة التوثيقات كما لو كانت موجهةً إلى أحد المساهمين الذين يحتاجون إلى الاطلاع على المشروع الحالي بسرعة؛ ففي النهاية، سترغب في تشجيع المساهمين المحتملين على تقديم طلبات سحب لمشروعك.
</p>

<h2>
	تنظيم المشاكل
</h2>

<p>
	تُعد <strong>المشاكل issues</strong> عادةً طريقةً لمتابعة الزلات البرمجية أو الإبلاغ عنها، أو لطلب خصائص جديدة لإضافتها إلى الشيفرة البرمجية الرئيسية، إذ تقدم خدمات استضافة المستودعات مفتوحة المصدر، مثل غيت هَب وغيت لاب GitLab و<a href="https://academy.hsoub.com/apps/productivity/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%AA%D8%B7%D8%A8%D9%8A%D9%82-bitbucket-r456/" rel="">بيت بَكيت Bitbucket</a> واجهةً لك وللآخرين لمتابعة المشاكل ضمن مستودعك.
</p>

<p>
	عند إصدار شيفرة برمجية مفتوحة المصدر للعامة، يجب أن تتوقع ظهور مشاكل يفتحها مجتمع المستخدمين، لذلك يمنحك تنظيم المشاكل وترتيب أولويتها دليلًا تفصيليًا جيدًا للعمل اللاحق في مشروعك.
</p>

<p>
	يستطيع كل مستخدم تقديم قضية، وبالتالي لن تكون كل المشاكل إبلاغًا عن أخطاء برمجية أو طلبات لإضافة خصائص، فقد تتلقى مثلًا أسئلةً عبر أداة تتبع المشاكل، أو طلباتٍ لتحسينات صغيرة على <a href="https://academy.hsoub.com/design/user-interface/%D8%A7%D9%84%D8%AF%D9%84%D9%8A%D9%84-%D8%A5%D9%84%D9%89-%D8%AA%D9%87%D9%8A%D8%A6%D8%A9-%D9%88%D8%A7%D8%AC%D9%87%D8%A9-%D8%A7%D9%84%D9%85%D8%B3%D8%AA%D8%AE%D8%AF%D9%85-ui-r652/" rel="">واجهة المستخدم</a>، لذلك يُستحسن تنظيم هذه المشاكل قدر الإمكان والتواصل مع المستخدمين الذين يقدمون هذه المشاكل.
</p>

<p>
	ينبغي أن تمثّل المشاكل مهامًا محددة تحتاج تنفيذها على الشيفرة البرمجية المصدرية، وعليك ترتيبها حسب أولويتها وفقًا لذلك؛ كما لا بُدّ من التفاهم مع فريقك على مقدار الوقت  والطاقة الذي ستكرسه أنت أو المساهمون لتطبيق المشاكل المقدَّمة، ويمكنكم التعاون معًا في اتخاذ القرارات ووضع خطة قابلة للتنفيذ؛ وعندما تعلم أنك لن تتمكن من تناول قضيةٍ معينة خلال إطارٍ زمني عاجل، علِّق على القضية لإعلام المستخدم بأنك قد اطلعت عليها وأنك ستتطرق إليها عندما تستطيع، وإذا استطعت يمكنك تزويده بالجدول الزمني المتوقع الذي يتضمن الوقت الذي سيُتاح لك فيه مراجعة القضية مجددًا.
</p>

<p>
	بالنسبة إلى المشاكل التي تتضمن طلبات خصائص أو تحسينات، يمكنك أن تسأل الشخص الذي قدَّم القضية عما إذا كان قادرًا على المساهمة في الشيفرة البرمجية بنفسه، ويمكنك توجيهه إلى الملف "CONTRIBUTORS.md" وأي توثيقٍ آخر ذي صلة.
</p>

<p>
	لا تمثِّل الأسئلة غالبًا مهامًا محددةً، لذلك يُعد تعليقك على القضية بتوجيه المستخدم بلطف إلى التوثيق المرتبط بسؤاله خيارًا جيدًا للمحافظة على أسلوب تواصلك احترافيًا ولطيفًا؛ وإذا لم يكن التوثيق المتعلق بهذا السؤال موجودًا، فهذا الوقت المناسب لإضافة توثيقٍ ذي صلة به والتعبير عن امتنانك للمستخدم لتنبيهك على إغفالك لهذا الجزء؛ وإذا كنت تتلقى كثيرًا من الأسئلة عبر المشاكل، ينصح أن تفكر في إنشاء قسم الأسئلة الشائعة بين ملفات توثيقك، أو ملف <a href="https://wiki.hsoub.com/%D8%A7%D9%84%D8%B5%D9%81%D8%AD%D8%A9_%D8%A7%D9%84%D8%B1%D8%A6%D9%8A%D8%B3%D9%8A%D8%A9" rel="external">توثيق ويكي wiki</a>، أو منتدى ليشارك فيه الآخرون في الإجابة على الأسئلة.
</p>

<p>
	عندما يقدم المستخدم قضيةً، حاول أن تكون لطيفًا وحليمًا قدر الإمكان، فالمشكلات هي مؤشرات على إعجاب المستخدمين ببرنامجك ويريدون تحسينه.
</p>

<p>
	يجعل تنظيم المشاكل قدر الإمكان مشروعك محدثًا باستمرار وعلى صلةٍ بمجتمع المستخدمين، لذلك احذف المشاكل التي تكون خارج مجال مشروعك أو التي أصبحت قديمة، وحدِّد أولوية المشاكل الأخرى حتى تتمكن من تحقيق تقدُّمٍ متواصل.
</p>

<h2>
	أتمتة المهام
</h2>

<p>
	يمكنك تحسين فعالية وجودة مشروعك عن طريق أتمتة مهام الصيانة والاختبار، إذ يمكن للصيانة والاختبار المؤتمتَين التحقُّق باستمرار من دقة شيفرتك البرمجية وتوفر عمليةٍ رسميةٍ أكثر للموافقة على عمليات تقديم المساهمين، ويساعد هذا في توفير الوقت حتى تتمكن من التركيز على الجوانب الأهم في مشروعك، ولعل الجانب الإيجابي في توفُّر كثيرٍ من الأدوات المُطوّرة فعلًا لذلك قد يلبي احتياجات مشروعك.
</p>

<ul>
<li>
		<p>
			أعِدَّ الاختبار المؤتمت للمساهمات الواردة من خلال <a href="https://docs.github.com/en/github/administering-a-repository/defining-the-mergeability-of-pull-requests/about-protected-branche" rel="external nofollow">فرض عمليات تحقق من الحالة</a>، واحرص على إضافة معلوماتٍ حول آلية عمل الاختبار لمشروعك إلى ملف "CONTRIBUTORS.md".
		</p>
	</li>
	<li>
		<p>
			تحقق من <a href="https://github.com/collections/tools-for-open-source" rel="external nofollow">الأدوات المُطوَّرة لأتمتة مهام الصيانة</a>، إذ تقدِّم لك هذه الأدوات خياراتٍ متنوعة، مثل أتمتة الإصدارات الخاصة بك ومراجعة الشيفرة البرمجية، أو إغلاق المشاكل إذا لم يستجب كاتبها عند طلب معلوماتٍ منه.
		</p>
	</li>
</ul>
<p>
	أبقِ في ذهنك أن كل زائدٍ ناقص، واحرص على أن تكون العمليات والمهام التي تختار أتمتتها مدروسةً وبطرائقٍ تُحسِّن كفاءة وإنتاجية وجودة عملك ومشروعك والمساهمين فيه.
</p>

<h2>
	اجعل المساهمة مجزية
</h2>

<p>
	كلما رحبت بالمساهمين في مشروعك وكافأت جهودهم، زادت احتمالية تشجيع تلقي مساهماتٍ أكثر. ولمساعدة الأشخاص على البدء، عليك أن تضع ملف "CONTRIBUTORS.md" في أعلى مستوى top-level من المستودع الخاص بك، ومؤشرٌ على مكان هذا الملف في ملف "README.md".
</p>

<p>
	ستحدّد سمات ملف المساهمة النافع طريقة بدء المطور في العمل على المشروع، وتقديم دليلٍ مفصَّل أو قائمة تحقق يتّبعها المطورون، تشرح كيف ينجحون في دمج شيفرتهم البرمجية في المشروع من خلال طلب السحب.
</p>

<p>
	لاتنسَ بعد إضافة توثيقٍ حول طريقة المساهمة في المشروع، أن تحافظ على تناسق كامل شيفرتك البرمجية وقابليتها للقراءة، إذ ستسهم الشيفرة البرمجية التي يسهل فهمها من خلال إضافة تعليقاتٍ إليها واستخدامها الواضح والمتناسق إسهامًا كبيرًا في منح المساهمين الإحساس بأنهم يستطيعون المشاركة في المشروع.
</p>

<p>
	وختامًا، أبقِ قائمةً بالمساهمين والكتاب لديك، كما يمكنك أن تدعو المساهمين إلى إضافة أنفسهم إلى هذه القائمة مهما كانت مساهماتهم (حتى تصحيح الأخطاء الإملائية يُعَد مساهمةً مهمةً، وقد تقود إلى مساهمات أكبر لاحقًا). يتيح هذا الأسلوب إبراز المساهمين وعملهم على المشروع للجميع بحيث يستطيعون الإشارة إليه، وجعل الجميع يعي قدر المعاملة الحسنة التي يتلقاها المساهمون.
</p>

<h2>
	بناء مجتمعك
</h2>

<p>
	يعني تمكينك للمستخدمين من خلال إضافتك للتوثيق، وتجاوبك مع المشاكل، وتشجيع المستخدمين على المشاركة، أنك تسير على الطريق الصحيح نحو بناء مجتمعٍ حول مشروعك مفتوح المصدر، إذ سيروِّج المستخدمون الذين تحرص على إسعادهم وتعاملهم على أنهم مساهمون لبرنامجك بدورهم.
</p>

<p>
	إضافةً إلى ما سبق، يمكنك العمل على الترويج لمشروعك بعدة أساليب:
</p>

<ul>
<li>
		التدوين Blogging.
	</li>
	<li>
		إصدار مقاطع فيديو للمراجعة walkthrough أو متضمنةً لمحةً عامةً عن المشروع.
	</li>
	<li>
		حفظ قائمة بحسابات بريد إلكتروني.
	</li>
	<li>
		كن نشطًا على قنوات <a href="https://academy.hsoub.com/marketing/social-media/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D9%88%D8%B3%D8%A7%D8%A6%D9%84-%D8%A7%D9%84%D8%AA%D9%88%D8%A7%D8%B5%D9%84-%D8%A7%D9%84%D8%A7%D8%AC%D8%AA%D9%85%D8%A7%D8%B9%D9%8A-%D9%88%D8%A2%D9%84%D9%8A%D8%A9-%D8%B9%D9%85%D9%84%D9%87%D8%A7-r526/" rel="">وسائل التواصل الاجتماعي</a>.
	</li>
	<li>
		التعاون مع مطوري مشاريع مشابهة لمشروعك أو مرتبطةً به وتحقيق الترويج المتبادل بينهما.
	</li>
</ul>
<p>
	عليك تصميم أسلوبك الترويجي وفقًا لمجال مشروعك وعدد أعضاء الفريق والمساهمين النشطين الذين يعملون معك؛ وكلما توسع مجتمعك، يمكنك توفير مساحات أكبر يتفاعل ضمنها المساهمون والمستخدمون والمشرفون. إليك بعض الخيارات التي قد تنظر في تطبيقها:
</p>

<ul>
<li>
		ملفات توثيق ويكي، التي تقدم توثيقًا يُحفَظ في متناول المجتمع.
	</li>
	<li>
		منتديات لمناقشة الخصائص المحتمَلة والإجابة على الأسئلة.
	</li>
	<li>
		خادم قوائم بريدية للمشاركة المجتمعية المعتمدة على البريد الإلكتروني.
	</li>
</ul>
<p>
	ادرس قاعدة المستخدمين الأساسية لديك ومجال مشروعك (وهذا يشمل عدد الأشخاص الذين يعملون على الإشراف على المشروع والموارد المتاحة لديك) قبل نشر هذه المساحات المحتمَلة؛ واِسعَ للحصول على آراء مجتمعك حول ما يناسبهم؛ وقبل كل شيء، لا بد أن تكون لطيفًا وأن تُظهر بعض المودة في جميع تفاعلاتك مع مجتمعك. قد يصعب أن تتسم بالحلم عندما تؤدي دور المشرف، لكن ذلك سيؤتي ثماره على مشروعك في المستقبل.
</p>

<h2>
	الخاتمة
</h2>

<p>
	يؤدي المشرفون على المستودعات دورًا بالغ الأهمية ضمن المجتمع مفتوح المصدر العام، وعلى الرغم أن ذلك يتطلب استثمارًا ضخمًا وعملًا شاقًا، إلا أنه يكون غالبًا تجربةً مجزيةً تتيح لك النمو بصفتك مطورًا ومساهمًا، كما يمكن أن يساهم تأديتك لدور المشرف بودٍ ولطف مساهمةً كبيرةً في تطوير المشروع الذي تهتم به.
</p>

<p>
	ترجمة -وبتصرف- للمقال <a href="https://www.digitalocean.com/community/tutorials/how-to-maintain-open-source-software-projects" rel="external nofollow">How To Maintain Open-Source Software Projects</a> لصاحبته Lisa Tagliaferri
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
<li>
		<a href="https://academy.hsoub.com/devops/general/%D8%A7%D9%84%D9%81%D8%B1%D9%82-%D8%A8%D9%8A%D9%86-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A7%D8%AA-%D8%A7%D9%84%D8%AD%D8%B1%D8%A9-%D9%88%D9%85%D9%81%D8%AA%D9%88%D8%AD%D8%A9-%D8%A7%D9%84%D9%85%D8%B5%D8%AF%D8%B1-r590/" rel="">الفرق بين البرمجيات الحرة ومفتوحة المصدر</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/marketing/performance-marketing/%D8%B7%D8%B1%D9%82-%D8%A7%D9%84%D8%AA%D8%B9%D8%B1%D9%8A%D9%81-%D8%A8%D9%85%D8%B4%D8%B1%D9%88%D8%B9%D9%83-%D9%85%D9%81%D8%AA%D9%88%D8%AD-%D8%A7%D9%84%D9%85%D8%B5%D8%AF%D8%B1-r165/" rel="">طرق التعريف بمشروعك مفتوح المصدر</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/devops/general/%D8%B5%D9%8A%D8%A7%D9%86%D8%A9-%D8%A7%D9%84%D9%85%D8%B4%D8%A7%D8%B1%D9%8A%D8%B9-%D9%85%D9%81%D8%AA%D9%88%D8%AD%D8%A9-%D8%A7%D9%84%D9%85%D8%B5%D8%AF%D8%B1-r359/" rel="">صيانة المشاريع مفتوحة المصدر</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/workflow/git/%D9%83%D9%8A%D9%81-%D8%AA%D8%B3%D8%A7%D9%87%D9%85-%D9%81%D9%8A-%D9%85%D8%B4%D8%A7%D8%B1%D9%8A%D8%B9-%D9%85%D9%81%D8%AA%D9%88%D8%AD%D8%A9-%D8%A7%D9%84%D9%85%D8%B5%D8%AF%D8%B1-%D8%B9%D9%84%D9%89-github-r265/" rel="">كيف تساهم في مشاريع مفتوحة المصدر على Github</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">1585</guid><pubDate>Sat, 28 May 2022 12:07:36 +0000</pubDate></item><item><title>&#x625;&#x639;&#x627;&#x62F;&#x629; &#x62A;&#x623;&#x633;&#x64A;&#x633; &#x62A;&#x641;&#x631;&#x64A;&#x639;&#x627;&#x62A; &#x637;&#x644;&#x628; &#x627;&#x644;&#x633;&#x62D;&#x628; &#x648;&#x62A;&#x62D;&#x62F;&#x64A;&#x62B;&#x647; &#x641;&#x64A; git</title><link>https://academy.hsoub.com/programming/workflow/git/%D8%A5%D8%B9%D8%A7%D8%AF%D8%A9-%D8%AA%D8%A3%D8%B3%D9%8A%D8%B3-%D8%AA%D9%81%D8%B1%D9%8A%D8%B9%D8%A7%D8%AA-%D8%B7%D9%84%D8%A8-%D8%A7%D9%84%D8%B3%D8%AD%D8%A8-%D9%88%D8%AA%D8%AD%D8%AF%D9%8A%D8%AB%D9%87-%D9%81%D9%8A-git-r1584/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2022_05/6291efa569f96_----.png.129b152343ca037be25fda3faa3237cb.png" /></p>

<p>
	تُعد مساهمتك في المشاريع مفتوحة المصدر تجربةً مجزيةً، إذ تتمثل في سعيك لتحسين <a href="https://academy.hsoub.com/design/user-experience/%d9%85%d8%af%d8%ae%d9%84-%d8%a5%d9%84%d9%89-%d8%aa%d8%ac%d8%b1%d8%a8%d8%a9-%d8%a7%d9%84%d9%85%d8%b3%d8%aa%d8%ae%d8%af%d9%85-user-experience-r149/" rel="">تجربة المستخدمين</a> النهائيين أمثالك في استخدام البرامج؛ فعندما تقدم طلب سحب pull request، ستتطلب عملية المساهمة في مشروعٍ ما بعضًا من إعادة تأسيس تفريعات rebase الشيفرة البرمجية وإعادة صياغتها قبل قبولها، متبوعةً بعملية تنظيفٍ عامة لفروعك.
</p>

<p>
	سيدلك هذا الدرس التعليمي على بعض الخطوات التي تلي تقديمك <a href="https://academy.hsoub.com/programming/workflow/git/%D8%A5%D9%86%D8%B4%D8%A7%D8%A1-%D8%B7%D9%84%D8%A8-%D8%A5%D8%B6%D8%A7%D9%81%D8%A9-%D8%B9%D9%84%D9%89-%D8%BA%D9%8A%D8%AA-%D9%87%D8%A8-github-r1581/" rel="">طلب سحب</a> إلى مشروع برنامجٍ <a href="https://academy.hsoub.com/programming/general/%D9%85%D8%A7-%D8%A7%D9%84%D9%85%D9%82%D8%B5%D9%88%D8%AF-%D8%A8%D9%85%D8%B5%D8%B7%D9%84%D8%AD-%D9%85%D9%81%D8%AA%D9%88%D8%AD-%D8%A7%D9%84%D9%85%D8%B5%D8%AF%D8%B1-open-source%D8%9F-r885/" rel="">مفتوح المصدر</a>.
</p>

<h2>
	المتطلبات الأساسية
</h2>

<p>
	بما أن هذا الدرس التعليمي سيدلك على بعض الخطوات التي ستتخذها بعد تقديمك طلب السحب، فهذ يعني أن <a href="https://academy.hsoub.com/programming/workflow/git/%D9%85%D8%A8%D8%A7%D8%AF%D8%A6-git-%D8%A7%D9%84%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A9-r256/" rel="">نظام غيت Git</a> سيكون مثبتًا لديك مسبقًا، وأنك إما أنشأت طلب سحب أو تفكر في إنشائه.
</p>

<p>
	ألغى موقع غيت هَب GitHub الاستيثاق Authentication من خلال كلمة المرور في شهر تشرين الثاني من عام 2020. لذلك، حتى تتمكن من الوصول إلى مستودعات repositories موقع غيت هَب من خلال سطر الأوامر، فعليك إنشاء <a href="https://docs.github.com/en/github/authenticating-to-github/keeping-your-account-and-data-secure/creating-a-personal-access-token" rel="external nofollow">مفتاح الوصول الشخصي Personal Access Token</a> -أو اختصارًا PAT-، أو إضافة <a href="https://docs.github.com/en/github/authenticating-to-github/connecting-to-github-with-ssh/adding-a-new-ssh-key-to-your-github-account" rel="external nofollow">معلومات مفتاح <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr> العام public <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr> key</a>.
</p>

<p>
	لتتعلم أكثر عن المساهمة في المشاريع مفتوحة المصدر اقرأ هذه <a href="https://academy.hsoub.com/programming/workflow/git/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%A7%D9%84%D9%85%D8%B3%D8%A7%D9%87%D9%85%D8%A9-%D9%81%D9%8A-%D8%A7%D9%84%D9%85%D8%B4%D8%A7%D8%B1%D9%8A%D8%B9-%D9%85%D9%81%D8%AA%D9%88%D8%AD%D8%A9-%D8%A7%D9%84%D9%85%D8%B5%D8%AF%D8%B1-%D8%A7%D8%A8%D8%AF%D8%A3-%D8%A8%D8%AA%D8%B9%D9%84%D9%85-%D9%86%D8%B8%D8%A7%D9%85-git-r1580/" rel="">المقدمة</a>، ولتعلُّم كيفية إنشاء طلبات سحب، اقرأ المقالة <a href="https://academy.hsoub.com/programming/workflow/git/%D8%A5%D9%86%D8%B4%D8%A7%D8%A1-%D8%B7%D9%84%D8%A8-%D8%A5%D8%B6%D8%A7%D9%81%D8%A9-%D8%B9%D9%84%D9%89-%D8%BA%D9%8A%D8%AA-%D9%87%D8%A8-github-r1581/" rel="">إنشاء طلب سحب على Github</a>.
</p>

<h2>
	إعادة تأسيس الشيفرة البرمجية وتنظيف التعليقات
</h2>

<p>
	عندما تساهم في البرامج مفتوحة المصدر، قد تجد بعض التعارضات conflicts بين فروعك أو طلب السحب الذي قدمته، وبين الشيفرة البرمجية الأولية upstream. وقد ترد رسالة خطأ على الصدفة shell لديك كما في المثال التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4158_11" style="">
<span class="pln">CONFLICT </span><span class="pun">(</span><span class="pln">content</span><span class="pun">):</span><span class="pln"> </span><span class="typ">Merge</span><span class="pln"> conflict in your</span><span class="pun">-</span><span class="pln">file</span><span class="pun">.</span><span class="pln">py
</span><span class="typ">Automatic</span><span class="pln"> merge failed</span><span class="pun">;</span><span class="pln"> fix conflicts and then commit the result</span><span class="pun">.</span></pre>

<p>
	أو كما في الصورة التالية عندما تقدم طلب سحب على موقع غيت هَب:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="100039" href="https://academy.hsoub.com/uploads/monthly_2022_05/01conflicts.png.a21d04d39980bd8fab1c31fa1281349e.png" rel=""><img alt="01conflicts.png" class="ipsImage ipsImage_thumbnailed" data-fileid="100039" data-unique="9hacyiuig" src="https://academy.hsoub.com/uploads/monthly_2022_05/01conflicts.thumb.png.593f9357280300f29b8bf4c397910dba.png" style="width: 650px; height: auto;"></a>
</p>

<p style="text-align: center;">
	(تعارضات)
</p>

<p>
	يحدث هذا عندما يتأخر المشرفون maintainers في الإجابة على طلب السحب الذي قدمته، أو عندما يساهم الكثيرون في مشروعٍ ما بنفس الوقت، وعندما تواجه هذه المشكلة وأنت لا تزال ترغب في تقديم طلب السحب خاصتك، ستضطر إلى معالجة هذه التعارضات وإعادة تأسيس rebase الشيفرة البرمجية التي تعمل عليها.
</p>

<p>
	تتيح لنا عملية <strong>إعادة تأسيس التفريعات</strong> نقل الفروع بتغيير الإيداع commit المبنية عليه، لنتمكن بهذه الطريقة من إعادة تأسيس شيفراتها البرمجية وجعلها مبنيةً على أحدث إيداعات الفرع الرئيسي main. لذلك، يجب أن تنفذ إعادة تأسيس التفريعات بدقة، وتحرص على تنفيذ كامل العملية في الإيداعات والفروع الصحيحة. وسنستعرض لاحقًا استخدام الأمر <code>git reflog</code>، في حال حدوث خطأ.
</p>

<p>
	سننتقل إلى مجلد الشيفرة البرمجية، تمامًا كما فعلنا في المقال السابق:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4158_14" style="">
<span class="pln">$ cd repository</span></pre>

<p>
	ومن ثم ينبغي عليك التأكُّد من أنك في الفرع الصحيح بالانتقال إليه من خلال استخدام الأمر <code>git checkout</code>:
</p>

<pre class="ipsCode">
$ git checkout new-branch
</pre>

<p>
	ثم نفذ الأمر <code>git fetch</code> للحصول على أحدث نسخةٍ أولية <a href="https://academy.hsoub.com/programming/general/%D8%A3%D8%B3%D9%84%D9%88%D8%A8-%D9%83%D8%AA%D8%A7%D8%A8%D8%A9-%D8%A7%D9%84%D8%B4%D9%8A%D9%81%D8%B1%D8%A7%D8%AA-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A9-%D9%88%D8%AA%D8%AD%D9%82%D9%8A%D9%82-%D8%B3%D9%87%D9%88%D9%84%D8%A9-%D9%82%D8%B1%D8%A7%D8%A1%D8%AA%D9%87%D8%A7-r1307/" rel="">للشيفرة البرمجية</a>:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4158_17" style="">
<span class="pln">$ git fetch origin</span></pre>

<p>
	بمجرد الحصول على النسخة الأولية للمشروع، يمكنك تنظيف clean up التعليقات لديك، إما بدمجها squashing، أو بإعادة صياغة رسائل الإيداع خاصتك لتسهيل فهمها على مشرفي المشروع، ولكن قد لا يكون هذا ضروريًا إذا لم تنشئ رسائل إيداع صغيرة كثيرة.
</p>

<p>
	لبدء هذه العملية، ستنفِذ عملية <strong>إعادة تأسيس التفريعات التفاعلية</strong> المُستخدمة لتعديل رسائل إيداع سابقة، أو جمع عدة رسائل إيداع في رسالة واحدة، أو حذف أو التراجع عن رسائل إيداع لم تَعُد ضرورية؛ ولتنفيذ ذلك، علينا أن نتمكن من ذكر رسائل الإيداع التي أنشأناها، إما برقمها، أو بسلسلة المحارف التي تذكر أساس الفروع لدينا.
</p>

<p>
	لمعرفة عدد الإيداعات التي أنشأناها، يمكننا تفقُّد الرقم الإجمالي للإيداعات المُنشأة في المشروع من خلال الأمر التالي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4158_19" style="">
<span class="pln">$ git log</span></pre>

<p>
	وسيكون الخرج مشابهًا للخرج التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4158_23" style="">
<span class="pln">commit </span><span class="lit">46f196203a16b448bf86e0473246eda1d46d1273</span><span class="pln">
</span><span class="typ">Author</span><span class="pun">:</span><span class="pln"> username</span><span class="pun">-</span><span class="lit">2</span><span class="pln"> </span><span class="pun">&lt;</span><span class="pln">email</span><span class="pun">-</span><span class="lit">2</span><span class="pun">&gt;</span><span class="pln">
</span><span class="typ">Date</span><span class="pun">:</span><span class="pln">   </span><span class="typ">Mon</span><span class="pln"> </span><span class="typ">Dec</span><span class="pln"> </span><span class="lit">14</span><span class="pln"> </span><span class="lit">07</span><span class="pun">:</span><span class="lit">32</span><span class="pun">:</span><span class="lit">45</span><span class="pln"> </span><span class="lit">2015</span><span class="pln"> </span><span class="pun">-</span><span class="lit">0400</span><span class="pln">

    </span><span class="typ">Commit</span><span class="pln"> details

commit </span><span class="lit">66e506853b0366c87f4834bb6b39d941cd034fe3</span><span class="pln">
</span><span class="typ">Author</span><span class="pun">:</span><span class="pln"> username1 </span><span class="pun">&lt;</span><span class="pln">email</span><span class="pun">-</span><span class="lit">1</span><span class="pun">&gt;</span><span class="pln">
</span><span class="typ">Date</span><span class="pun">:</span><span class="pln">   </span><span class="typ">Fri</span><span class="pln"> </span><span class="typ">Nov</span><span class="pln"> </span><span class="lit">27</span><span class="pln"> </span><span class="lit">20</span><span class="pun">:</span><span class="lit">24</span><span class="pun">:</span><span class="lit">45</span><span class="pln"> </span><span class="lit">2015</span><span class="pln"> </span><span class="pun">-</span><span class="lit">0500</span><span class="pln">

    </span><span class="typ">Commit</span><span class="pln"> details</span></pre>

<p>
	يعرض السجل جميع الإيداعات المُنشأة في مستودع المشروع المحدد، لذلك ستُعرَض الإيداعات التي أنشأها آخرون إلى جانب الإيداعات التي أنشأتها أنت. وبالتالي، عندما يكون للمشاريع سجلًا حافلًا من الإيداعات التي أنشأها عدة مؤلفين، ستحتاج إلى تحديد نفسك على أنك مؤلفًا من خلال الأمر:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4158_25" style="">
<span class="pln">$ git log </span><span class="pun">--</span><span class="pln">author</span><span class="pun">=</span><span class="pln">your</span><span class="pun">-</span><span class="pln">username</span></pre>

<p>
	سيتيح لك هذا المعامل عدَّ الالتزامات التي أنشأتها؛ فإذا كنت تعمل على عدة فروع، تستطيع إضافة <code>branches[=&lt;branch&gt;]‎--</code> في نهاية الأمر لتظهر النتيجة حسب الفرع.
</p>

<p>
	والآن بعد أن عرفت عدد الإيداعات التي أنشأتها على الفرع الذي تريد إعادة تأسيسه، يمكنك تنفيذ الأمر <code>git rebase</code> كما يلي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4158_27" style="">
<span class="pln">$ git rebase </span><span class="pun">-</span><span class="pln">i HEAD</span><span class="pun">~</span><span class="pln">x</span></pre>

<p>
	تشير <code>i-</code> في هذا المثال إلى أن إعادة تأسيس التفريعات تفاعلية، و <code>HEAD</code> إلى أحدث إيداع في الفرع الرئيسي، بينما تشير <code>x</code> إلى عدد الإيداعات التي أنشأتها في فرعك منذ أن جلبته في البداية.
</p>

<p>
	لكن إذا كنت لا تعرف عدد الإيداعات التي أنشأتها في فرعك، عليك أن تعرف ما هو الإيداع الذي يمثِّل أساس الفرع خاصتك، من خلال تنفيذ الأمر التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4158_29" style="">
<span class="pln">$ git merge</span><span class="pun">-</span><span class="pln">base </span><span class="kwd">new</span><span class="pun">-</span><span class="pln">branch main</span></pre>

<p>
	وسيكون خرج هذا الأمر سلسلة محارف طويلة تُعرف باسم الإيداع المعمَّى Hash، كما يبدو في المثال التالي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4158_31" style="">
<span class="lit">66e506853b0366c87f4834bb6b39d341cd094fe9</span></pre>

<p>
	سنمرر الإيداع المعمَّى هذا إلى الأمر <code>git rebase</code>:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4158_33" style="">
<span class="pln">$ git rebase </span><span class="pun">-</span><span class="pln">i </span><span class="lit">66e506853b0366c87f4834bb6b39d341cd094fe9</span></pre>

<p>
	ستكون نتيجة كلا الأمرين السابقين فتح ملفٍ في محرر نصوص واجهة الأوامر يتضمن قائمةً بجميع الإيداعات في فرعك، ويمكنك الآن إما دمجها أو إعادة صياغتها.
</p>

<h3>
	دمج الإيداعات
</h3>

<p>
	تتمثل عملية دمج رسائل الإيداع بدمج أو جمع عدة إيداعات صغيرة في رسالة أكبر.
</p>

<p>
	ستجد بداية كل إيداع كلمة انتقاء "pick"، لذا سيبدو ملفك مشابهًا للملف التالي إذا كان لديك إيداعين:
</p>

<ul>
<li>
		الملف "‎…username/repository/.git/rebase-merge/git-rebase-todo":
	</li>
</ul>
<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4158_35" style="">
<span class="pln">pick a1f29a6 </span><span class="typ">Adding</span><span class="pln"> a </span><span class="kwd">new</span><span class="pln"> feature
pick </span><span class="lit">79c0e80</span><span class="pln"> </span><span class="typ">Here</span><span class="pln"> is another </span><span class="kwd">new</span><span class="pln"> feature

</span><span class="pun">#</span><span class="pln"> </span><span class="typ">Rebase</span><span class="pln"> </span><span class="lit">66e5068</span><span class="pun">..</span><span class="lit">79c0e80</span><span class="pln"> onto </span><span class="lit">66e5068</span><span class="pln"> </span><span class="pun">(</span><span class="lit">2</span><span class="pln"> command</span><span class="pun">(</span><span class="pln">s</span><span class="pun">))</span></pre>

<p>
	ولدمج الإيداع، ينبغي عليك تبديل الكلمة "pick" بالكلمة "squash" في كل سطر من سطور الملف الموجود ضمن المسار "username/repository/.git/rebase-merge/git-rebase-todo…" باستثناء السطر الأول:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4158_37" style="">
<span class="pln">pick a1f29a6 </span><span class="typ">Adding</span><span class="pln"> a new feature
squash </span><span class="lit">79c0e80</span><span class="pln"> </span><span class="typ">Here</span><span class="pln"> </span><span class="kwd">is</span><span class="pln"> another new feature</span></pre>

<p>
	يمكنك في هذه المرحلة حفظ الملف وإغلاقه، وهذا سيفتح ملفًا جديدًا يجمع بين جميع رسائل الإيداع لجميع الإيداعات، وتستطيع إعادة صياغة رسالة الإيداع على النحو الذي تراه مناسبًا، ثم حفظ الملف وإغلاقه.
</p>

<p>
	ستتلقى ملاحظةً بمجرد إغلاق الملف على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4158_39" style="">
<span class="typ">Successfully</span><span class="pln"> rebased and updated refs</span><span class="pun">/</span><span class="pln">heads</span><span class="pun">/</span><span class="kwd">new</span><span class="pun">-</span><span class="pln">branch</span><span class="pun">.</span></pre>

<p>
	لقد جمعت الآن جميع الإيداعات في إيداعٍ واحد بدمجها معًا.
</p>

<h3>
	إعادة صياغة الإيداعات
</h3>

<p>
	تُعد إعادة صياغة رسائل الإيداع رائعةً عند ملاحظتك خطًأ إملائيًا، أو عندما تدرك أنك تستخدم صياغةً مختلفةً في كل إيداع لديك.
</p>

<p>
	بمجرد أن تنفذ عملية إعادة تأسيس التفريعات التفاعلية باتباع الخطوات التي ذكرناها من خلال تنفيذ الأمر <code>git rebase -i</code>، سيُفتح ملفٌ مشابهٌ للملف في المسار "username/repository/.git/rebase-merge/git-rebase-todo…" على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4158_41" style="">
<span class="pln">pick a1f29a6 </span><span class="typ">Adding</span><span class="pln"> a </span><span class="kwd">new</span><span class="pln"> feature
pick </span><span class="lit">79c0e80</span><span class="pln"> </span><span class="typ">Here</span><span class="pln"> is another </span><span class="kwd">new</span><span class="pln"> feature

</span><span class="pun">#</span><span class="pln"> </span><span class="typ">Rebase</span><span class="pln"> </span><span class="lit">66e5068</span><span class="pun">..</span><span class="lit">79c0e80</span><span class="pln"> onto </span><span class="lit">66e5068</span><span class="pln"> </span><span class="pun">(</span><span class="lit">2</span><span class="pln"> command</span><span class="pun">(</span><span class="pln">s</span><span class="pun">))</span></pre>

<p>
	بدِّل الكلمة "reword" بالكلمة "pick"، أي إعادة الصياغة في كل إيداع تريد إعادة صياغته، فمثلًا في الملف الموجود ضمن المسار "username/repository/.git/rebase-merge/git-rebase-todo…"، ستكون إعادة الصياغة على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4158_43" style="">
<span class="pln">pick a1f29a6 </span><span class="typ">Adding</span><span class="pln"> a </span><span class="kwd">new</span><span class="pln"> feature
reword </span><span class="lit">79c0e80</span><span class="pln"> </span><span class="typ">Adding</span><span class="pln"> a second </span><span class="kwd">new</span><span class="pln"> feature

</span><span class="pun">#</span><span class="pln"> </span><span class="typ">Rebase</span><span class="pln"> </span><span class="lit">66e5068</span><span class="pun">..</span><span class="lit">79c0e80</span><span class="pln"> onto </span><span class="lit">66e5068</span><span class="pln"> </span><span class="pun">(</span><span class="lit">2</span><span class="pln"> command</span><span class="pun">(</span><span class="pln">s</span><span class="pun">))</span></pre>

<p>
	وبمجرد حفظ الملف وإغلاقه، سيظهر ملفٌ جديدٌ في محرر طرفيتك يعرض صياغة رسالة الإيداع المعدَّلة؛ وإذا أردت تعديل الملف مرةً أخرى، افعل ذلك قبل حفظ الملف وإغلاقه. تضمن هذه العملية أن تكون رسائل الإيداع نافعةً ومتسقةً.
</p>

<h3>
	استكمال عملية إعادة تأسيس التفريعات
</h3>

<p>
	عندما تجد عدد الإيداعات التي تنشئها ورسائل الإيداع المتعلقة بها مناسبًا، عليك استكمال إعادة تأسيس فرعك بناءً على أحدث نسخةٍ من الشيفرة البرمجية الأولية للمشروع، وذلك بتنفيذ هذا الأمر من دليل directory المستودع الخاص بك:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4158_45" style="">
<span class="pln">$ git rebase origin</span><span class="pun">/</span><span class="pln">main</span></pre>

<p>
	سيبدأ نظام غيت في هذه المرحلة بإعادة تنفيذ إيداعاتك في أحدث نسخةٍ من الفرع الرئيسي؛ وفي حالة حدوث تعارضات في تلك العملية، سيوقفها غيت مؤقتًا ليطالبك بمعالجة تلك التعارضات قبل متابعة العملية؛ أما إذا لم يجد تعارضات، فسيرِد في الخرج ما يلي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4158_47" style="">
<span class="typ">Current</span><span class="pln"> branch </span><span class="kwd">new</span><span class="pun">-</span><span class="pln">branch is up to date</span><span class="pun">.</span></pre>

<p>
	بعد معالجة التعارضات، نفِّذ الأمر:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4158_49" style="">
<span class="pln">$ git rebase </span><span class="pun">--</span><span class="kwd">continue</span></pre>

<p>
	إذ سيشير هذا الأمر إلى غيت بأنه يستطيع الآن متابعة إعادة تنفيذ إيداعاتك.
</p>

<p>
	إذا سبق ودمجت الإيداعات من خلال استخدام أمر <code>squash</code>، فستضطر إلى معالجة التعارضات مرةً واحدةً فقط.
</p>

<h3>
	تحديث طلب السحب باستخدام الدفع القسري Force-Push
</h3>

<p>
	عندما تجري إعادة تأسيس التفريعات، يتغير سجل الفرع الخاص بك، ولن تتمكن من استخدام الأمر <code>get push</code> لأن المسار المباشر قد عُدِّل، وسنضطر عوضًا عن ذلك استخدام <code>force--</code> أو الراية <code>f-</code> لفرض دفع التغييرات، وهذا يبلغ غيت أنك على درايةٍ كاملة بالذي تدفعه.
</p>

<p>
	دعنا أولًا نتأكد من أن <code>push.default</code> الخاص بنا مضبوطٌ على <code>simple</code> (وهو الإعداد الافتراضي في الإصدار 2.0 وما بعده من نظام غيت) من خلال تنفيذ ما يلي لإعداده:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4158_52" style="">
<span class="pln">$ git config </span><span class="pun">--</span><span class="pln">global push</span><span class="pun">.</span><span class="kwd">default</span><span class="pln"> simple</span></pre>

<p>
	علينا أن نتأكد في هذه المرحلة أننا في الفرع الصحيح من خلال التحقُّق من الفرع الذي نعمل عليه على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4158_54" style="">
<span class="pln">$ git checkout </span><span class="kwd">new</span><span class="pun">-</span><span class="pln">branch

</span><span class="typ">Already</span><span class="pln"> on </span><span class="str">'new-branch'</span><span class="pln">
</span><span class="pun">.</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> </span><span class="pun">.</span></pre>

<p>
	نستطيع حينها تنفيذ عملية الدفع القسري كما يلي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4158_56" style="">
<span class="pln">$ git push </span><span class="pun">-</span><span class="pln">f</span></pre>

<p>
	سيرد إليك الآن تعليقٌ عن التحديثات التي أجريتها إلى جانب رسالةٍ تشير إلى أن هذا التحديث كان <code>forced update</code> أي تحديثًا قسريًا، وأصبح طلب السحب الذي قدمته محدثًا الآن.
</p>

<h3>
	استعادة الإيداعات الضائعة
</h3>

<p>
	إذا أزلت في مرحلةٍ ما إيداعًا تحتاج فعلًا إلى دمجه مع مُجمَل المشروع، تستطيع استخدام الأمر <code>git</code> لاستعادة الإيداعات التي أزلتها من دون قصد.
</p>

<p>
	سنستخدم الأمر <code>git reflog</code> للبحث عن الإيداعات الناقصة، ثم ننشئ فرعًا جديدًا من ذلك الإيداع، إذ تشير كلمة <strong>Reflog</strong> إلى اختصارٍ لعبارة <strong>السجل المرجعي reference log</strong>، الذي يسجل آخر تحديثٍ للإيداعات في الفروع والمراجع الأخرى ضمن المستودع المحلي.
</p>

<p>
	سننفِّذ الأمر التالي من الدليل الحالي لمستودع الشيفرة البرمجية الذي نعمل فيه:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4158_58" style="">
<span class="pln">$ git reflog</span></pre>

<p>
	وسيكون الخرج عند تنفيذ هذا الأمر مشابهًا للخرج التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4158_60" style="">
<span class="lit">46f1962</span><span class="pln"> HEAD@</span><span class="pun">{</span><span class="lit">0</span><span class="pun">}:</span><span class="pln"> checkout</span><span class="pun">:</span><span class="pln"> moving from branch</span><span class="pun">-</span><span class="lit">1</span><span class="pln"> to </span><span class="kwd">new</span><span class="pun">-</span><span class="pln">branch
</span><span class="lit">9370d03</span><span class="pln"> HEAD@</span><span class="pun">{</span><span class="lit">1</span><span class="pun">}:</span><span class="pln"> commit</span><span class="pun">:</span><span class="pln"> code cleanups
a1f29a6 HEAD@</span><span class="pun">{</span><span class="lit">2</span><span class="pun">}:</span><span class="pln"> commit</span><span class="pun">:</span><span class="pln"> brand </span><span class="kwd">new</span><span class="pln"> feature 
</span><span class="lit">38f2fc2</span><span class="pln"> HEAD@</span><span class="pun">{</span><span class="lit">3</span><span class="pun">}:</span><span class="pln"> commit</span><span class="pun">:</span><span class="pln"> remove testing methods
</span><span class="pun">.</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> </span><span class="pun">.</span></pre>

<p>
	ستعرف عند الاطلاع على رسائل الإيداع أيُّ الإيداعات التي أزلتها، وستجد سلسلة المحارف المتعلقة بها قبل معلومات <code>HEAD@{x}‎</code> في الجهة اليسارية من نافذة الطرفية.
</p>

<p>
	تستطيع الآن الاستفادة من تلك المعلومة وإنشاء فرعٍ جديدٍ من الإيداع المناسب:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4158_62" style="">
<span class="pln">$ git checkout </span><span class="pun">-</span><span class="pln">b new</span><span class="pun">-</span><span class="pln">new</span><span class="pun">-</span><span class="pln">branch a1f29a6</span></pre>

<p>
	أنشأنا في المثال السابق فرعًا جديدًا من ثالث إيداع حصلنا عليه في الخرج السابق، وهو الإيداع الذي بدأ تنفيذ وسم خاصية جديدة "brand new feature"، مُتمثِّل بسلسلة المحارف <code>a1f29a6</code>.
</p>

<p>
	يمكنك الآن المتابعة حسب ما تريد فعله، إما باتباع خطوات إعداد فرعك الواردة في المقال السابق المشار إليه سلفًا، أو العودة إلى جزئية إعادة تأسيس الشيفرة البرمجية وتنظيف التعليقات في المقال التعليمي الحالي لتتابع إعادة تأسيس الفرع الجديد.
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<p>
		<strong>ملاحظة</strong>: إذا نفذت الأمر <code>git gc</code> مؤخرًا لتنظيف الملفات غير الضرورية وتحسين أداء المستودع المحلي، قد لا تستطيع استعادة الإيداعات المفقودة.
	</p>
</blockquote>

<h2>
	ما الذي تتوقع رؤيته في مراجعة الشيفرة البرمجية؟
</h2>

<p>
	عندما ترسل طلب سحب، تكون بحالة حوار مع المشروع العام، إذ يُعد إرسال طلب سحب بمثابة دعوة الآخرين لمناقشة عملك، تمامًا كما تناقش أنت مشروعًا عامًا وتشارك فيه. ولكي تجري نقاشًا ناجحًا، من المهم أن تكون قادرًا على توضيح <strong>سبب</strong> تقديمك طلب السحب من خلال رسائل الإيداع خاصتك، لذلك من الأفضل أن تكون دقيقًا وواضحًا قدر الإمكان.
</p>

<p>
	قد تكون مراجعة طلب السحب طويلةً ومفصلةً، وذلك حسب المشروع. ومن الأفضل أن تنظر إلى هذه العملية بأنها تجربةٌ تعليمية، وطريقةٌ نافعة لتحسين شيفرتك البرمجية، وجعل طلب السحب أفضل ومتوافقًا أكثر مع احتياجات مشروع البرنامج. كما يجب أن تتيح لك المراجعة إجراء التعديلات بنفسك متبعًا نصائح وتوجيهات المشرفين.
</p>

<p>
	سيحتفظ طلب السحب بسجلٍ لملاحظات المراجعين وأية تحديثات ومناقشات أجريتموها معًا، وقد تحتاج إلى إنشاء عدة إيداعات إضافية خلال هذه العملية قبل قبول طلب السحب، وهذا أمرٌ طبيعي تمامًا ويوفّر لك فرصةً جيدةً لتشارك في المراجعة بصفتك جزءًا من الفريق.
</p>

<p>
	سيكون الإشراف على طلب السحب الذي قدمته مستمرًا من خلال نظام غيت، وسيُحدَّث تلقائيًا طوال العملية طالما واصلت إضافة إيداعات إلى نفس الفرع وطبقتها على فرعك المشتق.
</p>

<p>
	عندما تنشر شيفرتك البرمجية ليراجعها أقرانك، لا يجب أن تشعر أبدًا أن المراجعة تتخذ منحًى شخصيًا، لذا احرص على قراءة ملفات "CONTRIBUTION.md" ذات الصلة أو مدونات قواعد السلوك. ومن الضروري أن تتأكد من توافق إيداعاتك مع الإرشادات المحددة ضمن المشروع؛ ولكن إذا بدأت تشعر بالاستياء، فقد لا يستحق المشروع الذي تعمل عليه مساهمتك.
</p>

<p>
	توجد العديد من المساحات الترحيبية في مجتمع البرامج مفتوحة المصدر، وبما أنك تتوقع أن يُنظَر إلى الشيفرة البرمجية التي تشاركها بعينٍ ناقدة، يجب أن تكون جميع الملاحظات التي تتلقاها مهنيةً ولبِقة.
</p>

<h2>
	قبول طلب السحب وحذف فرعك
</h2>

<p>
	يعني قبول طلب السحب الذي قدمته أنك نجحت في تقديم مساهمةٍ في مشروع برنامجٍ مفتوح المصدر، وستحتاج في هذه المرحلة إلى التفتيش عن التعديلات التي أجريتها في فرعك المشتق من خلال مستودعك المحلي، وهذا ما فعلته مسبقًا عندما نفَّذت عملية مزامنة فرعك المشتق من مقال طلبات السحب السابق.
</p>

<p>
	يمكنك فعل ذلك من خلال تنفيذ عدة أوامر في نافذة طرفيتك:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4158_64" style="">
<span class="pln">$ git checkout main
$ git pull </span><span class="pun">--</span><span class="pln">rebase origin main
$ git push </span><span class="pun">-</span><span class="pln">f origin main</span></pre>

<p>
	عليك الآن تنظيف كلٍ من فروعك المحلية والبعيدة بحذف الفرع الذي أنشأته في كلا الموضعين لأنك لن تحتاج إليهما بعد الآن. لنحذف أولًا الفرع المحلي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4158_66" style="">
<span class="pln">$ git branch </span><span class="pun">-</span><span class="pln">d new</span><span class="pun">-</span><span class="pln">branch</span></pre>

<p>
	مهمة الراية <code>d-</code> المُضافة إلى أمر <code>git branch</code> هي حذف الفرع الذي سنذكره في هذا الأمر، والذي سميناه في مثالنا السابق "new-branch".
</p>

<p>
	ثم سنحذف الفرع البعيد على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4158_68" style="">
<span class="pln">$ git push origin </span><span class="pun">--</span><span class="pln">delete new</span><span class="pun">-</span><span class="pln">branch</span></pre>

<p>
	بعد أن حذفت الفروع، تكون قد نظفت المستودع وأصبحت التغييرات التي أجريتها الآن جزءًا من المستودع الرئيسي. ويجب ألا تنسى أن انتقال التغييرات التي أجريتها من خلال طلب السحب لتصبح جزءًا من المستودع الرئيسي، قد لا يعني أنها أصبحت متاحةً في الإصدارات العامة التي ينزِّلها المستخدم النهائي، إذ يجمِّع مشرفو البرنامج عمومًا عدة خصائص جديدة وإصلاحات معًا، ويطلقونها في إصدار عامٍ واحد.
</p>

<h2>
	الخاتمة
</h2>

<p>
	تناول هذا الدرس التعليمي بعض الخطوات التي قد تلي عملية تقديم طلب السحب إلى مستودع برنامجٍ مفتوح المصدر.
</p>

<p>
	تكون مساهمتك في المشاريع مفتوحة المصدر وانضمامك لمجموعة مطوري البرامج مفتوحة المصدر النشطين غالبًا تجربةً مجزيةً، إذ تساعد مساهماتك الدورية في برامجك المفضلة في جعلها قيمةً ونافعةً لمستخدميها.
</p>

<p>
	ترجمة -وبتصرف- للمقال <a href="https://www.digitalocean.com/community/tutorials/how-to-rebase-and-update-a-pull-request" rel="external nofollow">How To Rebase and Update a Pull Request</a> لصاحبته Lisa Tagliaferri.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
<li>
		<a href="https://academy.hsoub.com/devops/general/%D8%A7%D9%84%D9%81%D8%B1%D9%82-%D8%A8%D9%8A%D9%86-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A7%D8%AA-%D8%A7%D9%84%D8%AD%D8%B1%D8%A9-%D9%88%D9%85%D9%81%D8%AA%D9%88%D8%AD%D8%A9-%D8%A7%D9%84%D9%85%D8%B5%D8%AF%D8%B1-r590/" rel="">الفرق بين البرمجيات الحرة ومفتوحة المصدر</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/marketing/performance-marketing/%D8%B7%D8%B1%D9%82-%D8%A7%D9%84%D8%AA%D8%B9%D8%B1%D9%8A%D9%81-%D8%A8%D9%85%D8%B4%D8%B1%D9%88%D8%B9%D9%83-%D9%85%D9%81%D8%AA%D9%88%D8%AD-%D8%A7%D9%84%D9%85%D8%B5%D8%AF%D8%B1-r165/" rel="">طرق التعريف بمشروعك مفتوح المصدر</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/devops/general/%D8%B5%D9%8A%D8%A7%D9%86%D8%A9-%D8%A7%D9%84%D9%85%D8%B4%D8%A7%D8%B1%D9%8A%D8%B9-%D9%85%D9%81%D8%AA%D9%88%D8%AD%D8%A9-%D8%A7%D9%84%D9%85%D8%B5%D8%AF%D8%B1-r359/" rel="">صيانة المشاريع مفتوحة المصدر</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/marketing/performance-marketing/%D9%83%D9%8A%D9%81-%D8%AA%D8%AD%D9%88%D9%84-%D9%85%D8%B3%D8%AA%D8%AE%D8%AF%D9%85%D9%8A-%D9%85%D8%B4%D8%B1%D9%88%D8%B9%D9%83-%D9%85%D9%81%D8%AA%D9%88%D8%AD-%D8%A7%D9%84%D9%85%D8%B5%D8%AF%D8%B1-%D8%A5%D9%84%D9%89-%D9%85%D8%B3%D8%A7%D9%87%D9%85%D9%8A%D9%86-r166/" rel="">كيف تحول مستخدمي مشروعك مفتوح المصدر إلى مساهمين</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">1584</guid><pubDate>Sat, 28 May 2022 10:44:48 +0000</pubDate></item><item><title>&#x625;&#x646;&#x634;&#x627;&#x621; &#x637;&#x644;&#x628; &#x633;&#x62D;&#x628; &#x639;&#x644;&#x649; GitHub</title><link>https://academy.hsoub.com/programming/workflow/git/%D8%A5%D9%86%D8%B4%D8%A7%D8%A1-%D8%B7%D9%84%D8%A8-%D8%B3%D8%AD%D8%A8-%D8%B9%D9%84%D9%89-github-r1581/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2022_05/6284e273c7356_---pull-request--GitHub.png.cde46605c6f076de9111c8aa47df070f.png" /></p>

<p>
	<a href="https://academy.hsoub.com/programming/workflow/git/%D9%85%D8%A8%D8%A7%D8%AF%D8%A6-git-%D8%A7%D9%84%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A9-r256/" rel="">نظام غيت Git</a> هو نظام إدارة الإصدارات الموزعة distributed version الذي يسهّل إدارة المشاريع البرمجية المشتركة. تحتفظ العديد من المشاريع بملفاتها في مستودع غيت Git repository، كما جعلت مواقع، مثل غيت هَب GitHub مشاركة الشيفرة البرمجية والمساهمة فيها متاحةً ومفيدةً وفعالةً.
</p>

<p>
	تفيد المساهمات التي يقدمها مجتمع المطورين العام في <a href="https://academy.hsoub.com/devops/general/%D8%B5%D9%8A%D8%A7%D9%86%D8%A9-%D8%A7%D9%84%D9%85%D8%B4%D8%A7%D8%B1%D9%8A%D8%B9-%D9%85%D9%81%D8%AA%D9%88%D8%AD%D8%A9-%D8%A7%D9%84%D9%85%D8%B5%D8%AF%D8%B1-r359/" rel="">تطوير المشاريع مفتوحة المصدر</a> المستضافة في المستودعات من خلال <strong>طلبات السحب pull requests</strong> التي تطلب أن يقبل مشرف المشروع التعديلات التي أجريتها على مستودع شيفرته البرمجية.
</p>

<p>
	ستتعلم في هذا الدرس التعليمي خطوات تقديم طلب سحب إلى مستودع غيت من خلال واجهة الأوامر حتى تتمكن من المساهمة في المشاريع مفتوحة المصدر.
</p>

<p>
	يجب أن يكون نظام غيت مثبّتًا على جهازك المحلي، ويمكنك التحقق إذا كان مثبتًا على حاسوبك والخوض في عملية تثبيته على نظام التشغيل لديك من خلال الاطلاع على مقال <a href="https://academy.hsoub.com/programming/workflow/git/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%A7%D9%84%D9%85%D8%B3%D8%A7%D9%87%D9%85%D8%A9-%D9%81%D9%8A-%D8%A7%D9%84%D9%85%D8%B4%D8%A7%D8%B1%D9%8A%D8%B9-%D9%85%D9%81%D8%AA%D9%88%D8%AD%D8%A9-%D8%A7%D9%84%D9%85%D8%B5%D8%AF%D8%B1-%D8%A7%D8%A8%D8%AF%D8%A3-%D8%A8%D8%AA%D8%B9%D9%84%D9%85-%D9%86%D8%B8%D8%A7%D9%85-git-r1580/" rel="">كيف تساهم في المشاريع مفتوحة المصدر: ابدأ بتعلم نظام Git</a>.
</p>

<p>
	كما تحتاج إلى إنشاء حساب على موقع غيت هَب، إذ تستطيع إنشاء حساب أو تسجيل الدخول على حسابك إذا سبق وأنشأته من خلال زيارة موقع <a href="https://github.com" rel="external nofollow">غيت هَب github.com</a>.
</p>

<p>
	ألغى موقع غيت هَب الاستيثاق authentication عن طريق كلمة المرور في بداية شهر تشرين الثاني من عام 2020، لذا ستحتاج إلى إنشاء رمز وصول شخصي access token، أو إضافة معلومات <a href="https://docs.github.com/en/github/authenticating-to-github/connecting-to-github-with-ssh/adding-a-new-ssh-key-to-your-github-account" rel="external nofollow">المفتاح العام للوصول عن طريق <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr></a> حتى تتمكن من الوصول إلى مستودعات غيت هَب من خلال واجهة الأوامر.
</p>

<p>
	وأخيرًا، عليك أن تحدد المشروع البرمجي مفتوح المصدر الذي تريد المساهمة فيه.
</p>

<h2>
	إنشاء نسخة عن المستودع
</h2>

<p>
	إن <strong>المستودع</strong> repository، والذي يُشار إليه بكلمة <strong>ريبو أو repo</strong> هو المجلد الرئيسي للمشروع أساسًا، ويحتوي على جميع الملفات المتعلقة بالمشروع، مثل ملفات التوثيق documentation، كما يحتفظ بسجل التعديلات revision history لكل ملف. ويمكن أن يشترك أكثر من شخص في العمل على المستودعات على موقع غيت هَب، كما يمكن أن تكون عامةً أو مغلقة.
</p>

<p>
	حتى تعمل على مشروع مفتوح المصدر ستحتاج أولًا إلى إنشاء نسخة عن المستودع خاصةً بك؛ ولتنفيذ هذا اشتق fork المستودع، ثم استنسخه clone حتى يصبح لديك نسخةً محليةً فعالةً.
</p>

<h3>
	اشتقاق المستودع
</h3>

<p>
	لاشتقاق مستودع على موقع غيت هَب انتقل إلى رابط المشروع مفتوح المصدر الذي تريد المساهمة فيه على الموقع من خلال المتصفح لديك، إذ تشير روابط المستودعات على غيت هَب إلى كلٍ من اسم المستخدم المرتبط بمالك المستودع إضافةً إلى اسم المستودع؛ فمثلًا إذا مالك مستودع مشروع "cloud_haiku" هو مجتمع DigitalOcean، فسيكون رابط هذا المشروع على موقع غيت هَب على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_343_11" style="">
<span class="pln">https</span><span class="pun">:</span><span class="com">//github.com/do-community/cloud_haiku</span></pre>

<p>
	يشير <code>do-community</code> في هذا المثال إلى اسم المستخدم و <code>cloud_haiku</code> إلى اسم المستودع.
</p>

<p>
	بعد أن حددت المشروع الذي تريد المساهمة فيه، انتقل إلى الرابط الذي ستكون صيغته على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_343_13" style="">
<span class="pln">https</span><span class="pun">:</span><span class="com">//github.com/username/repository</span></pre>

<p>
	أو يمكنك البحث عنه في شريط بحث موقع غيت هَب.
</p>

<p>
	عندما تفتح الصفحة الرئيسية للمستودع، ستجد زر الاشتقاق <strong>Fork</strong> في زاوية الصفحة العليا على اليمين، وأسفل أيقونة المستخدم الخاص بك:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="99046" href="https://academy.hsoub.com/uploads/monthly_2022_05/001ch_gh_arrow_blink.gif.0b2afc755a41ec3589ab9c1d0b55f54f.gif" rel=""><img alt="001ch_gh_arrow_blink.gif" class="ipsImage ipsImage_thumbnailed" data-fileid="99046" data-unique="jk3755g32" src="https://academy.hsoub.com/uploads/monthly_2022_05/001ch_gh_arrow_blink.thumb.gif.323b4cf991ddcd4ead78191b35e0d6ac.gif" style="width: 600px; height: auto;"></a>
</p>

<p style="text-align: center;">
	(سهم وامض)
</p>

<p>
	عند الضغط على زر الاشتقاق لبدء عملية الاشتقاق، ستتلقى إشعارًا ضمن المتصفح لديك يفيد بأن المستودع الذي تشتقه قيد المعالجة:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="99047" href="https://academy.hsoub.com/uploads/monthly_2022_05/002GitHub_Forking.png.adf5044f36e3ddb6899e0e2152a5064e.png" rel=""><img alt="002GitHub_Forking.png" class="ipsImage ipsImage_thumbnailed" data-fileid="99047" data-unique="1mxohfiwi" src="https://academy.hsoub.com/uploads/monthly_2022_05/002GitHub_Forking.thumb.png.855ae7ae55695711e037f871172f83ce.png" style="width: 500px; height: auto;"></a>
</p>

<p style="text-align: center;">
	(الاشتقاق في غيت هَب)
</p>

<p>
	سينتقل المتصفح لديك إلى صفحةٍ مشابهة لصفحة المستودع السابقة عند الانتهاء من العملية، مع اختلافَين بسيطين يتمثلان بأنك سترى في الأعلى اسم المستخدم الخاص بك قبل اسم المستودع، كما ستجده قبل اسم المستودع في الرابط.
</p>

<p>
	إذًا سترى الآن في المثال الذي طرحناه <strong>your-username / cloud_haiku</strong> بدلًا عن <strong>do-community / cloud_haiku</strong> في أعلى الصفحة، حيث أن your-username هي اسم المستخدم الخاص بك، وسيكون الرابط الجديد على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_343_17" style="">
<span class="pln">https</span><span class="pun">:</span><span class="com">//github.com/your-username/cloud_haiku</span></pre>

<p>
	بعد اشتقاق المستودع، يمكنك البدء باستنساخه clone لتصبح لديك نسخةً محليةً فعالةً من الشيفرة الأساسية.
</p>

<h3>
	استنساخ المستودع
</h3>

<p>
	لإنشاء نسختك المحلية من المستودع الذي تريد المساهمة فيه، ابدأ بفتح الطرفية؛ إذ سنستخدم الأمر <code>git clone</code> إلى جانب الرابط الذي يشير إلى النسخة المشتقة من المستودع.
</p>

<p>
	سيكون هذا الرابط مشابهًا للرابط الذي ذكرناه سابقًا، إلا أن هذا الرابط سينتهي باللاحقة <code>git.</code>، وسيكون الرابط حسب مثالنا عن "cloud_haiku" على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_343_19" style="">
<span class="pln">https</span><span class="pun">:</span><span class="com">//github.com/your-username/cloud_haiku.git</span></pre>

<p>
	أو يمكنك نسخ الرابط باستخدام الزر الأخضر <strong>الشيفرة Code⤓</strong> الموجود في صفحة مستودعك الذي اشتققته من صفحة المستودع الأصلية، وبمجرد الضغط على الزر ستتمكن من نسخ الرابط من خلال النقر على زر المجلد binder بجانب الرابط:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="99048" href="https://academy.hsoub.com/uploads/monthly_2022_05/003ch_gh_codebox_arrow.png.96bc163a2b36fd45a095b8c4af5735e9.png" rel=""><img alt="003ch_gh_codebox_arrow.png" class="ipsImage ipsImage_thumbnailed" data-fileid="99048" data-unique="qmid4o9ia" src="https://academy.hsoub.com/uploads/monthly_2022_05/003ch_gh_codebox_arrow.png.96bc163a2b36fd45a095b8c4af5735e9.png" style="width: 550px; height: auto;"></a>
</p>

<p style="text-align: center;">
	(سهم يشير إلى زر المجلد في مربع الشيفرة)
</p>

<p>
	عندما نحصل على الرابط سنكون جاهزين لاستنساخ المستودع، ولتنفيذ ذلك سنجمّع أمر <code>git clone</code> مع رابط المستودع في موجه الأوامر في الطرفية على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_343_25" style="">
<span class="pln">git clone https</span><span class="pun">:</span><span class="com">//github.com/your-username/repository.git</span></pre>

<p>
	أصبح لدينا الآن نسخةً محليةً من الشيفرة البرمجية، لذا يمكننا الانتقال إلى إنشاء فرعٍ branch جديدٍ لنعمل ضمنه على الشيفرة البرمجية.
</p>

<h2>
	إنشاء فرع جديد
</h2>

<p>
	عندما تعمل على مشروع مبني على العمل التشاركي، سيكون لديك ولدى غيرك من المبرمجين المساهمين في المستودع أفكارًا مختلفةً لخصائصٍ جديدة أو حلولٍ لمشكلاتٍ معينة في نفس الوقت، إذ لن تستهلك بعض هذه الخصائص وقتًا في تطبيقها، بينما سيكون العمل على بعضها الآخر جارٍ؛ لذا من الضروري أن تنشئ فرعًا عن المستودع حتى تتمكن من إدارة سير العمل، وعزل شيفرتك البرمجية، والتحكم في تحديد الخصائص المُعتمَدة في الفرع الرئيسي للمستودع.
</p>

<p>
	يدعى الفرع الأولي primary من مستودع مشروع عادةً الفرع <strong>الرئيسي main</strong>. ومن أفضل الممارسات الشائعة أن تعد أي شيءٍ ضمن الفرع الرئيسي قابلًا للنشر ليستخدمه الآخرون متى شاؤوا.
</p>

<p>
	<strong>ملاحظة</strong>: حدَّث موقع غيت هَب المصطلحات التي يستخدمها ليشير إلى مستودعات الشيفرة البرمجية المصدرية الافتراضية بالمستودع الرئيسي main بدل المستودع الأساسي master؛ فإذا كان الموقع لديك ما زال يشير إلى الفرع الرئيسي بمصطلح master، يمكنك تحديثه إلى main <a href="https://docs.github.com/en/github/administering-a-repository/managing-branches-in-your-repository/changing-the-default-branch" rel="external nofollow">بتغيير إعدادات الفرع الافتراضية</a>.
</p>

<p>
	احرص على إنشاء الفرع الجديد من الفرع الرئيسي، كما عليك أن تختار اسمًا توصيفيًا لهذا الفرع؛ فبدلًا من تسميته "my-branch" سمّه "frontend-hook-migration" أي "تهجير-خطاف-الواجهة الأمامية"، أو fix-documentation-typos أي "تصحيح-التوثيق-الأخطاء الإملائية".
</p>

<p>
	لإنشاء فرعٍ على نافذة طرفيتنا، نبدأ بتغيير المجلد لنعمل ضمن مجلد المستودع، ونتأكد من استخدام الاسم الفعلي للمستودع، مثل "cloud_haiku" للانتقال إلى مجلده.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_343_28" style="">
<span class="pln">cd repository</span></pre>

<p>
	ثم ننشئ فرعنا الجديد بواسطة الأمر <code>git branch</code>، لذلك احرص على تسميته تسميةً توصيفية كي يفهم الآخرون الذين يعملون على المشروع ما الذي تعمل عليه.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_343_30" style="">
<span class="pln">git branch </span><span class="kwd">new</span><span class="pun">-</span><span class="pln">branch</span></pre>

<p>
	بعد أن أنشأنا فرعنا الجديد نستطيع الانتقال إليه لنتأكد أننا نعمل على ذلك الفرع من خلال تنفيذ الأمر <code>git checkout</code> على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_343_32" style="">
<span class="pln">git checkout </span><span class="kwd">new</span><span class="pun">-</span><span class="pln">branch</span></pre>

<p>
	سيرِد الخرج التالي عندما تدخل الأمر <code>git checkout</code>:
</p>

<pre class="ipsCode">
Switched to branch 'new-branch'
</pre>

<p>
	أو يمكنك اختصار الأمرين السابقين، وهما إنشاء فرع جديد والانتقال إليه، بواسطة الأمر التالي وإضافة الراية <code>b-</code>:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_343_34" style="">
<span class="pln">git checkout </span><span class="pun">-</span><span class="pln">b </span><span class="kwd">new</span><span class="pun">-</span><span class="pln">branch</span></pre>

<p>
	إذا أردت العودة إلى الفرع الرئيسي أو main، استخدم الأمر <code>checkout</code> مع إدخال اسم الفرع الرئيسي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_343_36" style="">
<span class="pln">git checkout main</span></pre>

<p>
	يتيح لك الأمر <code>checkout</code> الانتقال بين عدة فروع، لذا تستطيع العمل على عدة خصائص بنفس الوقت.
</p>

<p>
	تستطيع حتى الآن تعديل ملفات موجودة أو إضافة ملفات جديدة إلى المشروع الموجود ضمن فرعك.
</p>

<h2>
	إجراء التعديلات محليًا
</h2>

<p>
	دعنا نبدأ بإنشاء ملف جديد وليكن اسمه "poetry.md" باستخدام محرّر النصوص الذي تفضله، وسنستخدم في مثالنا هذا محرر النصوص نانو nano:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_343_38" style="">
<span class="pln">nano poetry</span><span class="pun">.</span><span class="pln">md</span></pre>

<p>
	أضف أي محتوًى إلى ملفك الجديد، فمثلًا نحن أضفنا الاسم "haiku" في هذا الملف:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_343_40" style="">
<span class="typ">The</span><span class="pln"> taste
</span><span class="typ">Of</span><span class="pln"> rain
</span><span class="pun">—</span><span class="typ">Why</span><span class="pln"> kneel</span><span class="pun">?</span><span class="pln">

</span><span class="pun">“</span><span class="typ">The</span><span class="pln"> </span><span class="typ">Taste</span><span class="pln"> of </span><span class="typ">Rain</span><span class="pun">”</span><span class="pln"> by </span><span class="typ">Jack</span><span class="pln"> </span><span class="typ">Kerouac</span></pre>

<p>
	بعد إدخال المحتوى الذي تريده، احفظ التعديلات وأغلق الملف؛ وإذا كنت تستخدم محرر النصوص نانو، يمكنك تنفيذ ذلك بالضغط على "CTRL + X"، ثم "y"، ثم "ENTER".
</p>

<p>
	بعد أن عدّلت ملفًا موجودًا أو أضفت ملفًا جديدًا إلى المشروع، يمكنك إضافته إلى مستودعك المحلي عن طريق تنفيذ الأمر <code>git add</code> على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_343_42" style="">
<span class="pln">git add filename</span><span class="pun">.</span><span class="pln">md</span></pre>

<p>
	بدِّل الآن <code>filename.md</code> باسم الملف <code>poetry.md</code> الذي أنشأته لإضافته إلى مستودعك المحلي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_343_44" style="">
<span class="pln">git add poetry</span><span class="pun">.</span><span class="pln">md</span></pre>

<p>
	سيؤكد لك هذا الأمر أن ملفك جاهزٌ للإضافة. وإذا كنت تريد أن تضيف جميع الملفات الموجودة في مجلد معين، يمكنك إدراجها من خلال الأمر <code>. git add</code>، إذ ستضيف النقطة أو الفاصلة جميع الملفات المعنية؛ وإذا أردت إضافة جميع التعديلات متضمنةً المجلدات الفرعية بصورةٍ متكررة، نفذ الأمر <code>git add -A</code> أو <code>git add -all</code> لإدراج جميع الملفات الجديدة.
</p>

<p>
	بعد إدراج ملفاتنا، يُفضَّل تسجيل التعديلات التي أجريناها في المستودع بتنفيذ الأمر <code>git commit</code>.
</p>

<p>
	تُعد <strong>رسالة الإيداع</strong> commit عنصرًا مهمًا في مساهمتك في الشيفرة البرمجية؛ فهي تساعد المساهمين الآخرين على فهم التعديلات التي أجريتها كاملةً، وسبب إجرائها، ومدى أهميتها، إضافةً إلى توفير سجلٍ تاريخي للتغييرات المُجراة على المشروع عامةً، لمساعدة المساهمين المستقبليين.
</p>

<p>
	إذا كانت الرسالة مقتضبةً، نستطيع تسجيلها بإضافة الراية <code>m-</code> ووضع الرسالة بين إشارتي اقتباس على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_343_46" style="">
<span class="pln">git commit </span><span class="pun">-</span><span class="pln">m </span><span class="str">"Added a new haiku in poetry.md file"</span></pre>

<p>
	أما إذا لم تكن التغييرات طفيفة، يفضَّل إضافة رسالة إيداع أطول، ليكون المساهمون الآخرون على درايةٍ بآخر مستجدات مساهماتنا. لتوضيح ذلك أنشئ ملفًا جديدًا آخر:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_343_48" style="">
<span class="pln">nano more</span><span class="pun">-</span><span class="pln">poetry</span><span class="pun">.</span><span class="pln">md</span></pre>

<p>
	ثم أضف إليه بعض المحتوى ليكون الملف "more-poetry.md" على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_343_50" style="">
<span class="typ">The</span><span class="pln"> light of a candle
</span><span class="typ">Is</span><span class="pln"> transferred to another candle</span><span class="pun">—</span><span class="pln">
</span><span class="typ">Spring</span><span class="pln"> twilight

</span><span class="pun">“</span><span class="typ">Lightning</span><span class="pln"> </span><span class="typ">One</span><span class="pln"> </span><span class="typ">Candle</span><span class="pun">”</span><span class="pln"> by </span><span class="typ">Yosa</span><span class="pln"> </span><span class="typ">Buson</span></pre>

<p>
	بعد إضافة المحتوى إلى الملف، احفظ التعديلات وأغلقه؛ وإذا كنت تستخدم محرر النصوص نانو يمكنك تنفيذ ذلك بالضغط على "CTRL + X"، ثم "Y"، ثم "ENTER".
</p>

<p>
	ثم نفذ الأمر <code>git add</code> لإضافة الملف الجديد إلى إلى مستودعك المحلي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_343_52" style="">
<span class="pln">git add more</span><span class="pun">-</span><span class="pln">poetry</span><span class="pun">.</span><span class="pln">md</span></pre>

<p>
	إذا أردت إضافة رسالة إيداع أطول، نفِّذ الأمر <code>git commit</code> دون إضافة أية رايات لفتح محرر النصوص الافتراضي على <a href="https://academy.hsoub.com/files/24-%D8%A3%D9%86%D8%B8%D9%85%D8%A9-%D8%A7%D9%84%D8%AA%D8%B4%D8%BA%D9%8A%D9%84-%D9%84%D9%84%D9%85%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D9%86/" rel="">نظام التشغيل</a> لديك.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_343_54" style="">
<span class="pln">git commit</span></pre>

<p>
	إذا أردت ضبط محرر النصوص الافتراضي لديك، نفِّذ الأمر <code>git config</code> وحدد نانو مثلًا ليكون المحرر الافتراضي:
</p>

<pre class="ipsCode">
git config --global core.editor "nano"
</pre>

<p>
	أو ليكن محرر النصوص فيم vim:
</p>

<pre class="ipsCode">
git config --global core.editor "vim"
</pre>

<p>
	وبعد تنفيذ الأمر، ستعرض نافذة الطرفية مستندًا جاهزًا لتعديله حسب محرر النصوص الافتراضي الذي تستخدمه، وسيبدو المستند مشابهًا للنموذج التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_343_56" style="">
<span class="pun">#</span><span class="pln"> </span><span class="typ">Please</span><span class="pln"> enter the commit message </span><span class="kwd">for</span><span class="pln"> your changes</span><span class="pun">.</span><span class="pln"> </span><span class="typ">Lines</span><span class="pln"> starting
</span><span class="pun">#</span><span class="pln"> </span><span class="kwd">with</span><span class="pln"> </span><span class="str">'#'</span><span class="pln"> will be ignored</span><span class="pun">,</span><span class="pln"> and an empty message aborts the commit</span><span class="pun">.</span><span class="pln">
</span><span class="pun">#</span><span class="pln"> </span><span class="typ">On</span><span class="pln"> branch </span><span class="kwd">new</span><span class="pun">-</span><span class="pln">branch
</span><span class="pun">#</span><span class="pln"> </span><span class="typ">Your</span><span class="pln"> branch is up</span><span class="pun">-</span><span class="pln">to</span><span class="pun">-</span><span class="pln">date </span><span class="kwd">with</span><span class="pln"> </span><span class="str">'origin/new-branch'</span><span class="pun">.</span><span class="pln">
</span><span class="pun">#</span><span class="pln">
</span><span class="pun">#</span><span class="pln"> </span><span class="typ">Changes</span><span class="pln"> to be committed</span><span class="pun">:</span><span class="pln">
</span><span class="pun">#</span><span class="pln">       modified</span><span class="pun">:</span><span class="pln">   </span><span class="kwd">new</span><span class="pun">-</span><span class="pln">feature</span><span class="pun">.</span><span class="pln">py
</span><span class="pun">#</span></pre>

<p>
	أضف رسالة الإيداع إلى الملف النصي أسفل التعليقات الافتتاحية.
</p>

<p>
	لكتابة رسالة إيداع مفيدة، عليك أن تضيف في السطر الأول ملخصًا يتألف من حوالي 50 حرفًا، ثم أضِف تحته توصيفًا ينص على سبب إجرائك لهذا التعديل، وآلية عمل شيفرتك البرمجية، ومعلوماتٍ إضافية ستحدد سياقها وتوضِّحها للآخرين الذين سيراجعون عملك بعد دمجه، وقسِّم كل ما سبق إلى مقاطع مفهومة، وحاول قدر استطاعتك أن تكون رسالتك مفيدةً وتفاعليةً لتضمن أن يفهم مشرفو المشروع مساهمتك فهمًا تامًا.
</p>

<h2>
	تعديلات الدفع push
</h2>

<p>
	بعد أن تحفظ ملف رسالة الإيداع النصي وتغلقه، يمكنك التحقق من رسالة الإيداع التي ستخصِّصها غيت بتنفيذ الأمر التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_343_58" style="">
<span class="pln"> git status</span></pre>

<p>
	وسيكون الخرج مشابهًا للنموذج التالي حسب التعديلات التي أجريتها:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_343_60" style="">
<span class="typ">On</span><span class="pln"> branch </span><span class="kwd">new</span><span class="pun">-</span><span class="pln">branch
nothing to commit</span><span class="pun">,</span><span class="pln"> working tree clean</span></pre>

<p>
	تستطيع في هذه المرحلة تنفيذ الأمر <code>git push</code> لتطبيق التعديلات على الفرع الحالي لمستودعك المُشتَق:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_343_62" style="">
<span class="pln">git push </span><span class="pun">--</span><span class="kwd">set</span><span class="pun">-</span><span class="pln">upstream origin </span><span class="kwd">new</span><span class="pun">-</span><span class="pln">branch</span></pre>

<p>
	سيزودك هذا الأمر بخرجٍ يُعلمك بمسار التقدم، وسيبدو مثل النموذج التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_343_65" style="">
<span class="typ">Counting</span><span class="pln"> objects</span><span class="pun">:</span><span class="pln"> </span><span class="lit">3</span><span class="pun">,</span><span class="pln"> done</span><span class="pun">.</span><span class="pln">
</span><span class="typ">Delta</span><span class="pln"> compression using up to </span><span class="lit">4</span><span class="pln"> threads</span><span class="pun">.</span><span class="pln">
</span><span class="typ">Compressing</span><span class="pln"> objects</span><span class="pun">:</span><span class="pln"> </span><span class="lit">100</span><span class="pun">%</span><span class="pln"> </span><span class="pun">(</span><span class="lit">2</span><span class="pun">/</span><span class="lit">2</span><span class="pun">),</span><span class="pln"> done</span><span class="pun">.</span><span class="pln">
</span><span class="typ">Writing</span><span class="pln"> objects</span><span class="pun">:</span><span class="pln"> </span><span class="lit">100</span><span class="pun">%</span><span class="pln"> </span><span class="pun">(</span><span class="lit">3</span><span class="pun">/</span><span class="lit">3</span><span class="pun">),</span><span class="pln"> </span><span class="lit">336</span><span class="pln"> bytes </span><span class="pun">|</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> bytes</span><span class="pun">/</span><span class="pln">s</span><span class="pun">,</span><span class="pln"> done</span><span class="pun">.</span><span class="pln">
</span><span class="typ">Total</span><span class="pln"> </span><span class="lit">3</span><span class="pln"> </span><span class="pun">(</span><span class="pln">delta </span><span class="lit">0</span><span class="pun">),</span><span class="pln"> reused </span><span class="lit">0</span><span class="pln"> </span><span class="pun">(</span><span class="pln">delta </span><span class="lit">0</span><span class="pun">)</span><span class="pln">
</span><span class="typ">To</span><span class="pln"> https</span><span class="pun">:</span><span class="com">//github.com/your-username/repository.git</span><span class="pln">
   a1f29a6</span><span class="pun">..</span><span class="lit">79c0e80</span><span class="pln">  </span><span class="kwd">new</span><span class="pun">-</span><span class="pln">branch  </span><span class="pun">-&gt;</span><span class="pln"> </span><span class="kwd">new</span><span class="pun">-</span><span class="pln">branch
</span><span class="typ">Branch</span><span class="pln"> </span><span class="kwd">new</span><span class="pun">-</span><span class="pln">branch </span><span class="kwd">set</span><span class="pln"> up to track remote branch </span><span class="kwd">new</span><span class="pun">-</span><span class="pln">branch from origin</span><span class="pun">.</span></pre>

<p>
	انتقل الآن إلى مستودعك المشتق على صفحة موقع غيت هَب وبدِّل إلى الفرع الذي طبقت عليه التعديلات لمشاهدتها ضمن المتصفح، إذ يمكنك في هذه المرحلة إنشاء طلب سحب إلى المستودع الأصلي؛ لكن إذا لم تفعل ذلك مسبقًا، يُستحسن أن تتأكد أن مستودعك المحلي محدَّثًا مع المستودع الأولي upstream.
</p>

<h2>
	تحديث المستودع المحلي
</h2>

<p>
	أثناء عملك على مشروع إلى جانب مساهمين آخرين، من المهم أن تبقي مستودعك المحلي محدثًا مع المشروع، فليس من مصلحتك أن تنشئ طلب سحب لشيفرةٍ برمجية ستسبب تعارضًا مع شيفراتٍ برمجية أخرى. ولتبقى نسخة الشيفرة البرمجية المحلية محدَّثةً، ستحتاج إلى مزامنة التعديلات.
</p>

<p>
	سنبدأ باستعراض ضبط مستودع بعيد remote للاشتقاق، ثم مزامنته.
</p>

<h3>
	ضبط مستودع بعيد للاشتقاق
</h3>

<p>
	تتيح لك <strong>المستودعات البعيدة Remote repositories</strong> المساهمة مع الآخرين على مشروع في غيت، إذ يُعَد كل مستودعٍ بعيد إصدارًا من إصدارات المشروع المُستضافة على الإنترنت، أو الموجودة على شبكةٍ يمكنك الوصول إليها. ويجب أن يتوفر لديك وصول إلى كل مستودع بعيد؛ إما بصلاحيات قراءة فقط، أو صلاحيات قراءة وكتابة، ويعتمد ذلك على صلاحيات المستخدم الخاص بك.
</p>

<p>
	تحتاج إلى ضبط مستودعٍ بعيدٍ مرجعي إلى المستودع الأولي حتى تتمكن من مزامنة التعديلات التي تجريها في المستودع المشتَق مع المستودع الأصلي الذي تعمل عليه، كما ينبغي عليك إعداد المستودع البعيد ليتزامن مع المستودع الأصلي مرةً واحدةً فقط.
</p>

<p>
	لنبدأ بالتحقق ما هي الخوادم البعيدة التي ضبطتها، إذ سيعرض الأمر <code>git remote</code> المستودعات البعيدة التي حدَّدتها مُسبقًا؛ لذا إذا استنسخت مستودعك كما فعلنا سابقًا، سترى المستودع الرئيسي origin repository على الأقل، وهو الاسم الافتراضي الذي تطلقه غيت للمجلد المستنسَخ.
</p>

<p>
	سنستخدم الأمر <code>git remote</code> إضافةً إلى الراية <code>v</code> عندما نكون ضمن مجلد المستودع في طرفيتنا لعرض الروابط التي خزَّنها غيت إضافةً إلى الأسماء المختصرة للمستودعات البعيدة ذات الصلة، مثل "origin":
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_343_68" style="">
<span class="pln">git remote </span><span class="pun">-</span><span class="pln">v</span></pre>

<p>
	سيبدو الخرج مشابهًا للنموذج التالي بما أننا استنسخنا مستودعًا:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_343_70" style="">
<span class="pln">origin    https</span><span class="pun">:</span><span class="com">//github.com/your-username/forked-repository.git (fetch)</span><span class="pln">
origin    https</span><span class="pun">:</span><span class="com">//github.com/your-username/forked-repository.git (push)</span></pre>

<p>
	إذا أعددت أكثر من مستودع مسبقًا، سيزودك الأمر <code>git remote -v</code> بقائمةٍ تعرضها جميعًا.
</p>

<p>
	ثم سنحدد مستودعًا رئيسيًا بعيدًا جديد لنزامنه مع المستودع المُشتَق، وسيكون هذا المستودع بمثابة المستودع الأصلي الذي اشتقينا منه، وسننفِّذ ذلك بواسطة الأمر <code>git remote add</code>:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_343_72" style="">
<span class="pln">git remote add upstream https</span><span class="pun">:</span><span class="com">//github.com/original-owner-username/original-repository.git</span></pre>

<p>
	تشير <code>upstream</code> في هذا المثال إلى الاسم المختصر المُسنَد إلى المستودع البعيد، بما أن "upstream" في مصطلحات غيت تشير إلى المستودع الذي استنسخنا منه؛ وإذا أردنا إضافة مؤشر بعيد remote pointer إلى مستودع أحد المساهمين، علينا تقديم اسم مستخدم ذلك المساهم، أو اسمًا مستعارًا مختصرًا للاسم المُختصر.
</p>

<p>
	للتحقق من إضافة مؤشرنا البعيد إلى المستودع الأولي كما ينبغي، استعن بالأمر <code>git remote -v</code> مجددًا من مجلد المستودع:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_343_75" style="">
<span class="pln">git remote </span><span class="pun">-</span><span class="pln">v</span></pre>

<p>
	وسيكون الخرج:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_343_77" style="">
<span class="pln">origin    https</span><span class="pun">:</span><span class="com">//github.com/your-username/forked-repository.git (fetch)</span><span class="pln">
origin    https</span><span class="pun">:</span><span class="com">//github.com/your-username/forked-repository.git (push)</span><span class="pln">
upstream    https</span><span class="pun">:</span><span class="com">//github.com/original-owner-username/original-repository.git (fetch)</span><span class="pln">
upstream    https</span><span class="pun">:</span><span class="com">//github.com/original-owner-username/original-repository.git (push)</span></pre>

<p>
	تستطيع الآن ذكر <code>upstream</code> في موجه الأوامر بدلًا من كتابة الرابط كاملًا، وأصبحت جاهزًا لمزامنة مستودعك المشتَق مع المستودع الأصلي.
</p>

<h3>
	مزامنة المستودع المشتَق
</h3>

<p>
	بعد ما ضبطنا مستودعًا بعيدًا يشير إلى المستودعين الأولي والأصلي على غيت هَب، أصبحنا جاهزين لمزامنة مستودعنا المشتق لنبقيه محدَّثًا، ولتحقيق ذلك سننفذ الأمر <code>git fetch</code> عندما نكون ضمن مجلد مستودعنا المحلي في الطرفية، ليجلب الفروع ورسائل الإيداع التابعة لها من المستودع الرئيسي. وبما أننا استخدمنا الاسم المختصر "upstream" للإشارة إلى المستودع الأولي، سنذكره في صيغة الأمر:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_343_79" style="">
<span class="pln">git fetch upstream</span></pre>

<p>
	سيختلف الخرج الذي ستتلقاه على حسب كمية التعديلات المُجراة منذ اشتققنا المستودع، وقد يتضمن بعض الأسطر عن عدّ العناصر وضغطها وفك ضغطها، إذ سيبدو الخرج مشابهًا للنموذج التالي، لكنه قد يختلف حسب عدد الأفرع التي يتألف منها المشروع:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_343_81" style="">
<span class="typ">From</span><span class="pln"> https</span><span class="pun">:</span><span class="com">//github.com/original-owner-username/original-repository</span><span class="pln">
 </span><span class="pun">*</span><span class="pln"> </span><span class="pun">[</span><span class="kwd">new</span><span class="pln"> branch</span><span class="pun">]</span><span class="pln">      main     </span><span class="pun">-&gt;</span><span class="pln"> upstream</span><span class="pun">/</span><span class="pln">main</span></pre>

<p>
	ستُخزَّن الآن رسائل إيداع الفرع الرئيسي في فرعٍ محلي يُسمى "upstream/main". لننتقل إلى الفرع الرئيسي المحلي لمستودعنا:
</p>

<pre class="ipsCode">
git checkout main
</pre>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_343_83" style="">
<span class="typ">Switched</span><span class="pln"> to branch </span><span class="str">'main'</span></pre>

<p>
	سندمج الآن أية تعديلات أجريت في الفرع الرئيسي للمستودع الأصلي مع فرعنا الرئيسي المحلي، إذ سنصل إلى الفرع الرئيسي من خلال فرعنا الرئيسي/الأولي المحلي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_343_86" style="">
<span class="pln">git merge upstream</span><span class="pun">/</span><span class="pln">main</span></pre>

<p>
	سيتغير خرج هذا الأمر، لكنه سيبدأ بكلمة "updating" إذا أجريت تعديلات؛ أو "Already up-to-date" في حال عدم إجراء أية تعديلات منذ اشتقاق المستودع.
</p>

<p>
	أصبح الفرع الرئيسي للمستودع المشتَق متزامنًا مع المستودع الأولي، ولن تفقد أية تعديلات محلية تجريها.
</p>

<p>
	يمكنك تكرار مزامنة مستودعك المشتق مع الشيفرة البرمجية الأولية للمستودع الرئيسي بالقدر الذي تجده مناسبًا وذلك حسب سير عملك والوقت الذي تقضيه في إجراء التعديلات. لكن لا بُد من مزامنة مستودعك المشتق مباشرةً قبل أن تنشئ طلب سحب لتتأكد أنك لا تتسبب في تضارب الشيفرات البرمجية.
</p>

<h2>
	إنشاء طلب سحب
</h2>

<p>
	أصبحت في هذه المرحلة جاهزًا لإنشاء طلب سحب إلى المستودع الرئيسي.
</p>

<p>
	انتقل إلى مستودعك المشتق واضغط على زر <strong>طلب سحب جديد New pull request</strong> الموجود على الجانب اليساري من الصفحة.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="99049" href="https://academy.hsoub.com/uploads/monthly_2022_05/004PRButton.png.add543d1e6bd6d041cf8171e61cd6e9f.png" rel=""><img alt="004PRButton.png" class="ipsImage ipsImage_thumbnailed" data-fileid="99049" data-unique="4c6s8iha2" src="https://academy.hsoub.com/uploads/monthly_2022_05/004PRButton.png.add543d1e6bd6d041cf8171e61cd6e9f.png" style="width: 450px; height: auto;"></a>
</p>

<p style="text-align: center;">
	(زر طلب سحب جديد)
</p>

<p>
	تستطيع تعديل الفرع في الصفحة التالية، كما يمكنك اختيار المستودع والفرع الملائمَين في كلا الصفحتين من القائمة المنسدلة؛ فمثلًا عندما تختار الفرع الرئيسي من المستودع الأصلي الموجود في الجانب اليساري من الصفحة، والفرع الجديد new-branch من مستودعك المشتق الموجود على الجانب اليميني من الصفحة، ستظهر لك صفحةٌ تنص على أنك تستطيع دمج فروعك، إذا لم يوجد فيها شيفرةً برمجيةً متضاربة:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="99050" href="https://academy.hsoub.com/uploads/monthly_2022_05/005PullRequest.png.703115e1c35bc64cfdd40635899c8b72.png" rel=""><img alt="005PullRequest.png" class="ipsImage ipsImage_thumbnailed" data-fileid="99050" data-unique="q5jqpig1n" src="https://academy.hsoub.com/uploads/monthly_2022_05/005PullRequest.thumb.png.2efcf401a73890a1551ae0c9270762e0.png" style="width: 600px; height: auto;"></a>
</p>

<p style="text-align: center;">
	(طلب سحب)
</p>

<p>
	أضِف عنوانًا وتعليقًا في الحقول المناسبة، ثم اضغط زر إنشاء طلب سحب Create pull request، وسيقرر المشرفون على المستودع الرئيسي في هذه المرحلة هل يقبلون طلب السحب الذي أنشأته أم لا، وقد يطلبون منك تعديل، أو تنقيح شيفرتك البرمجية قبل قبول طلب السحب.
</p>

<h2>
	الخاتمة
</h2>

<p>
	لقد نجحت في هذه المرحلة بإرسال طلب سحب إلى مستودع برنامج مفتوح المصدر. وعليك بعد ذلك أن تحرص على تحديث وإعادة تأسيس rebase شيفرتك البرمجية خلال فترة انتظارك مُراجعتها، واِستعد لإعادة صياغة شيفرتك البرمجية إذا طلب منك المشرفون على المشروع ذلك.
</p>

<p>
	قد تكون مساهمتك في المشاريع مفتوحة المصدر وارتقائك لتصبح مطورًا نشطًا للبرامج مفتوحة المصدر تجربةً مثمرةً؛ كما تتيح مساهماتك الدورية في برنامجٍ تعمل عليه باستمرار لك التأكُّد من تقديم هذا البرنامج للمستخدمين النهائيين بأمثل إصدار ممكن له.
</p>

<p>
	إذا كنت مهتمًا بتعلم المزيد عن نظام غيت والمساهمة في البرامج مفتوحة المصدر، فاطلع على سلسلة دروسنا التعليمية التي تحمل عنوان م<a href="https://academy.hsoub.com/programming/workflow/git/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%A7%D9%84%D9%85%D8%B3%D8%A7%D9%87%D9%85%D8%A9-%D9%81%D9%8A-%D8%A7%D9%84%D9%85%D8%B4%D8%A7%D8%B1%D9%8A%D8%B9-%D9%85%D9%81%D8%AA%D9%88%D8%AD%D8%A9-%D8%A7%D9%84%D9%85%D8%B5%D8%AF%D8%B1-%D8%A7%D8%A8%D8%AF%D8%A3-%D8%A8%D8%AA%D8%B9%D9%84%D9%85-%D9%86%D8%B8%D8%A7%D9%85-git-r1580/" rel="">قدمة عن البرامج مفتوحة المصدر</a>، أما إذا كانت معرفتك لا بأس بها عن نظام غيت وترغب في الحصول على ورقة مرجعية عنه اطلع على المقالة كيف تستخدم نظام غيت: دليل مرجعي.
</p>

<p>
	ترجمة -وبتصرف- للمقال <a href="https://www.digitalocean.com/community/tutorials/how-to-create-a-pull-request-on-github" rel="external nofollow">How To Create a Pull Request on GitHub</a> لصاحبته Lisa Tagliaferri.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
<li>
		<a href="https://academy.hsoub.com/programming/workflow/git/%d9%83%d9%8a%d9%81-%d8%aa%d8%b3%d8%a7%d9%87%d9%85-%d9%81%d9%8a-%d9%85%d8%b4%d8%a7%d8%b1%d9%8a%d8%b9-%d9%85%d9%81%d8%aa%d9%88%d8%ad%d8%a9-%d8%a7%d9%84%d9%85%d8%b5%d8%af%d8%b1-%d8%b9%d9%84%d9%89-github-r265/" rel="">كيف تساهم في مشاريع مفتوحة المصدر على Github</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/workflow/git/%D9%81%D9%8A%D8%AF%D9%8A%D9%88-%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-git-r658/" rel="">أساسيات Git</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">1581</guid><pubDate>Fri, 27 May 2022 15:01:00 +0000</pubDate></item><item><title>&#x643;&#x64A;&#x641;&#x64A;&#x629; &#x627;&#x644;&#x645;&#x633;&#x627;&#x647;&#x645;&#x629; &#x641;&#x64A; &#x627;&#x644;&#x645;&#x634;&#x627;&#x631;&#x64A;&#x639; &#x645;&#x641;&#x62A;&#x648;&#x62D;&#x629; &#x627;&#x644;&#x645;&#x635;&#x62F;&#x631;: &#x627;&#x628;&#x62F;&#x623; &#x628;&#x62A;&#x639;&#x644;&#x645; &#x646;&#x638;&#x627;&#x645; Git</title><link>https://academy.hsoub.com/programming/workflow/git/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%A7%D9%84%D9%85%D8%B3%D8%A7%D9%87%D9%85%D8%A9-%D9%81%D9%8A-%D8%A7%D9%84%D9%85%D8%B4%D8%A7%D8%B1%D9%8A%D8%B9-%D9%85%D9%81%D8%AA%D9%88%D8%AD%D8%A9-%D8%A7%D9%84%D9%85%D8%B5%D8%AF%D8%B1-%D8%A7%D8%A8%D8%AF%D8%A3-%D8%A8%D8%AA%D8%B9%D9%84%D9%85-%D9%86%D8%B8%D8%A7%D9%85-git-r1580/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2022_05/6284db5177209_---Git.png.eda64e565abf8f281920d303d1122fbb.png" /></p>

<p>
	تفيد المساهمات التي يقدمها مجتمع المطوّرين العام المشاريع <a href="https://academy.hsoub.com/programming/general/%D9%85%D8%A7-%D8%A7%D9%84%D9%85%D9%82%D8%B5%D9%88%D8%AF-%D8%A8%D9%85%D8%B5%D8%B7%D9%84%D8%AD-%D9%85%D9%81%D8%AA%D9%88%D8%AD-%D8%A7%D9%84%D9%85%D8%B5%D8%AF%D8%B1-open-source%D8%9F-r885/" rel="">مفتوحة المصدر</a> المستضافة في المستودعات repositories العامة، وتُدار عادةً من خلال نظام غيت Git.
</p>

<p>
	غيت هو نظام التحكم بالإصدارات الموزع، وهو يساعد كلًا من الأفراد والفرق على المساهمة في المشاريع البرمجية مفتوحة المصدر وتنقيحها، ويُعد نظام غيت بحد ذاته نموذجًا عن المشاريع مفتوحة المصدر؛ فهو متاحٌ للتنزيل والاستخدام مجانًا.
</p>

<p>
	سنناقش في هذا الدرس التعليمي فوائد المساهمة في المشاريع مفتوحة المصدر، ونتحدث عن طريقة تثبيت نظام غيت وإعداده لتتمكن من المساهمة في المشاريع البرمجية.
</p>

<p>
	يُعد هذا المقال جزءًا من سلسلة مقالات حول "المساهمة في المشاريع مفتوحة المصدر":
</p>

<ul>
<li>
		كيف تساهم في المشاريع مفتوحة المصدر: ابدأ بتعلم نظام Git
	</li>
	<li>
		<a href="%D8%B1%D8%A7%D8%A8%D8%B7" rel="">إنشاء طلب سحب pull request على GitHub</a>
	</li>
	<li>
		<a href="%D8%B1%D8%A7%D8%A8%D8%B7" rel="">إعادة تأسيس طلب السحب وتحديثه</a>
	</li>
	<li>
		<a href="%D8%B1%D8%A7%D8%A8%D8%B7" rel="">الإشراف على مشاريع البرمجيات مفتوحة المصدر عبر GitHub</a>
	</li>
	<li>
		<a href="%D8%B1%D8%A7%D8%A8%D8%B7" rel="">تراخيص البرامج مفتوحة المصدر</a>
	</li>
	<li>
		<a href="%D8%B1%D8%A7%D8%A8%D8%B7" rel="">الدليل المرجعي للعمل على نظام Git</a>
	</li>
</ul>
<h2>
	المساهمة في المشاريع مفتوحة المصدر
</h2>

<p>
	البرنامج مفتوح المصدر: هو البرنامج المُتاح استخدامه وإعادة توزيعه وتعديله مجانًا.
</p>

<p>
	تشجع المشاريع التي تتبع نموذج التطوير مفتوح المصدر على عملية تتسم بالشفافية وتحقق تقدمًا من خلال مراجعة النظراء الموزَّعة distributed peer review؛ ويمكن تحديث المشاريع مفتوحة المصدر بسرعة وحسب الطلب؛ كما أنها تقدِّم برنامجًا مرنًا وموثوقًا غير مبني على أنظمة مغلقة مسجَّلة الملكية.
</p>

<p>
	تساعد المساهمة في المشاريع مفتوحة المصدر على ضمان أن يكون إصدارها هو أفضل إصدار يمكن تقديمه، وأنها ممثلةٌ عن شريحةٍ واسعةٍ من مستخدمي التكنولوجيا النهائيين؛ إذ عندما يساهم المستخدمون النهائيون في الشيفرات البرمجية للمشاريع مفتوحة المصدر، أو توثيقها documentation، فستضيف وجهات نظرهم المتنوعة فائدةً تعود على المشروع والمستخدمين النهائيين ومجتمع المطورين العام.
</p>

<p>
	يُعد البدء بالمساهمة في برنامج تستخدمه أصلًا أفضل طريقة تبدأ بها في المساهمة في المشاريع مفتوحة المصدر؛ فعندما تستخدم أداةً معينةً، تكون مدركًا جيدًا للوظائف الأنفع للمشروع. وبالتالي، احرص على قراءة أي توثيق مُتاحٍ عن البرنامج أولًا، إذ ستجد ملف "CONTRIBUTING.md" عادةً في الملف الجذر root directory للعديد من المشاريع مفتوحة المصدر؛ وهو ملف ينبغي قراءته بدقة قبل المساهمة في أي مشروع، كما يُنصَح بتكوين فكرةٍ عن التفاعل بين المطوّرين الآخرين في هذه المنظومة، إذا وجدت منتديات متاحةً تتناول هذا المشروع.
</p>

<p>
	وأخيرًا، إذا كنت تخطو أول خطوةٍ في المساهمة في برنامج مفتوح المصدر، يستحسن أن تبدأ بتقديم مساهمات بسيطة، ولا تستخف بها؛ فكل مساهمة قيّمة مهما صغرت، ويمكنك أن تبدأ بتصحيح الأخطاء المطبعية، أو إضافة تعليقات، أو كتابة توثيق أوضح.
</p>

<h2>
	نظام الإصدارات Git
</h2>

<p>
	يُعد غيت أحد أكثر أنظمة إدارة إصدارات البرمجيات انتشارًا، وقد ابتُكر من قبل مبتكر نواة نظام التشغيل لينوكس لينوس تورفالدس Linus Torvalds عام 2005، إذ كان يُستخدَم في تطوير نواة <a href="https://academy.hsoub.com/devops/linux/%D9%85%D8%A7-%D9%87%D9%88-%D9%86%D8%B8%D8%A7%D9%85-%D8%A7%D9%84%D8%AA%D8%B4%D8%BA%D9%8A%D9%84-%D9%84%D9%8A%D9%86%D9%83%D8%B3%D8%9F-r451/" rel="">نظام لينوكس</a>، والمشرف الحالي عليه هو جونيو هامانو Junio Hamano.
</p>

<p>
	يحتفظ العديد من المشاريع بملفاتهم في مستودع repository غيت، كما نظمت مواقع، مثل <a href="https://academy.hsoub.com/programming/workflow/git/%d9%83%d9%8a%d9%81-%d8%aa%d8%b3%d8%a7%d9%87%d9%85-%d9%81%d9%8a-%d9%85%d8%b4%d8%a7%d8%b1%d9%8a%d8%b9-%d9%85%d9%81%d8%aa%d9%88%d8%ad%d8%a9-%d8%a7%d9%84%d9%85%d8%b5%d8%af%d8%b1-%d8%b9%d9%84%d9%89-github-r265/" rel="">غيت هَب GitHub</a> وغيت لاب GitLab وبيت بَكيت Bitbucket عملية مشاركة الشيفرات البرمجية والمساهمة فيها. ويُعد كل مجلد عمل working directory في غيت مستودعًا متكاملًا، إضافةً إلى تقديمه تاريخًا وتتبعًا كاملًا بصرف النظر عن الوصول إلى الشبكة، أو الخادم المركزي.
</p>

<p>
	أصبحت إدارة الإصدارات أداةً لا غنى عنها في أسلوب تطوير البرامج المعاصر، لأن هذه الأنظمة تتيح لك متابعة البرنامج على مستوى المصدر، وستتمكن مع زملائك من فريق المطورين متابعة التعديلات والتراجع إلى المراحل السابقة وإصدار شيفرات فرعية عن الشيفرة البرمجية الأساسية لإنشاء إصدارات بديلة عن الملفات، أو المجلدات.
</p>

<p>
	تكمن فائدة نظام غيت على المشاريع مفتوحة المصدر في تنسيقه لمساهمات العديد من المطورين؛ إذ ينشئ كل مطور إصدارًا فرعيًا عن الفرع الأساسي للمستودع الرئيسي للشيفرة البرمجية، لعزل التعديلات التي طبَّقها، ثم ينشئ طلب سحب pull request لدمج هذه التعديلات في المشروع الرئيسي.
</p>

<p>
	حتى نستخدم نظام غيت للمساهمة في المشاريع مفتوحة المصدر، دعنا نتأكد أولًا إذا كان مثبتًا؛ وإذا لم يكن مثبتًا، دعنا نطلعك على كيفية تثبيته على جهازك المحلي.
</p>

<h2>
	التحقق من تثبيت نظام غيت
</h2>

<p>
	ابدأ بالتحقق إذا كانت أدوات واجهة أوامر غيت مثبتة على جهازك، إذ من المُرجح أن يكون نظام غيت مثبتًا مسبقًا على جهازك المحلي إذا كنت تنشئ مستودعات لشيفراتك البرمجية الخاصة، كما يكون نظام غيت مثبتًا افتراضيًا على بعض أنظمة التشغيل، لذا يفضَّل التحقق إذا كان مثبتًا قبل البدء بتثبيته.
</p>

<p>
	يمكنك التحقق ما إذا كان نظام غيت مثبتًا ومن إصداره الحالي بفتح نافذة طرفية terminal في <a href="https://academy.hsoub.com/files/24-%D8%A3%D9%86%D8%B8%D9%85%D8%A9-%D8%A7%D9%84%D8%AA%D8%B4%D8%BA%D9%8A%D9%84-%D9%84%D9%84%D9%85%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D9%86/" rel="">نظامي التشغيل</a> لينوكس أو ماك Mac، أو نافذة موجه الأوامر command prompt في نظام التشغيل ويندوز، وطباعة الأمر التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4033_11" style="">
<span class="pln">$ git </span><span class="pun">--</span><span class="pln">version</span></pre>

<p>
	إذا لم يكن نظام غيت مثبتًا، فسيرد خطأٌ مشابهٌ لما يلي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4033_14" style="">
<span class="pun">-</span><span class="pln">bash</span><span class="pun">:</span><span class="pln"> git</span><span class="pun">:</span><span class="pln"> command not found</span></pre>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4033_16" style="">
<span class="str">'git'</span><span class="pln"> is not recognized as an internal or external command</span><span class="pun">,</span><span class="pln"> operable program</span><span class="pun">,</span><span class="pln"> or batch file</span><span class="pun">.</span></pre>

<p>
	وعليك في هذه الحالة تثبيت نظام غيت على جهازك، وسنستعرض في الفقرة التالية آلية التثبيت على أهم أنظمة التشغيل.
</p>

<h2>
	تثبيت نظام غيت على نظام التشغيل لينكس
</h2>

<p>
	إن أسهل طريقة لتثبيت نظام غيت <a href="https://academy.hsoub.com/programming/workflow/git/%d8%a5%d8%b9%d8%af%d8%a7%d8%af-git-%d9%84%d9%84%d9%85%d8%b1%d8%a9-%d8%a7%d9%84%d8%a3%d9%88%d9%84%d9%89-r260/" rel="">وإعداده للعمل</a> حتى الآن، هي استخدام الإصدار المتوفر لديك من مستودعات لينوكس الافتراضية. لنستعرض آلية تثبيت نظام غيت على نظام التشغيل لينوكس على جهازك المحلي من خلال اتباع هذه الطريقة:
</p>

<h3>
	تثبيت نظام غيت على توزيعة أبونتو Ubuntu أو ديبيان Debian
</h3>

<p>
	استخدم <a href="https://academy.hsoub.com/devops/linux/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D8%A5%D8%AF%D8%A7%D8%B1%D8%A9-%D8%A7%D9%84%D8%AD%D8%B2%D9%85-apt-%D8%8Cyum-%D8%8Cdnf-%D8%8Cpkg-r231/" rel="">أداة APT لإدارة الحزم</a> لتحديث دليل الحزم المحلي لديك، ثم يمكنك بعد ذلك تنزيل وتثبيت البرنامج:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4033_21" style="">
<span class="pln">$ sudo apt update
$ sudo apt install git</span></pre>

<p>
	بالرغم من أن هذه الطريقة هي الأسرع لتثبيت نظام غيت، قد لا يكون الإصدار المثبت من خلالها هو أحدث إصدار موجود؛ وإذا احتجت إلى تثبيت أحدث إصدار، جمّع نظام غيت من <a href="https://git-scm.com/downloads" rel="external nofollow">المصدر</a>.
</p>

<h3>
	تثبيت نظام غيت على توزيعة سينتوس CentOS
</h3>

<p>
	سنستخدم <a href="https://academy.hsoub.com/devops/linux/18-%D9%85%D8%AB%D8%A7%D9%84%D8%A7-%D9%84%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D9%85%D8%AF%D9%8A%D8%B1-%D8%A7%D9%84%D8%AD%D8%B2%D9%85-yum-r282/" rel="">yum</a>؛ مدير الحزم الافتراضي في سينتوس للبحث عن أحدث حزمة غيت متوفرة في مستودعات سينتوس وتثبيتها. لنتحقق أولًا أن yum محدَّثة من خلال تنفيذ الأمر التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4033_24" style="">
<span class="pln">$ sudo yum </span><span class="pun">-</span><span class="pln">y update</span></pre>

<p>
	إذ تُستخدَم الراية <code>y-</code> لتنبيه النظام بأننا ندرك أنه ستجري تغييرات، فامنع الطرفية أن تطلب منا تأكيدها.
</p>

<p>
	يمكننا الآن المتابعة وتثبيت غيت:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4033_26" style="">
<span class="pln">$ sudo yum install git</span></pre>

<p>
	بالرغم من أن هذه الطريقة هي الأسرع لتثبيت نظام غيت، قد لا يكون الإصدار المثبت من خلالها هو أحدث إصدار موجود؛ وإذا احتجت إلى تثبيت أحدث إصدار، جمّع نظام غيت من <a href="https://git-scm.com/downloads" rel="external nofollow">المصدر</a>.
</p>

<h3>
	تثبيت نظام غيت على توزيعة فيدورا Fedora
</h3>

<p>
	إن حزم غيت متاحةٌ على توزيعة فيدورا من خلال مديري الحزم yum و dnf؛ إذ أن DNF أو دانديفايد يَم Dandified Yum استُحدث في إصدار فيدورا الثامن عشر، وأصبح مدير الحزم الافتراضي لتوزيعة فيدورا منذ إصدارها الثاني والعشرين.
</p>

<p>
	يمكننا تحديث مدير الحزم dnf وتثبيت نظام غيت من نافذة الطرفية على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4033_28" style="">
<span class="pln">$ sudo dnf update
$ sudo dnf install git</span></pre>

<p>
	إذا كان إصدار فيدورا لديك أقدم، استخدم الأمر <code>yum</code> بدلًا عن ذلك. لنحدّث <code>yum</code> أولًا، ثم ثبِّت نظام غيت على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4033_30" style="">
<span class="pln">$ sudo yum update
$ sudo yum install git</span></pre>

<p>
	ويمكنك بعد ذلك المتابعة إلى فقرة إعداد نظام غيت.
</p>

<h2>
	تثبيت نظام غيت على نظام تشغيل ماك أو إس macOS
</h2>

<p>
	إذا طبعت أمر Git على نافذة طرفيتك وعلى جهاز محلي مُثبّتٌ عليه نظام تشغيل ماكنتوش Macintosh، مثل الأمر <code>git --version</code> المذكور سابقًا، فستُوجَّه prompt إلى تثبيت نظام غيت، إذا لم يكن مثبتًا مسبقًا على جهازك؛ وعندما تتلقى هذا التوجيه يجب أن تقبل تثبيت غيت واتباع التعليمات والاستجابة للتوجيهات التي تظهر على نافذة طرفية جهازك.
</p>

<p>
	تستطيع تثبيت أحدث إصدار من نظام غيت على نظام ماك من خلال المثبت الثنائي binary installer.
</p>

<p>
	يحتفظ نظام أو إس إكس OS X بمثبت نظام غيت، وهو متاحٌ للتنزيل تلقائيًا عن طريق <a href="https://git-scm.com/download/mac" rel="external nofollow">موقع غيت</a>.
</p>

<p>
	بعد تثبيت نظام غيت بالكامل، يمكنك المتابعة إلى فقرة إعداد نظام غيت.
</p>

<h2>
	تثبيت نظام غيت على نظام ويندوز
</h2>

<p>
	الإصدار الرسمي لنظام غيت على نظام التشغيل ويندوز متاحٌ للتنزيل تلقائيًا عن طريق <a href="https://git-scm.com/download/win" rel="external nofollow">موقع غيت</a>، كما يتوفر مشروع مفتوح المصدر يدعى نظام غيت للويندوز Git for Windows؛ وهو مستقل عن موقع غيت الرسمي، ويوفر أدواتٍ لكلٍ من واجهة الأوامر <a href="https://academy.hsoub.com/programming/java/%D9%85%D9%82%D8%AF%D9%85%D8%A9-%D8%A5%D9%84%D9%89-%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D9%88%D8%A7%D8%AC%D9%87%D8%A7%D8%AA-%D8%A7%D9%84%D9%85%D8%B3%D8%AA%D8%AE%D8%AF%D9%85-%D8%A7%D9%84%D8%B1%D8%B3%D9%88%D9%85%D9%8A%D8%A9-gui-%D9%81%D9%8A-%D8%AC%D8%A7%D9%81%D8%A7-r1070/" rel="">وواجهة المستخدم الرسومية</a> من أجل استخدام غيت على نظام تشغيل ويندوز بفعالية. ويمكنك الاطلاع على <a href="https://gitforwindows.org" rel="external nofollow">موقع مشروع غيت على ويندوز</a> لمزيدٍ من المعلومات عن هذا المشروع ومعاينة الشيفرة البرمجية وتنزيلها.
</p>

<p>
	بعد تثبيت نظام غيت بالكامل، يمكنك المتابعة إلى فقرة إعداد نظام غيت التالية.
</p>

<h2>
	إعداد نظام غيت
</h2>

<p>
	بعد تثبيت نظام غيت، ينبغي تنفيذ بعض الأمور الأخرى كي تتضمن رسائل الإيداع commit message التي ستتولد لك معلوماتك الصحيحة؛ وأسهل طريقة لتنفيذ ذلك من خلال الأمر <code>git config</code>، إذ لا بُد من تقديم اسمنا وبريدنا الإكتروني تحديدًا، لأن غيت يدمج هذه المعلومات في كل إيداع ننفذه. ولإضافة هذه المعلومات نكتب الأمر التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4033_33" style="">
<span class="pln">$ git config </span><span class="pun">--</span><span class="pln">global user</span><span class="pun">.</span><span class="pln">name </span><span class="str">"Your Name"</span><span class="pln">
$ git config </span><span class="pun">--</span><span class="pln">global user</span><span class="pun">.</span><span class="pln">email </span><span class="str">"youremail@domain.com"</span></pre>

<p>
	يمكننا الاطلاع على جميع عناصر الضبط المُعَدّة بكتابة الأمر التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4033_35" style="">
<span class="pln">$ git config </span><span class="pun">--</span><span class="pln">list</span></pre>

<p>
	وسيكون ضبط غيت على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4033_37" style="">
<span class="pln">user</span><span class="pun">.</span><span class="pln">name</span><span class="pun">=</span><span class="typ">Your</span><span class="pln"> </span><span class="typ">Name</span><span class="pln">
user</span><span class="pun">.</span><span class="pln">email</span><span class="pun">=</span><span class="pln">youremail@domain</span><span class="pun">.</span><span class="pln">com</span></pre>

<p>
	من المُلاحظ اختلاف هذه الصياغة اختلافًا طفيفًا، فالمعلومات مخزنةٌ في ملف ضبط غيت الخاص بك، الذي تستطيع تعديله يدويًا إذا أردت بمحرر نصوص، مثل نانو nano على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4033_39" style="">
<span class="pln">$ nano </span><span class="pun">~/.</span><span class="pln">gitconfig</span></pre>

<p>
	وستظهر لك محتويات الملف "gitconfig./~" المشابهة لما يلي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4033_41" style="">
<span class="pun">[</span><span class="pln">user</span><span class="pun">]</span><span class="pln">
    name </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Your</span><span class="pln"> </span><span class="typ">Name</span><span class="pln">
    email </span><span class="pun">=</span><span class="pln"> youremail@domain</span><span class="pun">.</span><span class="pln">com</span></pre>

<p>
	عندما تنتهي من تعديل ملفك، اضغط مفتاحي "ctrl" و"x" للخروج من محرر النصوص نانو، وعندما ترد رسالة حفظ الملف اضغط على مفتاح "y".
</p>

<p>
	توجد العديد من الخيارات الأخرى الممكن ضبطها، لكن هذان الخياران هما الأساسيان اللذان ستحتاج إليهما لمنع ظهور رسائل تحذير في المستقبل.
</p>

<h2>
	الخاتمة
</h2>

<p>
	بعدما ثبّتَّ نظام غيت وأعددته على جهازك المحلي، أصبحت جاهزًا لاستخدامه في إدارة إصدارات مشاريعك البرمجية، إضافةً إلى المساهمة في المشاريع مفتوحة المصدر المُتاحة للجميع.
</p>

<p>
	تُعَد مساهمتك في البرامج مفتوحة المصدر طريقةً رائعةً للانخراط في مجتمع المطوّرين العام، والحرص على أن يكون البرنامج المُقدَّم للجميع مُتسمًا بالجودة العالية وممثلًا لكافة المستخدمين النهائيين.
</p>

<p>
	ترجمة -وبتصرف- للمقال <a href="https://www.digitalocean.com/community/tutorials/how-to-contribute-to-open-source-getting-started-with-git" rel="external nofollow">How To Contribute to Open Source: Getting Started with Git</a> لصاحبته Lisa Tagliaferri.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
<li>
		<a href="https://academy.hsoub.com/devops/general/%D8%B5%D9%8A%D8%A7%D9%86%D8%A9-%D8%A7%D9%84%D9%85%D8%B4%D8%A7%D8%B1%D9%8A%D8%B9-%D9%85%D9%81%D8%AA%D9%88%D8%AD%D8%A9-%D8%A7%D9%84%D9%85%D8%B5%D8%AF%D8%B1-r359/" rel="">صيانة المشاريع مفتوحة المصدر</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/marketing/performance-marketing/%D9%83%D9%8A%D9%81-%D8%AA%D8%AC%D8%B9%D9%84-%D8%A7%D9%84%D9%88%D8%B5%D9%88%D9%84-%D8%A5%D9%84%D9%89%C2%A0%D9%85%D8%B4%D8%B1%D9%88%D8%B9%D9%83-%D9%85%D9%81%D8%AA%D9%88%D8%AD-%D8%A7%D9%84%D9%85%D8%B5%D8%AF%D8%B1-%D8%A3%D8%B3%D9%87%D9%84-r164/" rel="">كيف تجعل الوصول إلى مشروعك مفتوح المصدر أسهل</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/marketing/performance-marketing/%D8%B7%D8%B1%D9%82-%D8%A7%D9%84%D8%AA%D8%B9%D8%B1%D9%8A%D9%81-%D8%A8%D9%85%D8%B4%D8%B1%D9%88%D8%B9%D9%83-%D9%85%D9%81%D8%AA%D9%88%D8%AD-%D8%A7%D9%84%D9%85%D8%B5%D8%AF%D8%B1-r165/" rel="">طرق التعريف بمشروعك مفتوح المصدر</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/marketing/performance-marketing/%D9%83%D9%8A%D9%81-%D8%AA%D8%AD%D9%88%D9%84-%D9%85%D8%B3%D8%AA%D8%AE%D8%AF%D9%85%D9%8A-%D9%85%D8%B4%D8%B1%D9%88%D8%B9%D9%83-%D9%85%D9%81%D8%AA%D9%88%D8%AD-%D8%A7%D9%84%D9%85%D8%B5%D8%AF%D8%B1-%D8%A5%D9%84%D9%89-%D9%85%D8%B3%D8%A7%D9%87%D9%85%D9%8A%D9%86-r166/" rel="">كيف تحول مستخدمي مشروعك مفتوح المصدر إلى مساهمين</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">1580</guid><pubDate>Sun, 15 May 2022 15:00:00 +0000</pubDate></item><item><title>&#x628;&#x646;&#x627;&#x621; &#x645;&#x648;&#x642;&#x639;&#x643; &#x648;&#x627;&#x633;&#x62A;&#x636;&#x627;&#x641;&#x62A;&#x647; &#x628;&#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; Git</title><link>https://academy.hsoub.com/programming/workflow/git/%D8%A8%D9%86%D8%A7%D8%A1-%D9%85%D9%88%D9%82%D8%B9%D9%83-%D9%88%D8%A7%D8%B3%D8%AA%D8%B6%D8%A7%D9%81%D8%AA%D9%87-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-git-r862/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2020_04/2--Building-and-hosting-website-on-Git.jpg.88dd7e9a096fa2c4d0c8d18edb21265b.jpg" /></p>

<p>
	<a data-ss1618065301="1" href="https://academy.hsoub.com/programming/workflow/git/" rel="">برنامج Git</a> هو أحد التطبيقات النادرة التي تمكنت من جمع العديد من تقنيات الحوسبة في برنامج واحد انتهى به المطاف ليصبح بنية تحتية تخدم عدَّة تطبيقات أخرى. على الرغم من أنّ التطبيق اشتهر بتتبع التعديلات على الشفرة المصدرية خلال مراحل التطوير، إلّا أنّ لديه استخدامات أخرى لجعل طريقة عملك كمطور أسهل وأكثر تنظيما. سنستعرض في ما يلي استخدامًا إضافيًّا لتطبيق Git.
</p>

<p>
	كان إنشاء مواقع الويب، إلى عهد قريب، بسيطًا للغاية وسحريًا في آن واحد. في الأزمان الغابرة للإصدار الأول من الويب Web 1.0 (هذا المصطلح لم يكن مستخدمًا حينها) كان بإمكانك زيارة أي موقع ويب، واستعراض شفرته المصدرية ثم برمجة ملفات HTML عكسيًّا (Reverse engineering)، بتنسيقاته السطرية وتصميمه المعتمد على الجداول، وتعدُّ نفسك مبرمجًا خلال يوم أو اثنين. لكن لا يزال عليك وضع الموقع الذي أنشأته على الويب، بمعنى أنك ستتعامل مع الخوادم وبروتوكولات نقل الملفات وصلاحيات مجلدات الجذر على الخادم. رغم أن المواقع الحالية أكثر تعقيدًا موازنةً بذلك الوقت إلا أن نشر موقعك بنفسك صار أسهل، وسيزداد سهولة عند استعمالك Git.
</p>

<h2>
	أنشئ موقعًا باستعمال Hugo
</h2>

<p>
	<a data-ss1618065301="1" href="http://gohugo.io" rel="external nofollow">Hugo</a> هو مولّد مواقع ساكنة (Static site generator) مفتوح المصدر. المواقع الساكنة هي ما كونت الإنترنت سابقًا (إذا عدنا بالزمن بعيدًا بما فيه الكفاية، <em>لم يكن على الويب غيرها</em>). هنالك عدة نقاط قوة لهذه المواقع الساكنة:
</p>

<ul>
<li>
		من السهل إنشاؤها، فليس عليك كتابة نصوص برمجية.
	</li>
	<li>
		آمنة نسبيًا، إذ لا توجد شفرة برمجية لتنفيذها على الخادم.
	</li>
	<li>
		أيضًا هي سريعة على نحو عام لعدم الحاجة لعمليات حوسبة، فقط نقل محتوى الصفحة.
	</li>
</ul>
<p>
	Hugo ليس المولدّ الوحيد للمواقع الساكنة، يقدِّم <a data-ss1618065301="1" href="http://getgrav.org/" rel="external nofollow">Grav</a>، و<a data-ss1618065301="1" href="http://picocms.org/" rel="external nofollow">Pico</a>، و<a data-ss1618065301="1" href="https://jekyllrb.com/" rel="external nofollow">Jekyll</a>، و<a data-ss1618065301="1" href="http://slackermedia.info/podwrite/" rel="external nofollow">Podwrite</a> وبرامج أخرى طرقًا سهلة لإنشاء مواقع إنترنت مكتملة الوظائف وبالكاد تتطلب أعمال صيانة. لكن Hugo لديه تكامل مع خدمات GitLab بشكل مدمج، أي يمكنك إنشاء واستضافة موقعك باستعمال حساب GitLab مجاني.
</p>

<p>
	أضف إلى ذلك امتلاك Hugo قاعدته الجماهيرية الخاصة، مثلا إنْ سبق واستعملت موقع <a data-ss1618065301="1" href="https://letsencrypt.org/" rel="external nofollow">Let's Encrypt</a> فأنت بالفعل قد جربت موقعًا مبنيًا باستعمال Hugo.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="36270" data-ss1618065301="1" href="https://academy.hsoub.com/uploads/monthly_2020_04/002-letsencrypt.jpg.504c15b9f9be80c992964d5f9d719dc5.jpg" rel=""><img alt="002-letsencrypt.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="36270" data-unique="data-unique" src="https://academy.hsoub.com/uploads/monthly_2020_04/002-letsencrypt.jpg.504c15b9f9be80c992964d5f9d719dc5.jpg"></a>
</p>

<h3>
	تثبيت Hugo
</h3>

<p>
	يمكنك إيجاد <a data-ss1618065301="1" href="https://gohugo.io/getting-started/installing" rel="external nofollow">إرشادات لتثبيت Hugo</a> على أجهزة ماك، وويندوز، ولينكس وتوزيعات BSD، إذ يعدُّ عابرًا للمنصات.
</p>

<p>
	في حال استعمالك لإحدى توزيعات لينكس أو BSD، فالأسهل تثبيته من مستودع برمجيات أو شجرة منافذ. يختلف أمر التثبيت حسب ما توفّره توزيعتك. مثلاً على فيدورا يُكتب الأمر كالتالي:
</p>

<pre class="ipsCode">
$ sudo dnf install hugo
</pre>

<p>
	تأكد من أنك ثبته بطريقة صحيحة بتنفيذ الأمر التالي في سطر الأوامر:
</p>

<pre class="ipsCode">
$ hugo help
</pre>

<p>
	سيسرد لك هذا الأمر كل الخيارات المتاحة للأمر <strong>Hugo</strong>، وإذا لم يحدث ذلك فهذا يعني أنك ثبّته بطريقة خاطئة أو أنك بحاجة إلى إضافة الأمر إلى <a data-ss1618065301="1" href="https://academy.hsoub.com/questions/123-%D9%85%D8%A7%D8%B0%D8%A7-%D9%8A%D8%B9%D9%86%D9%8A-%D9%85%D8%AA%D8%BA%D9%8A%D8%B1-%D8%A7%D9%84%D9%86%D8%B8%D8%A7%D9%85-path%D8%9F/#comment-251" rel="">المتغير <code>PATH</code></a>.
</p>

<h3>
	ابدأ بإنشاء موقعك
</h3>

<p>
	لبناء موقع باستعمال Hugo، لابد من إنشاء بنية مجلدات بهيكلة خاصة، وهو ما يقوم به Hugo نيابة عنك عند تنفيذ الأمر التالي:
</p>

<pre class="ipsCode">
$ hugo new site mysite
</pre>

<p>
	هكذا أنشأت مجلّدًا باسم <code>mysite</code> يحوي جميع المجلدات الافتراضية اللازمة لبناء موقعك.
</p>

<p>
	ستستعمل Git كخادم لموقعك على الويب، لذلك انتقل إلى مجلد موقعك، الذي هو mysite في مثالنا، وقم بإعداده كمستودع Git مستعملًا الأوامر التالية:
</p>

<pre class="ipsCode">
$ cd mysite
$ git init
</pre>

<p>
	كما أوضحنا سابقًا، Hugo متكامل مع خدمة Git، لذا يمكنك استعمال Git لتثبيت سمات لموقعك. إنْ لم تكن تخطّط لتطوير تصميم الموقع بنفسك، فيمكنك استعمال الخيار (<code>depth--</code>) لنسخ آخر إصدار من مصدر التصميم المختار كالتالي:
</p>

<pre class="ipsCode">
$ git clone --depth 1 \ 
https://github.com/darshanbaral/mero.git\
theme/mero
</pre>

<p>
	والآن لنُضف بعض المحتوى لموقعك:
</p>

<pre class="ipsCode">
$ hugo new posts/hello.md
</pre>

<p>
	استخدم محررك النصي المفضل لتعديل ملف <code>hello.md</code> على مسار <code>content/posts</code>.
</p>

<p>
	يقبل Hugo الملفات المرمزة بمارك داون ويحولها إلى منشورات بترميز HTML لذلك يفضل كتابة وتنسيق المحتوى بترميز <a data-ss1618065301="1" href="https://commonmark.org/help" rel="external nofollow">markdown</a>.
</p>

<p>
	إذا رغبت بإضافة الصور إلى منشوراتك، أنشئ مجلدًا باسم <code>images</code> في المسار الافتراضي. ضع جميع الصور بداخل هذا المجلد وقم بالإشارة إليها من <a data-ss1618065301="1" href="https://academy.hsoub.com/apps/productivity/%D9%83%D9%8A%D9%81-%D8%AA%D9%83%D8%AA%D8%A8-%D8%A8%D8%B5%D9%8A%D8%BA%D8%A9-%D9%85%D8%A7%D8%B1%D9%83%D8%AF%D8%A7%D9%88%D9%86-%D8%A8%D8%A8%D8%B3%D8%A7%D8%B7%D8%A9-r290/" rel="">ملف ماركداون</a> مستعملًا المسار المطلق (Absolute path) أي بادئًا بمسار مجلد الصور (images/) كمثال:
</p>

<pre class="ipsCode">
![صورة لشيء](/images/thing.jpeg)
</pre>

<h3>
	اختر تصميمك
</h3>

<p>
	يمكنك العثور على المزيد من القوالب في <a data-ss1618065301="1" href="https://themes.gohugo.io/" rel="external nofollow">themes.gohugo.io</a>، لكن يفضل استعمال التصميم الافتراضي أثناء فترة الاختبار. التصميم الأساسي لدى Hugo يسمى <a data-ss1618065301="1" href="https://themes.gohugo.io/gohugo-theme-ananke" rel="external nofollow">Ananke</a>. بعض التصاميم لديها متطلبات معقدة وأخرى لا تقوم بتنسيق الصفحات بالشكل المتوقع بدون الدخول في ترتيبات متقدمة. تصميم Mero الذي سنستخدمه في المثال التالي يأتي ملحقًا بملف ضبط متخصص (config.toml)، ولكن بهدف التبسيط سنقتصر على ذكر الأساسيات فقط.
</p>

<p>
	افتح باستخدام محرر نصوص الملف <code>config.toml</code> وأضف خيارات الضبط التالية:
</p>

<pre class="ipsCode">
languageCode = "en-us"
title = "My website on the web"
theme = "mero"

[params]
author = "Seth Kenlon"
description = "My hugo demo"
</pre>

<p>
	تحدّد الإعدادات أعلاه ترميز لغة الموقع (الإنكليزية الأمريكية <code>en-us</code>)، وعنوانه، والسمة المستخدمة، إضافة إلى اسم صاحب الموقع ووصفه.
</p>

<h3>
	معاينة موقعك
</h3>

<p>
	ليس عليك وضع أي شئ على الويب إلى أن تصبح جاهزًا لنشره. أثناء العمل يمكنك معاينة نسخة محلية من موقعك على خادم مدمج مع Hugo بتنفيذ الأمر التالي:
</p>

<pre class="ipsCode">
$ hugo server --buildDrafts --disableFastRender
</pre>

<p>
	أدخل العنوان <a data-ss1618065301="1" href="http://localhost:1313/" rel="external nofollow">http://localhost:1313</a> في متصفحك لتستعرض عملك الحالي.
</p>

<h3>
	النشر على GitLab باستخدام Git
</h3>

<p>
	لنشر واستضافة موقعك لدى GitLab، أنشئ مستودعًا لمحتوى موقعك. لإنشاء ذلك المستودع أضغط على زر إنشاء مشروع جديد (New Project) الموجود على صفحة مشاريع GitLab الخاصة بك، أنشئ مستودعًا فارغًا باسم (<code>yourGitLabUsername.gitlab.io</code>) مع إبدال <code>yourGitLabUsername</code> باسم المستخدم الخاص بحسابك على GitLab. من المهم استخدام هذا الاسم كاسم لمشروعك أيضًا ويمكنك لاحقًا تخصيص اسم نطاق لموقعك.
</p>

<p>
	لا تُضِف ترخيصًا أو ملف "اقرأني" (README). في البداية، تعقّد إضافة الملف إلى المستودعات المنشأة محليَّا من مهمة إرسال البيانات إلى GitLab. يمكنك إضافة تلك الملفات لاحقا.
</p>

<p>
	اضبط المستودع الفارغ على GitLab - بعد إنشائه - إلى إعدادات المجلّد الخاص بموقعك، وهو المجلّد الذي أعددناه سابقًا ليكون مستودع Git:
</p>

<pre class="ipsCode">
$ git remote add origin git@gitlab.com:skenlon/mysite.git
</pre>

<p>
	أنشئ ملفًا باسم <code>gitlab-ci.yml</code> لضبط إعدادات GitLab، وأدرج به الخيارات التالية:
</p>

<pre class="ipsCode">
image: monachus/hugo

variables: 
GIT_SUBMODULE_STRATEGY: recursive
pages:
    script:
        - hugo
    artifacts:
    paths:
       - public
   only:
       - master
</pre>

<p>
	يُعرِّف المعامل <code>image</code> حاوية الصور المستخدمة في موقعك. التعليمات الأخرى تمثّل في مجملها إرشادات لتهيئة خوادم GitLab للاستجابة بفعالية عندما ترسل شفرة مصدرية إلى مستودعك البعيد. اقرأ <a data-ss1618065301="1" href="https://docs.gitlab.com/ee/ci/#overview" rel="external nofollow">االتوثيق في القسم المختص</a> على GitLab لمزيد من التفاصيل عن النشر والتكامل المستمرّيْن (CI/CD).
</p>

<h3>
	تحديد الاستثناءات
</h3>

<p>
	بوصولك لهذه النقطة تكون قد أعددت مستودع Git الخاص بموقعك والتعليمات البرمجية الخاصة بإنشاء موقعك على خادم GitLab، وموقعك أصبح جاهزًا للنشر. الآن قبل تنفيذ أي أمر من أوامر Git، تحتاج لتنفيذ بعض الإجراءات الاحترازية حتى لا يتحكّم Git في إصدارات ملفات لا ترغب في أن يتحكّم فيها.
</p>

<p>
	أولًا، أضف مسار (<code>public/</code>) الذي أنشأه Hugo مسبقًا عند إنشائه مشروع الموقع، أضفه إلى ملف (<code>gitignore.</code>). لست بحاجة لإدارة موقعك في شكله النهائي على Git، ما ستحتاجه هو تتبع التغييرات على الملفات المصدرية لمشروع Hugo.
</p>

<pre class="ipsCode">
$ echo "/public" &gt;&gt; .gitignore
</pre>

<p>
	أمر آخر، لا يمكن الحفاظ على مستودع Git داخل مستودع Git آخر إلّا باستخدام وحدة فرعية (Submodules). لتسهيل الأمور انقل المجلد <code>git.</code> من مجلّد السمات (<code>themes</code>) إلى مجلّد آخر ليبقى مجلد السمات خاصًّا بالتصميم فقط.
</p>

<pre class="ipsCode">
$ mv themes/mero/.git ~/.local/share/Trash/files/
</pre>

<p>
	يمكنك استعمال <a data-ss1618065301="1" href="http://slackermedia.info/trashy" rel="external nofollow">سلة مهملات مثل Trashy</a> بديلًا عن الأمر السابق:
</p>

<pre class="ipsCode">
$ trash themes/mero/.git
</pre>

<p>
	الجدير بالذكر أن عليك إضافة الملفات الخاصة بالتصميم الى مستودع Git حتى يتمكن GitLab من الوصول إلى تصاميمك، بدون ذلك لن تستطيع بناء الموقع بنجاح.
</p>

<p>
	هنا يمكنك إضافة جميع محتويات مشروعك من على مجلد جهازك ورفعها على GitLab:
</p>

<pre class="ipsCode">
$ git add .
$ git commit -m 'hugo init'
$ git push -u origin HEAD
</pre>

<h3>
	انشر موقعك على الويب
</h3>

<p>
	بعد أن رفعت جميع ملفات مشروعك إلى GitLab، انظر إلى الصفحة الخاصة بمشروعك. ستظهر أيقونة تشير أن GitLab يراجع ملفاتك، ربما يستغرق ذلك بضع دقائق لمعالجة ملفات مشروعك للمرة الأولى لذا تحلّ بالصبر. لكن لا تنتظر مدة طويلة جدًّا، فتحديث تلك الأيقونة لنفسها لا يُعتمد عليه.
</p>

<p style="text-align: center;">
	<img alt="003-hugo_gitlab_cicd.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="36271" data-unique="gfvvh2lc8" src="https://academy.hsoub.com/uploads/monthly_2020_04/003-hugo_gitlab_cicd.jpg.fdffc529782f70a20f6b60006fcf31f9.jpg"></p>

<p>
	بينما تنتظر GitLab ليقوم بتجميع موقعك، اذهب لصفحة الضبط واعثر على لوحة التحكم بالصفحات (Pages). عندما يجهز موقعك ستُزوَّد برابط URL الخاص به. وكما أسلفنا سيكون العنوان مشابهًا للتالي (<code>yourGitLabUsername.gitlab.io/yourProjectName</code>). تصفح ذلك العنوان لترى ثمرة أعمالك.
</p>

<p style="text-align: center;">
	<img alt="004-hugo_demo_site.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="36272" data-unique="u9imqw8ky" src="https://academy.hsoub.com/uploads/monthly_2020_04/004-hugo_demo_site.jpg.7ab05798bd1cc79f672a3e3c43bfbc30.jpg"></p>

<p>
	إذا حدث خطأ ما في تجميع الموقع، سيزودك GitLab بسجلات موقعك على قسم CI/CD. تصفح رسائل الخطأ لتحديد سبب المشكلة.
</p>

<h2>
	Git والويب
</h2>

<p>
	Hugo (أو <a data-ss1618065301="1" href="https://academy.hsoub.com/programming/ruby/%D9%85%D8%AF%D9%88%D9%86%D8%AA%D9%83-%D8%A7%D9%84%D8%AE%D8%A7%D8%B5%D8%A9-%D8%A8%D8%A7%D8%B3%D8%AA%D8%B9%D9%85%D8%A7%D9%84-jekyll-%D8%A7%D9%84%D8%AC%D8%B2%D8%A1-%D8%A7%D9%84%D8%A3%D9%88%D9%84-r39/" rel="">Jekyll</a> وغيره من <a data-ss1618065301="1" href="https://academy.hsoub.com/devops/servers/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA-hexo%D8%8C-%D9%85%D9%88%D9%84%D8%AF-%D9%85%D9%88%D8%A7%D9%82%D8%B9-%D8%AB%D8%A7%D8%A8%D8%AA%D8%A9-static-site-generator-%D9%88%D8%B9%D9%85%D9%84-%D9%85%D8%AF%D9%88%D9%86%D8%A9-%D8%A8%D9%87-%D8%B9%D9%84%D9%89-%D8%AE%D8%A7%D8%AF%D9%88%D9%85-%D8%A3%D9%88%D8%A8%D9%86%D8%AA%D9%88-r228/" rel="">الأدوات المشابهة</a> لايتعدى كونه إحدى الطرق لاستعمال Git أدةً لنشر موقعك على الويب. يمكنك باستعمال خطافات Git على مستوى الخادم تصميم مسار لربط لمشروعك بالويب بأقل تدخل برمجي ممكن. يمكنك باستخدام النسخة المجتمعية (المجانية) من GitLab استضافة مشاريع GitLab على خادمك. كما يمكنك استخدام بدائل أخرى مثل <a data-ss1618065301="1" href="http://gitolite.com" rel="external nofollow">Gitolite</a> أو<a data-ss1618065301="1" href="http://gitea.io" rel="external nofollow"> Gitea</a>، واستعمال هذا المقال مصدرًا للإلهام بهدف إنشاء حلول خاصة بك.
</p>

<p>
	ترجمة -وبتصرف- للمقال <a data-ss1618065301="1" href="https://opensource.com/article/19/4/building-hosting-website-git?utm_campaign=intrel" rel="external nofollow">Build and host a website with Git</a> لصاحبه Seth Kenlon.
</p>
]]></description><guid isPermaLink="false">862</guid><pubDate>Sun, 19 Apr 2020 18:09:00 +0000</pubDate></item><item><title>&#x644;&#x645;&#x627;&#x630;&#x627; &#x639;&#x644;&#x64A;&#x643; &#x62C;&#x639;&#x644; &#x627;&#x644;&#x623;&#x630;&#x648;&#x646;&#x627;&#x62A; &#x639;&#x644;&#x649; &#x627;&#x644;&#x641;&#x631;&#x639; &#x627;&#x644;&#x631;&#x626;&#x64A;&#x633;&#x64A; master &#x644;&#x644;&#x642;&#x631;&#x627;&#x621;&#x629; &#x641;&#x642;&#x637;&#x61F;</title><link>https://academy.hsoub.com/programming/workflow/git/%D9%84%D9%85%D8%A7%D8%B0%D8%A7-%D8%B9%D9%84%D9%8A%D9%83-%D8%AC%D8%B9%D9%84-%D8%A7%D9%84%D8%A3%D8%B0%D9%88%D9%86%D8%A7%D8%AA-%D8%B9%D9%84%D9%89-%D8%A7%D9%84%D9%81%D8%B1%D8%B9-%D8%A7%D9%84%D8%B1%D8%A6%D9%8A%D8%B3%D9%8A-master-%D9%84%D9%84%D9%82%D8%B1%D8%A7%D8%A1%D8%A9-%D9%81%D9%82%D8%B7%D8%9F-r762/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2019_11/5dc08a38c786f_-------master--.jpg.bc36a6f73a57de5b4c659420aecb9b74.jpg" /></p>

<p>
	إنّ التكامل المستمر (Continuous integration) سهل للغاية. نزّل خدمة الأتمتة مفتوحة المصدر <a href="http://jenkins-ci.org/" rel="external nofollow">Jenkins</a>، وثبّتها، وأنشئ وظيفة، وانقر على الزر، ثم احصل على رسالة بريد إلكتروني جميلة تفيد بأن إنشاءك مكسور أو معطّل (أفترض أن إنشاءك تلقائي). بعد ذلك، أصلح الاختبارات التي لا تعمل (أفترض كذلك أن لديك اختبارات)، واحصل على رسالة بريد إلكتروني أجمل تفيد أن إنشاءك على ما يرام.
</p>

<p>
	بعد ذلك، غرّد حول الموضوع مدعيا أن فريقك يستخدم التكامل المستمر.
</p>

<p>
	ثم في غضون أسابيع قليلة، ابدأ في فلترة تنبيهات Jenkins إلى مجلدها الخاص لكي لا تستمرّ بإزعاجك. على أي حال، ليس لدى فريقك الوقت أو الرغبة لإصلاح جميع اختبارات الوحدة في كل مرة يعطّلها شخص ما.
</p>

<p>
	بعد كل شيء، نعلم جميعًا أن اختبارات الوحدة لا تناسب فريقًا يعمل وفق مواعيد نهائية محدّدة، أليس كذلك؟ هذا خطأ. يمكن للتكامل المستمر أن يعمل في هذه الظروف بل ويجب أن يعمل فيها.
</p>

<h2>
	ما هو التكامل المستمر؟
</h2>

<p>
	في الوقت الحاضر، تُطوّر البرمجيات في فرق نعمل على تطوير فروعٍ للميزات وعزل التعديلات أثناء تطويرها. ثم ندمج الفروع في فرع رئيسي <code>master</code>. وبعد كل عملية دمج، يُختبر المنتج بالكامل، وتُنفّذ جميع اختبارات الوحدة والتكامل المتاحة. وهذا ما يسمى «التكامل المستمر» (continuous integration ويعرف أيضا بالاختصار "CI").
</p>

<p>
	في بعض الأحيان، تفشل بعض الاختبارات. عندما يحدث ذلك، نقول إن "البناءات مكسورة". مثل هذا الفشل هو أحد الآثار الجانبية الإيجابية لمراقبة الجودة لأنه يعطي تنبيهًا بعلامة حمراء فور حدوث خطأ ما. هذه ممارسة معروفة في تطوير البرمجيات، عندما يصبح إصلاح هذا الخطأ أولوية قصوى للمتسبّب فيه وللفريق بأكمله. إذ يتوجّب إصلاح الخطأ مباشرة بعد أن يرسل خادم التكامل المستمر تنبيهًا بالعلامة الحمراء.
</p>

<p>
	هناك بعض الأدوات الجيدة المتاحة في السوق، والتي تُؤتمت إجراءات DevOps. بعضها مفتوح المصدر يمكنك تنزيله وتثبيته على الخوادم الخاصة بك. نذكر منها على سبيل المثال: Jenkins و Go و CruiseControl. وبعضها الآخر متاح كخدمات سحابية، مثل: Travis و Shippable و Wercker وغيرها الكثير.
</p>

<h2>
	لماذا لم يعد التكامل المستمر صالحًا؟
</h2>

<p>
	إن التكامل المستمر رائعٌ، ولكن في أغلب الأحيان كلما كان الفريق أكبر (وقاعدة الشيفرة كذلك)، كلما تعطلت الإنشاءات وكلما طالت المدة لإصلاحها. لقد رأيت العديد من الأمثلة يبدأ فيها فريق يعمل بجِدٍّ بتجاهل التنبيهات الحمراء، التي يرسلها Jenkins. بعد بضعة أسابيع، يصبح الفريق ببساطة غير قادر على إصلاح جميع الأخطاء في الوقت المناسب. وهذا، في الغالب، لأن العمل له أولويات أخرى. إذ لا يفهم مالكو المنتجات أهمية "<a href="https://wiki.hsoub.com/Refactoring/what_is_refactoring" rel="external">البنية النظيفة</a>" ولا يمكن للمدراء التقنيين شراء الوقت لتثبيت اختبارات الوحدة. كما أن الشيفرة المكسورة تكون أصلا في الفرع الرئيسي <code>master</code>، و في معظم الحالات، تكون قد نُشرت بالفعل على الإنتاج وسُلّمت للمستخدمين النهائيين. فما الحاجة إذن لإصلاح الاختبارات إذا كان العمل قد سُلّم فعليًا؟
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<p>
		لا يفهم مالكو المنتجات أهمية "البنية النظيفة" ولا يمكن للمدراء التقنيين شراء الوقت لتثبيت اختبارات الوحدة
	</p>
</blockquote>

<p>
	لا تأخذ معظم فرق التطوير تنبيهات التكامل المستمر على محمل الجد. لا تمثّل Jenkins أو Travis بالنسبة لهم سوى مجرد أدوات لطيفة لا تلعب أي دور في عملية التطوير والتسليم بأكملها. بغض النظر عن ما يقوله خادم التكامل المستمر، مازلنا نقدم ميزات جديدة للمستخدمين النهائيين. ونترك إصلاح إنشائنا إلى وقت لاحق. وهذا منطقي بالنسبة لي.
</p>

<h2>
	ما هو الحل؟
</h2>

<p>
	منذ بضع سنوات، نشرت مقالًا بعنوان "منع التعارضات في مشاريع PHP الموزّعة والمرنة". اقترحت في المقالة حلولًا لهذه الإشكالات في Subversion و PHP.
</p>

<p>
	منذ ذلك الوقت، استخدمت هذا النهج تجريبيًا في عدد من المشاريع مفتوحة المصدر وبعض المشاريع التجارية أيضا في PHP وجافا وروبي وجافاسكريبت و Git و Subversion. في جميع الحالات، كانت تجربتي إيجابية، ولهذا السبب رأى <a href="http://www.rultor.com/" rel="external nofollow">rultor.com</a> النور لاحقًا.
</p>

<p>
	لذلك، فإن الحل بسيط للغاية: احظُر على أي شخص دمج أي شيء في الفرع الرئيسي master وأنشئ سكريبتًا يمكن لأي شخص استدعاؤه. سيقوم السكريبت بعمليات الدمج والاختبار والتنفيذ. لن تكون لدى السكريبت أي استثناءات. فإذا انكسر أي فرع في اختبار واحد، سيرفض الفرع بأكمله.
</p>

<p>
	بمعنى آخر، يجب أن تظهر تلك العلامة الحمراء للتنبيه قبل أن تنتقل الشيفرة إلى الفرع الرئيسي <code>master</code>. ويجب أن يتحمّل مسؤولية الاختبارات المكسورة من تسبّب فيها.
</p>

<p>
	لنفترض أنّني أقوم بتطوير ميزة في فرعي الخاص. انتهيت من التطوير وكسرت بعض الاختبارات عن طريق الخطأ. يحدث ذلك، فنحن جميعا نرتكب أخطاء. ولكن لا يمكنني دمج تعديلاتي في <code>Master</code>. سيرفض Git ببساطة تنفيذ الأمر <code>push</code> لأنني لا أملك الأذونات المناسبة. كل ما يمكنني فعله هو أن أستدعي السكريبت السحري، وأطلب منه دمج فرعي الخاص. سيحاول السكريبت الدمج، ولكن قبل الدخول إلى الرئيسية، ستشغّل جميع الاختبارات. وإذا كُسِر أي منها، سيكون الرفض نتيجة حتمية. لن تُدمج التعديلات التي أجريتها وأصبح لزامًا عليّ إصلاحها قبل استدعاء السكريبت مرة أخرى.
</p>

<p>
	قد يؤدي هذا النهج في البداية إلى إبطاء عملية التطوير، لأن على الجميع بدء كتابة تعليمات برمجية أنظف. ولكن في النهاية، فإن هذه الطريقة تؤتي ثمارها.
</p>

<h2>
	إنشاءات ما قبل الإقلاع
</h2>

<p>
	تقدم بعض خوادم التكامل المستمرّ CI ميزة "إنشاءات ما قبل الإقلاع"، وهذا يعني اختبار الفروع قبل دمجها في <code>master</code> رئيسي. لدى Travis، على سبيل المثال، هذه الميزة المفيدة للغاية. عندما تقوم بإيداع جديد في فرع ما، يحاول Travis إنشاءه على الفور، ويُبلغ عبر طلبات الإضافة في GitHub عن أي مشاكل قد تحدث.
</p>

<p>
	انتبه، فإنشاءات ما قبل الإقلاع لا تندمج. دورها فقط هو التحقّق مما إذا كان فرعك الخاصّ نظيفًا. بعد الدمج، يمكن بسهولة كسر الفرع الرئيسي <code>master</code>. لذا، فهذه الآلية لا تضمن أنه لا أحد يستطيع الإيداع بشكل مباشر، والتسبب بكسر عن طريق الخطأ. تبقى عمليات الإنشاء قبل الإقلاع تدبيرًا وقائيًا، لكنها لا تحل المشكلة تمامًا.
</p>

<h2>
	موقع Rultor.com
</h2>

<p>
	من أجل البدء في العمل وفق ما هو موضح أعلاه، كل ما عليك فعله هو إلغاء أذونات الكتابة في الفرع الرئيسي <code>master</code> (أو <code>‎/trunk</code>، في Subversion).
</p>

<p>
	لسوء الحظ، هذا غير ممكن في GitHub. الحل الوحيد هو العمل من خلال الفروع وطلبات السحب فقط. ما عليك سوى إزالة الجميع من قائمة المتعاونين (collaborators) وسيكون عليهم إرسال تعديلاتهم من خلال طلبات السحب.
</p>

<p>
	بعد ذلك، ابدأ في استخدام موقع <a href="http://www.rultor.com/" rel="external nofollow">rultor.com</a> الذي سيساعدك على اختبار كل طلب للإضافة ودمجه ودفعه. في الأساس، Rultor هو السيناريو الذي كنا نتحدث عنه أعلاه، وهو متاح كخدمة سحابية مجانية.
</p>

<p>
	ترجمة -وبتصرف- للمقال <a href="https://www.yegor256.com/2014/07/21/read-only-master-branch.html" rel="external nofollow">Master Branch Must Be Read-Only</a> لصاحبه Yegor Bugayenko
</p>
]]></description><guid isPermaLink="false">762</guid><pubDate>Mon, 04 Nov 2019 20:29:47 +0000</pubDate></item><item><title>[&#x641;&#x64A;&#x62F;&#x64A;&#x648;] &#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; GitHub Pages</title><link>https://academy.hsoub.com/programming/workflow/git/%D9%81%D9%8A%D8%AF%D9%8A%D9%88-%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-github-pages-r724/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2019_07/GitHub-pages.png.4636b2dae6e41c1a01ba89f8e4788376.png" /></p>

<p>
	<iframe allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen="" frameborder="0" height="430" width="560" src="https://www.youtube.com/embed/l9ILhBUqwwM"></iframe>
</p>

<p>
	يشرح هذا الفيديو كيفية استخدام GitHub Pages لاستضافة الصفحات. وسنشرح فيه صفحات المشاريع، وصفحات المستخدم أو المنظمة.
</p>

<p>
	لتتعرف أكثر على نظام Git وكيفية استخدامه، ننصحك بمشاهدة <a href="https://academy.hsoub.com/programming/workflow/git/%D9%81%D9%8A%D8%AF%D9%8A%D9%88-%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-git-r658/" rel="">فيديو أساسيات Git في أكاديمية حسوب</a>.
</p>

<p>
	<a href="https://academy.hsoub.com/programming/workflow/git" rel="">قسم Git في أكاديمية حسوب</a> غني بالمقالات المفيدة حوله.
</p>
]]></description><guid isPermaLink="false">724</guid><pubDate>Wed, 31 Jul 2019 07:42:00 +0000</pubDate></item><item><title>[&#x641;&#x64A;&#x62F;&#x64A;&#x648;] &#x627;&#x644;&#x627;&#x62A;&#x635;&#x627;&#x644; &#x628;&#x62E;&#x62F;&#x645;&#x629; GitHub &#x62F;&#x648;&#x646; &#x643;&#x644;&#x645;&#x629; &#x633;&#x631;</title><link>https://academy.hsoub.com/programming/workflow/git/%D9%81%D9%8A%D8%AF%D9%8A%D9%88-%D8%A7%D9%84%D8%A7%D8%AA%D8%B5%D8%A7%D9%84-%D8%A8%D8%AE%D8%AF%D9%85%D8%A9-github-%D8%AF%D9%88%D9%86-%D9%83%D9%84%D9%85%D8%A9-%D8%B3%D8%B1-r661/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2019_03/ssh_github.png.01ab06a738ea664c488f8c65c84baec6.png" /></p>

<p>
	<iframe allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen="" frameborder="0" height="400" src="https://www.youtube.com/embed/T0p7xAJy4Gk" width="700"></iframe>
</p>

<p>
	نشرح طريقة الاتصال بخدمة GitHub عبر <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr>، وذلك بتوليد زوج المفاتيح مفتاح عام يضاف إلى إعدادات GitHub ومفتاح خاص نحتفظ به لدينا للمصادقة.
</p>
]]></description><guid isPermaLink="false">661</guid><pubDate>Tue, 12 Mar 2019 10:43:06 +0000</pubDate></item></channel></rss>
