المراجع البعيدة في Git هي مؤشرات Pointers إلى المستودعات البعيدة بما تتضمنه من تفريعات، وسوم وغيرها.
يمكنك الحصول على لائحة كاملة بالمراجع البعيدة بتنفيذ الأمر:
git ls-remote [remote]
أو:
git remote show [remote]
لعرض التفريعات البعيدة إضافة لمعلومات متفرقة. إلا أنه توجد طريقة أخرى أكثر شيوعا وهي الاستفادة من تفريعات التتبع عن بعد Remote-tracking branches
تفريعات التتبع عن بعد هي مراجع لحالة التفريعات البعيدة. توجد هذه التفريعات محليا إلا أنه ليس بالإمكان تحريكها فهي تتحرك تلقائيا عندما تتبادل بيانات مع الخادوم البعيد. تعمل تفريعات التتبع عن بعد كإشارة مرجعية لتذكيرك بموضع تفريعات المستودعات البعيدة في آخر مرة اتصلت فيها بالخادوم.
تأخذ تفريعات التتبع عن بعد الهيئة (remote)/(branch)
. إن أردت مثلا رؤية الحالة التي كان عليها التفريع master
على مستودع origin
البعيد في آخر مرة اتصلت فيها به فستفحص Checkout التفريع origin/master
. إن كنت تعمل عن بعد مع زملاء، ثم دفعوا Push تفريعا باسم iss53
فيمكن أن يكون لديك تفريع محلي بنفس الاسم بينما يشير تفريع التتبع عن بعد إلى الإيداع على origin/iss53
.
قد يبدو الأمر معقّدا قليلا لذا سنأخذ مثالا. فلنفترض أن لديك خادوم Git على العنوان git.ourcompany.com
. إن نسخت Clone مستودعا من الخادوم فإن أمر git clone
سيسميه تلقائيا origin
، يجلب جميع البيانات إلى المستودع المحلي، ينشئ مؤشرا إلى آخر إيداع في التفريع master
ويسميه محليا بـorigin/master
. يوفر Git أيضا تفريع master
محليا يبدأ من نفس مبدأ التفريع master
الخاص بـorigin
.
ملحوظة: origin
ليس مستودعا ذا خصوصية.
لا يمثل origin
مستودعا ذا خصوصية تماما كما أن master
ليس تفريعا ذا دلالة خاصة في Git. يسمّي Git التفريع َالمبدئي بـmaster
عند تنفيذ أمر git init
كما يسمي أمر git clone
المستودع البعيد مبدئيا بـ origin
؛ لهذا السبب فقط يكثُر استخدام التسميتين.
إن نفذت أمر git clone
مع خيار o-
مثل:
git clone -o booyah
فسيكون التفريع booyah/master
هو التفريع المبدئي لديك.
إن عملت على التفريع master
المحلي وأثناء عملك دفع أحدهم تغييرات إلى git.ourcompany.com
وحدّث التفريع master
على الخادوم فسيختلف سجل الإيداعات المحلي عن البعيد. في تلك الأثناء لن يتغير تفريع origin/master
ما لم تدخل في تبادل بيانات مع الخادوم.
نفذ أمر:
git fetch origin
لمزامنة تفريع التتبع عن بعد. يبحث الأمر عن خادوم المستودع origin
(أي git.ourcompany.com
)، يفتش عن البيانات الموجودة على الخادوم التي لا توجد محليا ثم يحدّث البيانات المحلية محرّكا المؤشر origin/master
إلى موضعه الجديد.
نأخذ مثالا لتوضيح كيف تبدو تفريعات التتبع عن بعد لخواديم بعيدة متعدّدة. نفترض أن لديك خادوم Git داخلي تستخدمه إحدى فرق العمل لأغراض التطوير والاختبار. عنوان هذا الخادوم هو git.team1.ourcompany.com
. تمكن إضافة مرجع للخادوم البعيد هذا إلى المشروع الذي تعمل عليه حاليا بتنفيذ الأمر:
git remote add
كما تطرقنا لذلك في درس العمل على المستودعات البعيدة في Git. نضيف المستودع مع استخدام الاختصار teamone
.
يمكنك الآن تنفيذ الأمر:
git fetch teamone
للبحث عن البيانات الموجودة على الخادوم الجديد دون أن تكون موجودة محليا. يوجد على الخادوم teamone
جزء من العمل الموجود على الخادوم الأول؛ يعني هذا أن Git بعد تنفيذ الأمر السابق لن ينزل إيداعات جديدة لكنه سيكتفي بإنشاء تفريع تتبع عن بعد جديد ويسميه teamone/master
يشير إلى آخر إيداع في التفريع master
على الخادوم teamone
.
دفع البيانات
عندما تريد مشاركة تفريع تعمل عليه مع آخرين فستحتاج لدفع البيانات إلى مستودع بعيد لديك صلاحية الكتابة عليه. لا يُزامن Git التفريعات المحلية تلقائيا مع التفريعات البعيدة، بل يجب أن تزامن التفريع الذي ترغب في مشاركته يدويا. تستخدم بهذه الطريقة تفريعات خاصة (محلية) للأعمال التي لا تريد مشاركتها بينما تدفع بيانات التفريعات التي تود مشاركتها إلى خادم مشترك.
إن كان لديك تفريع باسم serverfix
تريد التشارك بالعمل عليه مع آخرين فيمكنك دفع البيانات إليه بنفس طريقة دفع التفريع الأخرى بتنفيذ الأمر:
git push <remote> <branch>
كما في المثال التالي:
git push origin serverfix
Counting objects: 24, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (15/15), done.
Writing objects: 100% (24/24), 1.91 KiB | 0 bytes/s, done.
Total 24 (delta 2), reused 0 (delta 0)
To https://github.com/schacon/simplegit
* [new branch] serverfix -> serverfix
يأخذ Git تلقائيا محتوى التفريع serverfix
إلى refs/heads/serverfix:refs/heads/serverfix
وهو ما يعني أخذ بيانات التفريع المحلي serverfix
ودفعها لتحديث بيانات التفريع البعيد serverfix
. سنعرج للحديث عن refs/heads/
عندما نتحدث عن أمور داخلية في Git، يمكن الآن تجاوزها.
يمكن أيضا تنفيذ الأمر:
push origin serverfix:serverfix
الذي يؤدي نفس المهمة. يُفسَّر الأمر بـ "خذ التفريع serverfix
المحلي واجعله هو تفريع serverfix
البعيد". يمكن استخدام هذه الطريقة لدفع بيانات تفريع محلي إلى تفريع بعيد يختلف عنه في الاسم. أما إن كنت ترغب في تغيير اسم التفريع في المستودع البعيد فيمكنك تنفيذ الأمر:
git push origin serverfix:awesomebranch
لدفع بيانات تفريع serverfix
المحلي إلى التفريع awesomebranch
على الخادوم البعيد.
لا تعد كتابة كلمة السر في كل مرة!
يطلُب Git عند دفع البيانات إلى مستودع يستخدم روابط مؤمنة بيانات الاستيثاق (اسم المستخدم وكلمة السر) ويظهر محثّ Prompt في سطر الأوامر لتلقي هذه البيانات. تستطيع استخدام تخبئة اعتمادات Credential cache لتفادي إدخال اسم المستخدم وكلمة السر في كل مرة تدفع فيها البيانات. الطريقة الأسهل لإعدادها هي تنفيذ أمر:
git config --global credential.helper cache
يحصُل مشاركوك في المستودع عند تنفيذ أمر git fetch
مستقبلا على مرجع لمكان نسخة التفريع serverfix
الموجودة على الخادوم:
git fetch origin
remote: Counting objects: 7, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 3 (delta 0)
Unpacking objects: 100% (3/3), done.
From https://github.com/schacon/simplegit
* [new branch] serverfix -> origin/serverfix
من المهم الانتباه إلى أن تفريعات التتبع عن بعد التي تنتج عن تنفيذ أمر git fetch
لا تعطيك تلقائيا نسخة يمكن تحريرها من هذه التفريعات. يعني هذا بعبارة أخرى أن الأمر أعلاه لا ينشئ تفريع serverfix
جديدا بل مؤشرا باسم origin/serverfix
لا يمكن تعديله.
نفذ أمر:
git merge origin/serverfix
لدمج التفريع البعيد في التفريع الحالي لديك. إن كنت تريد تفريع serverfix
خاصا بك للعمل عليه فيمكنك تأسيسه على تفريع التتبع عن بعد:
git checkout -b serverfix origin/serverfix
Branch serverfix set up to track remote branch serverfix from origin.
Switched to a new branch 'serverfix'
يعطيك الأمر أعلاه تفريعا محليا يبدأ من حيث يوجد origin/serverfix
ويمكنك العمل عليه.
تفريعات التتبع Tracking branches
يؤدي فحصُ تفريع محلي من تفريع تتبع عن بعد تلقائيا إلى إنشاء ما يُسمّى تفريع تتبع. تفريعات التتبع هي تفريعات محلية ذات علاقة مباشرة مع مستودع بعيد (يُسمَّى التفريع البعيد بالتفريع العلوي Upstream branch). إذا كنت تعمل على تفريع تتبع ثم نفذت أمر git pull
فإن Git سيعرف تلقائيا من أين سيجلب البيانات والتفريعَ الذي يجب دمجها فيه.
ينتج عادة عن نسخ مستودع إنشاء تفريع master
لتتبع origin/master
. يمكنك إن أردت إعداد تفريعات تتبع أخرى؛ أو التخلي عن تتبع التفريع master
الذي أُعدّ تلقائيا أثناء نسخ المستودع. أقرب مثال لإنشاء تفريعات تتبع هو تنفيذ الأمر:
git checkout -b [branch] [remotename]/[branch]
هذا الأمر شائع لدرجة أن Git لديه اختصار للأمر:
git checkout --track origin/serverfix
Branch serverfix set up to track remote branch serverfix from origin.
Switched to a new branch 'serverfix'
في الواقع، الأمر شائع لدرجة وجود اختصار للاختصار أعلاه! ينشئ Git عند تنفيذ أمر git checkout
تفريع تتبع إذا توفر الشرطان: (أ) التفريع غير موجود سلفا، (ب) يوافق اسم التفريع بالضبط تفريعا بعيدا وحيدا:
git checkout serverfix
Branch serverfix set up to track remote branch serverfix from origin.
Switched to a new branch 'serverfix'
تتاح أيضا إمكانية إعداد تفريع محلي باسم مختلف عن التفريع البعيد باستخدام النسخة الأولى من الأمر مع ذكر اسم التفريع المحلي على النحو التالي:
git checkout -b sf origin/serverfix
Branch sf set up to track remote branch serverfix from origin.
Switched to a new branch 'sf'
بهذا يجلب تنفيذ الأمر git pull
على التفريع sf
البيانات تلقائيا من origin/serverfix
.
استخدم خيار u-
أو set-upstream--
إذا كنت تريد إعداد تفريع محلي تعمل عليه لتتبع تفريع بعيد أو تغيير التفريع العلوي الذي يتتبّعه التفريع المحلي:
git branch -u origin/serverfix
Branch serverfix set up to track remote branch serverfix from origin.
ملحوظة: اختصار التفريع العلوي.
تستطيع بعد إعداد تفريع تتبع استخدام الاختصار {upstream}@
أو {u}@
للإشارة إلى التفريع العلوي المرتبط به. نفترض أنك تعمل على التفريع master
الذي يتتبع التفريع origin/master
؛ يمكنك في هذه الحالة تنفيذ الأمر المختصر {git merge @{u
بدلا من git merge origin/master
.
استخدم خيار vv-
مع أمر git branch
لعرض تفريعات التتبع التي أعددتها. يسرد الأمر قائمة بالتفريعات المحلية مع معلومات أكثر عن كل تفريع بما فيها التفريعات العلوية وهل تفريع التتبع يتقدم على التفريع العلوي أم يتأخر عنه أم الاثنان معا.
git branch -vv
iss53 7e424c3 [origin/iss53: ahead 2] forgot the brackets
master 1ae2a45 [origin/master] deploying index fix
* serverfix f8674d9 [teamone/server-fix-good: ahead 3, behind 1] this should do it
testing 5ea463a trying something new
تشير نتيجة الأمر في المثال أعلاه إلى أن التفريع iss53
يتتبّع التفريع origin/iss53
، وأنه يتقدم عليه بإيداعين (ahead 2
)؛ بمعنى أنه يوجد إيداعان محليان لم يدفعا بعدُ إلى الخادوم. يظهر أن التفريع master
يتتبّع التفريع origin/master
وأنه محدَّث. نرى في السطر الموالي أن serverfix
يتتبّع server-fix-good
على الخادوم teamone
وأنه يتقدم عليه بـ3
ويتأخر عنه ب1
؛ أي أنه يوجد إيداع واحد على الخادوم لم يُدمج محليَّا بعد، كما توجد ثلاثة إيداعات محلية لم تُدفع إلى الخادوم. يظهر في السطر الأخير أن التفريع testing
لا يتتبّع أي تفريع بعيد.
يجب الانتباه إلى أن هذه الأعداد تحيل إلى البيانات المخبَّأة منذ آخر مرة بُحث فيها عن بيانات على كل خادوم؛ فالأمر أعلاه لا يدخل في اتصال مع الخواديم بل يخبرك فقط بالمعلومات الموجودة محليا. إن كنت تريد بيانات حديثة كليًّا فيجب البحث عنها أولا على الخواديم جميعا بتنفيذ الأمر git fetch
عليها. يمكن مثلا تحديث البيانات من جميع الخواديم كالتالي:
git fetch --all; git branch -vv
جلب البيانات
ينزّل أمر git fetch
كل التغييرات الموجودة على الخادوم التي لا توجد عندك محليا؛ ولكنها لا تغير مجلد العمل بتاتا، بل تكتفي بتنزيل البيانات وترك مهمة دمجها لك. إلا أنه يوجد أمر git pull
الذي ينزّل البيانات ويدمجها في مجلد العمل لديك؛ ينتج عن تنفيذ أمر git pull
غالبا تنفيذ أمر git fetch
متبوعا مباشرةً بأمر git merge
. يؤدي تنفيذ git pull
على تفريع تتبع مُعدّ مثل ما وضحنا في الفقرة السابقة، إما بإعداده صراحة أو عن طريق أمر git clone
أو git checkout
، يؤدي إلى البحث في المستودع العلوي المناسب عن البيانات الجديدة ثم دمجها فورا في تفريع التتبع المحلي. من الأفضل عموما استخدام أمري:
git fetch
و
git merge
بالتتابع إذ أن أمر git pull
قد يكون مربكا.
حذف التفريعات البعيدة
لنفترض أنك أنهيت العمل على تفريع بعيد (أكملت أنت ومشاركوك العمل على ميزة وأُدمجت في التفريع الرئيس الذي توجد به الشفرة المستقرة مهما كان اسمه، master
أو أي شيء آخر)؛ يمكنك حذف هذا التفريع باستخدام الخيار delete--
في أمر git push
. نفذ الأمر التالي إذا أردت حذف التفريع serverfix
من الخادوم:
git push origin --delete serverfix
To https://github.com/schacon/simplegit
- [deleted] serverfix
يتلخص عمل الأمر في حذف مؤشر التفريع من الخادوم. يحتفظ خادوم Git عادة ببقية البيانات لمدة إلى أن تتم عملية جمع النفايات Garbage collection؛ تتيح هذه الطرقة إمكانية إرجاع التفريع إن كان حذفه عرضيا.
ترجمة -بتصرف- للفصل Git Branching - Remote Branches من كتاب Pro Git لصاحبه Scott Chacon.
أفضل التعليقات
لا توجد أية تعليقات بعد
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.