سؤال

قادمة من SVN ، بدأت مجرد التعرف على git.

عندما يتم حذف فرع في غيت ، هل تم إزالته من التاريخ؟

في SVN ، يمكنك بسهولة استرداد فرع عن طريق إعادة تشغيل الحذف (الاندماج العكسي). مثل كل الحذف في SVN ، لا يتم حذف الفرع أبدًا ، إنه تمت إزالته من الشجرة الحالية.

إذا تم حذف الفرع بالفعل من التاريخ في Git ، فماذا يحدث للتغييرات التي تم دمجها من هذا الفرع؟ هل تم الاحتفاظ بهم؟

هل كانت مفيدة؟

المحلول

الفروع هي مجرد مؤشرات للارتباط في غيت. في GIT ، يحتوي كل ملزم على شجرة مصدر كاملة ، وهو عبارة عن بنية مختلفة تمامًا عن SVN حيث تعيش جميع الفروع والعلامات (حسب الاتفاقية) في "مجلدات" منفصلة للمستودع إلى جانب "الجذع" الخاص.

إذا تم دمج الفرع في فرع آخر قبل حذفه ، فسيظل جميع الالتزامات قابلة للوصول من الفرع الآخر عند حذف الفرع الأول. يبقون بالضبط كما كانوا.

إذا تم حذف الفرع دون الاندماج في فرع آخر ، فإن الالتزامات في هذا الفرع (حتى النقطة التي يتم فيها التزام المتشعب من الالتزام الذي لا يزال قابلاً للوصول إليه) سوف يتوقف عن أن يكون مرئيًا.

ستظل الاحتفاظ بالالتزامات في المستودع ومن الممكن استعادتها فور حذفها ، ولكن في النهاية سيتم جمع القمامة.

نصائح أخرى

في GIT ، الفروع هي مجرد مؤشرات (المراجع) للارتباط في رسم بياني حكيمة موجهة (DAG) من الالتزامات. هذا يعني أن حذف الفرع يزيل فقط الإشارات إلى الالتزامات ، مما قد يجعل بعض الالتزامات في DAG غير قابلة للوصول ، وبالتالي غير مرئي. ولكن جميع الالتزامات التي كانت على فرع محذوف ستظل في المستودع ، على الأقل حتى يتم تشذيب الالتزامات غير القابلة للوصول (على سبيل المثال باستخدام git gc).

لاحظ أن git branch -d سوف يرفض حذف فرع إذا كان لا يمكن التأكد من أن حذفه لن يترك ارتباطات غير قابلة للوصول. تحتاج إلى استخدام أقوى git branch -D لفرض حذف الفرع إذا كان قد يترك ارتباطًا لا يمكن الوصول إليه.

لاحظ أيضًا أن الالتزامات التي لا يمكن الوصول إليها ، إذا كانت موجودة ، هي فقط تلك الالتزامات بين الطرف الأخير من الفرع المحذوف وإما الالتزام الذي تم دمجه على فرع آخر موجود ، أو أي التزام موسومة ، أو نقطة التفرع ؛ أيهما في وقت لاحق. على سبيل المثال في الموقف التالي:

----O----*----*----/M----*    <-- master <-- HEAD
     \            /
      \--.----.--/--x---y     <-- deleted branch

لا يمكن الوصول إلى "X" و "Y" فقط بعد حذف الفرع.

إذا كنت تعمل على فرع محذوف داخل gc.reflogExpire الفترة ، الافتراضي لمدة 90 يومًا ، سيكون لديك آخر نصيحة من فرع محذوف مسجل في رأسه (انظر git reflog show HEAD, ، أو git log --oneline --walk-reflogs HEAD). يجب أن تكون قادرًا على استخدام رأس الرأس لاستعادة المؤشر المحذوف. لاحظ أيضًا أنه في هذه الحالة ، سيتم حماية لا يمكن الوصول إليها في فرع تم حذفه فقط من التقليم (إزالة) داخل gc.reflogExpireUnreachable الفترة ، والتي افتراضيا 30 يوما.

إذا لم تتمكن git fsck للعثور على "التزام لا يمكن الوصول إليهu003Csha1> "، وفحص تلك (عبر git show <sha1> أو git log <sha1>) للعثور على طرف الفرع المحذوف.

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

git branch <deleted-branch> <found-sha1-id>

لاحظ أن هذا الاكتشاف لفرع سيضيع.


يوجد ايضا git-resurrect.sh السيناريو في contrib/ مما يساعد على العثور على آثار نصيحة الفرع مع اسم معين وإحياء (und reilete).

إذا كنت قلقًا بشأن الفروع المحذوفة عن طريق الخطأ ولم يكن لديك نسخة محلية من الريبو بعد الآن ، فهناك امتدادات لخوادم GIT للمؤسسات مثل Gerrit التي ستكتشف إعادة كتابة التاريخ والحذف الفرعي ، ستعمل على دعمها تحت مرجع خاص بحيث تكون يمكن استعادتها إذا لزم الأمر ولن يتم تقليمها بواسطة جمع القمامة. لا يزال بإمكان مسؤولي Gerrit إزالة الالتزامات المحددة إذا لزم الأمر لأسباب قانونية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top