سؤال كيفية تعديل الالتزام الأخير لإلغاء إضافة ملف؟


لقد قمت بتعديل ملفين a، b في ارتكاب الماضي. لكن الملف b لا ينبغي أن تلتزم ، ما هو سير العمل لتعديل هذا؟


92
2018-01-05 06:43


الأصل




الأجوبة:


التحديث (بعد عامين)

يان هودك 

انها تافهة لإزالته من الفهرس فقط.

صواب: يمكنك إعادة تعيين الملف إلى محتوى الفهرس الخاص به بسهولة كافية ، مثل إجابة أكثر حداثة (كتب بواسطة مات كونولي) وتقترح:

git reset HEAD^ path/to/file/to/revert

HEAD^ يسمح للملف بالوصول إلى محتواه في الالتزام السابق قبل الأخير.

إذا تستطيع git commit --amend، كما كتبت في الأصل أدناه.


الإجابة الأصلية (يناير 2011)

إذا كان هذا هو التزامك الأخير (وأنت لم تدفعه في أي مكان) ، يمكنك ذلك تعديل ما يلي:
(أول خبأ أو حفظ b)

 git commit --amend

ثم احذف b ، أعد الالتزام. استعادة ب وانت الانتهاء من ذلك.

--amend

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


91
2018-01-05 07:08



... Then stash/delete b, re-commit..هنا لا يجب أن تكون الكلمة Then يكون after؟ - --amend بعد stach / delete b ، ... - Xiè Jìléi
@ 谢 继 雷: وبعبارة أخرى ، حفظ ب أولا ، ثم ارتكاب --إرسال ، ثم استعادة؟ صحيح. لقد قمت بتحديث الجواب. - VonC
مع قوة مؤشر جيت ، إخبار أي شخص لتخفيض / حفظ الملف هو مجرد سخيفة (-1). انها تافهة لإزالته من الفهرس فقط. - Jan Hudec
JanHudec True ، لقد حررت الإجابة وفقًا لذلك. لم أتابع هذه الإجابة القديمة عن كثب كما أفعل في Stack Overflow. يجب ترحيل 99٪ من أسئلة git في SU على أي حال. - VonC


  1. git diff --name-only HEAD^ - (اختياري) لاستخدام قائمة الملفات التي تغيرت في آخر ارتكاب.
  2. git reset HEAD^ path/to/file/to/revert - إلى إعادة ضبط فهرس إلى هذا الإصدار الأخير ، وترك نسخة العمل يمسها.
  3. git commit --amend - لتعديل هذا الالتزام الأخير ل تشمل فهرس التغييرات

56
2018-03-18 04:21



إيمو هو إجابة أفضل بكثير ثم واحد المقبولة. - mik01aj
لاحظ أنه يجب ألا تستخدم git commit -a --amend (أي لا تضيف ملفات) للخطوة 3 ، أو ستلتزم بتغييرات نسخ العمل الخاصة بك وهي التعديلات التي تحاول إزالتها. خطوة اختيارية 2.5 يمكن أن يكون git checkout path/to/file/to/revertلتنظيف نسخة العمل الخاصة بك أيضا. - dmnd
بدلا من ذلك git rm --cached path/to/file/to/revert إلغاء إضافة الملف دون حذفه من الشجرة. - Jan Hudec


بدلا من ذلك إذا كنت تستخدم git gui، ما عليك سوى اختيار الخيار "تعديل الالتزام الأخير" ، يظهر الملف المضاف في قائمة "مقسم" ، انقر على أيقونة لنقلها إلى قائمة "غير منظم" والالتزام.


13
2018-05-06 07:47



VonC: إن عملية تحرير البقع وتقسيمها عملية شائعة جدًا بالنسبة لمستخدمي git الثقيلين ، لذا تم تصميم واجهة المستخدم الرسومية لجعلها سهلة و هي أفضل أداة IMO لذلك. - Jan Hudec
هذا واحد يعمل! لم أكن قد نجحت مع خيارات أخرى لهذه المهمة بالذات. شكرا على الاكرامية! - Serguzest


إذا كنت تريد حذف b من التزامك الأخير

git rm --cached b (will preserve the file in the working tree but remove it from the index)
git commit --amend

إذا كنت تريد إزالة جميع التغييرات على b في آخر عملية ارتكاب

(backup b)
(modify b to state before incorrect commit)
git commit --amend
(restore b)

8
2018-05-06 07:34



git rm --cached والتخلص من رقصة النسخ الاحتياطي / الاستعادة (-1). - Jan Hudec
شكرا لتوضيح ذلك. أردت أن أشارك كيف فعلت هذا لأن هذا هو النهج الذي شعرت به أكثر راحة حتى بعد قراءة الموضوع بأكمله. - pingo


بديل لا يحتاج إلى فهرس هكر ، لكنه يحافظ على رسالة الالتزام القديمة:

$ git reset HEAD^
$ git add <all the files you want, excluding the one you don't want>
$ git commit -C HEAD@{1}

يعجبني هذا لأنه (أ) يستخدم الأوامر التي أستخدمها بانتظام ، و (ب) يمكنني القيام بذلك git add -p لمعرفة بالضبط ما أريد أن ارتكب.


3
2017-10-27 22:45