سؤال

هذا السؤال لديه بالفعل إجابة هنا:

أريد تغيير شيء ما في الالتزام الأول لمشروعي مع فقدان جميع الالتهابات اللاحقة. هل هناك أي طريقة للقيام بذلك؟

أدرجت بطريق الخطأ عبر البريد الإلكتروني الخام الخاص بي في تعليق داخل التعليمات البرمجية المصدر، وأرغب في تغييره أثناء تلقيه من برامج الفهرسة الفهرسة GitHub.

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

المحلول

كما ذكرنا ECDPALMA. أقل, git 1.7.12+ (أغسطس 2012) عزز الخيار --root ل git rebase:

"git rebase [-i] --root $tip"يمكن الآن استخدامها لإعادة كتابة جميع السجل المؤدي إلى"$tip"وصولا إلى جذر الالتزام.

كان هذا السلوك الجديد في البداية ناقش هنا:

وأنا شخصيا أعتقد "git rebase -i --root"يجب أن يكون مجرد العمل دون الحاجة"--onto"واسمح لك" تحرير "حتى أول واحد في التاريخ.
من المفهوم أنه لا يزعج أحد، حيث أن الناس أقل بكثير أعيد كتابة بالقرب من بداية التاريخ بخلاف ذلك.

ال تمت متابعة التصحيح.


(الإجابة الأصلية، فبراير 2010)

كما ذكر في أسئلة وأجوبة (وهذه حتى سؤال)، الفكرة هي:

  1. إنشاء فرع مؤقت جديد
  2. ارتده إلى الالتزام الذي تريد تغييره باستخدام git reset --hard
  3. تغيير ذلك يرتكب (سيكون أعلى الرأس الحالي، ويمكنك تعديل محتوى أي ملف)
  4. Rebase Tranch على رأس الالتزام تغيرت، باستخدام:

    git rebase --onto <tmp branch> <commit after changed> <branch>`
    

الحيلة هي أن تكون متأكدا من عدم إعادة إدخال المعلومات التي تريد إزالتها بواسطة الالتزام لاحقا في مكان آخر في ملفك. إذا كنت تشك في ذلك، فعليك استخدام filter-branch --tree-filter للتأكد من عدم احتواء محتوى هذا الملف في أي ارتكاب المعلومات المعقولة.

في كلتا الحالتين، ينتهي بك الأمر إلى إعادة كتابة Sha1 من كل الالتزام، لذلك كن حذرا إذا كنت قد نشرت بالفعل الفرع الذي تقوم بتعديل محتوياته. ربما لا ينبغي أن تفعل ذلك ما لم يكن مشروعك ليس عاما وأشخاص آخرين لم يستند إلى العمل بعيدا عن ارتكابكم على وشك إعادة كتابة.

نصائح أخرى

كما جاء في 1.7.12 الإصدار ملاحظات, ، يمكنك استخدام

$ git rebase -i --root

git rebase -i يسمح لك بتحرير أي جملة سابقة مريحة، باستثناء ارتكاب الجذر. وبعد تظهر لك الأوامر التالية كيفية القيام بذلك يدويا.

# tag the old root, "git rev-list ..." will return the hash of first commit
git tag root `git rev-list HEAD | tail -1`

# switch to a new branch pointing at the first commit
git checkout -b new-root root

# make any edits and then commit them with:
git commit --amend

# check out the previous branch (i.e. master)
git checkout @{-1}

# replace old root with amended version
git rebase --onto new-root root

# you might encounter merge conflicts, fix any conflicts and continue with:
# git rebase --continue

# delete the branch "new-root"
git branch -d new-root

# delete the tag "root"
git tag -d root

إذا كنت ترغب في تعديل الالتزام الأول فقط، فقد تحاول Rebase Git وتعديل الالتزام، مما يشبه هذا المنشور:كيفية تعديل الالتزام المحدد في git؟

وإذا كنت ترغب في تعديل جميع الالتزامات التي تحتوي على البريد الإلكتروني الخام، فإن Filter-Branch هو الخيار الأفضل. هناك مثال على كيفية تغيير عنوان البريد الإلكتروني على الصعيد العالمي على الكتاب برو git., ، وقد تجد هذا الرابط مفيد http://git-scm.com/book/ar/git-tools-rewriting-history.

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