كيفية التراجع عن "git add" قبل الالتزام؟




version-control git-commit (20)

أقوم بإضافة ملفات git عن طريق الخطأ باستخدام الأمر:

git add myfile.txt

لم git commit بعد بتشغيل git commit . هل هناك طريقة للتراجع عن هذا ، لذا لن يتم تضمين هذه الملفات في الالتزام؟

هناك 48 إجابات حتى الآن (بعضها محذوف). من فضلك لا تضيف واحدة جديدة إلا إذا كان لديك بعض المعلومات الجديدة.


إذا قمت بكتابة:

git status

سوف يخبرك git ما يتم عرضه ، وما إلى ذلك ، بما في ذلك الإرشادات المتعلقة بكيفية إلغاء التثبيت:

use "git reset HEAD <file>..." to unstage

أجد git يقوم بعمل جيد من دفع لي للقيام بالشيء الصحيح في مثل هذه الحالات.

ملاحظة: الإصدارات الحديثة من git (1.8.4.x) قد تغيرت هذه الرسالة:

(use "git rm --cached <file>..." to unstage)

إذا كنت على التزامك الأولي ولا يمكنك استخدام git reset ، فقم فقط بالإعلان عن "Git bankruptcy" وحذف مجلد .git وابدأ من جديد


استخدم git add -i لإزالة الملفات المضافة للتو من التزامك القادم. مثال:

إضافة الملف الذي لا تريده:

$ git add foo
$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       new file:   foo
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
# [...]#

الانتقال إلى التفاعلي إضافة للتراجع عن الإضافة (الأوامر الموجودة في git هنا هي "r" (العودة) ، "1" (الإدخال الأول في قائمة العودة إلى الظهور) ، "العودة" للإسقاط من وضع التراجع ، و "q" (استقال):

$ git add -i
           staged     unstaged path
  1:        +1/-0      nothing foo

*** Commands ***
  1: [s]tatus     2: [u]pdate     3: [r]evert     4: [a]dd untracked
  5: [p]atch      6: [d]iff       7: [q]uit       8: [h]elp
What now> r
           staged     unstaged path
  1:        +1/-0      nothing [f]oo
Revert>> 1
           staged     unstaged path
* 1:        +1/-0      nothing [f]oo
Revert>> 
note: foo is untracked now.
reverted one path

*** Commands ***
  1: [s]tatus     2: [u]pdate     3: [r]evert     4: [a]dd untracked
  5: [p]atch      6: [d]iff       7: [q]uit       8: [h]elp
What now> q
Bye.
$

هذا هو! وإليك إثباتك ، حيث يُظهر "foo" مرة أخرى في القائمة التي لم يتم تتبعها:

$ git status
# On branch master
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
# [...]
#       foo
nothing added to commit but untracked files present (use "git add" to track)
$

استخدم الأمر * للتعامل مع ملفات متعددة في وقت واحد

git reset HEAD *.prj
git reset HEAD *.bmp
git reset HEAD *gdb*

إلخ


انت تريد:

git rm --cached <added_file_to_undo>

منطق:

عندما كنت جديدا على هذا ، حاولت أولا

git reset .

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

fatal: Failed to resolve 'HEAD' as a valid ref.

اتضح أن هذا يرجع إلى أن المرجع HEAD (الفرع؟) غير موجود حتى بعد ارتكاب الأول. أي أنك ستتعرض لمشكلة نفس المبتدئين مثلي إذا كان سير عملك ، مثل مشروعك ، شيء مثل:

  1. مؤتمر نزع السلاح إلى دليل المشروع الجديد العظيم لتجربة Git ، وسخونة جديدة
  2. git init
  3. git add .
  4. git status

    ... الكثير من مخطوطات حماقة من قبل ...

    => اللعنة ، لم أكن أريد أن أضيف كل ذلك.

  5. google "undo git add"

    => ابحث عن - yay

  6. git reset .

    => فادح: فشل في حل "HEAD" كمرجع صالح.

يتضح كذلك أن هناك خطأ تم تسجيله ضد عدم فاعلية هذا في القائمة البريدية.

وأن الحل الصحيح كان موجودًا في خرج حالة Git (والذي ، نعم ، تم تعميضي على أنه "حماقة")

...
# Changes to be committed:
#   (use "git rm --cached <file>..." to unstage)
...

والحل هو في الحقيقة استخدام git rm --cached FILE .

لاحظ التحذيرات في مكان آخر هنا - git rm يحذف نسخة العمل المحلية من الملف ، ولكن ليس إذا كنت تستخدم - مؤقتًا . ها هي نتيجة git help rm :

--cache استخدام هذا الخيار لفك وإزالة المسارات فقط من الفهرس. سيتم ترك ملفات شجرة العمل ، سواء تم تعديلها أم لا.

أنتقل إلى استخدام

git rm --cached .

لإزالة كل شيء والبدء من جديد. لم تعمل على الرغم من ذلك ، لأنه في حين add . هو تكراري ، يتحول إلى rm يحتاج -R إلى recurse. تنهد.

git rm -r --cached .

حسنا ، لقد عدت الآن إلى حيث بدأت. في المرة القادمة -n بتشغيل جاف وشاهد ما سيتم إضافته:

git add -n .

أنا مضغوط كل شيء إلى مكان آمن قبل الثقة git help rm حول --cached لا تدمير أي شيء (وماذا لو أنا أخطأت في تهجئة عليه).


تمتلك شركة Git أوامر لكل إجراء يمكن تخيله ، ولكنها تحتاج إلى معرفة واسعة للحصول على الأمور بشكل صحيح ، وبسبب ذلك فهي غير بديهية في أحسن الأحوال ...

ما فعلته من قبل:

  • غيرت ملف واستخدمت git add . أو git add <file> .

ماتريد:

  • أزل الملف من الفهرس ، ولكن احتفظ به في الإصدار والإصدار مع تغييرات غير ملتزم بها في نسخة العمل:

    git reset head <file>
    
  • إعادة تعيين الملف إلى الحالة الأخيرة من HEAD ، والتراجع عن التغييرات وإزالتها من الفهرس:

    # Think `svn revert <file>` IIRC.
    git reset HEAD <file>
    git checkout <file>
    
    # If you have a `<branch>` named like `<file>`, use:
    git checkout -- <file>
    

    هذا مطلوب لأن git reset --hard HEAD لن يعمل git reset --hard HEAD مع ملفات مفردة.

  • إزالة <file> من الفهرس والإصدار ، مع الاحتفاظ بالملف uned versioned مع التغييرات في نسخة العمل:

    git rm --cached <file>
    
  • إزالة <file> من نسخة العمل والإصدار بالكامل:

    git rm <file>
    

ربما تطورت Git منذ نشر سؤالك.

$> git --version
git version 1.6.2.1

الآن ، يمكنك تجربة:

git reset HEAD .

هذا يجب أن يكون ما كنت أبحث عنه.


فقط اكتب git reset فإنه سيتم العودة مرة أخرى وهو كما لو لم تكتب git add . منذ ارتكابك الأخير. تأكد من أنك ارتكبت من قبل.


لإزالة ملفات جديدة من منطقة التدريج (وفقط في حالة وجود ملف جديد) ، كما هو مقترح أعلاه:

git rm --cached FILE

استخدم rm - تم تخزينها مؤقتًا فقط للملفات الجديدة التي تمت إضافتها بدون قصد.


لإعادة تعيين كل ملف في مجلد معين (ومجلداته الفرعية) ، يمكنك استخدام الأمر التالي:

git reset *

للتوضيح: تقوم git add بنقل التغييرات من دليل العمل الحالي إلى منطقة التدريج (index).

تسمى هذه العملية التدريج . لذا فإن الأمر الأكثر طبيعية في إجراء التغييرات (الملفات التي تم تغييرها) هو الأمر الواضح:

git stage

git add هو مجرد كتابة اسم مستعار أسهل git stage

git unstage لا يوجد git unstage ولا git unadd الأوامر. من الصعب تخمين أو تذكر ذات الصلة ، ولكنها واضحة جدًا:

git reset HEAD --

يمكننا بسهولة إنشاء اسم مستعار لهذا:

git config --global alias.unadd 'reset HEAD --'
git config --global alias.unstage 'reset HEAD --'

وأخيرًا ، لدينا أوامر جديدة:

git add file1
git stage file2
git unadd file2
git unstage file1

أنا شخصياً استخدم أسماء مستعارة أقصر حتى:

git a #for staging
git u #for unstaging

لم يتم طرح السؤال بشكل واضح. والسبب هو أن git add لها معنيان:

  1. إضافة ملف جديد إلى منطقة التدريج ، ثم التراجع مع git rm --cached file .
  2. إضافة ملف معدل إلى منطقة التدريج ، ثم التراجع عن git reset HEAD file .

إذا كنت في شك ، استخدم

git reset HEAD file

لأنها تفعل الشيء المتوقع في كلتا الحالتين.

تحذير: إذا قمت بعمل git rm --cached file على ملف تم تعديله (ملف موجود قبل في المستودع) ، فستتم إزالة الملف على git commit ! سيظل موجودًا في نظام الملفات لديك ، ولكن إذا قام شخص آخر بسحب التزامك ، فسيتم حذف الملف من شجرة العمل الخاصة به.

git status ما إذا كان الملف ملفًا جديدًا أو تم تعديله :

On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    new file:   my_new_file.txt
    modified:   my_modified_file.txt

يمكن استخدام git remove أو git rm لهذا ، مع العلم - --cached . محاولة:

git help rm

يمكنك التراجع عن git add قبل الالتزام بها

git reset <file>

التي ستزيلها من الفهرس الحالي (قائمة "على وشك الالتزام") دون تغيير أي شيء آخر.

يمكنك استخدام

git reset

دون أي اسم ملف لفك جميع التغييرات اللازمة. هذا يمكن أن يكون في متناول اليد عندما يكون هناك الكثير من الملفات ليتم سردها واحدة تلو الأخرى في فترة زمنية معقولة.

في الإصدارات القديمة من Git ، تعادل الأوامر المذكورة أعلاه git reset HEAD <file> و git reset HEAD على التوالي ، وستفشل إذا لم يتم تحديد HEAD (لأنك لم تقم بعد بإجراء أي تعهدات في الريبو الخاص بك) أو غامضة (لأنك إنشاء فرع يسمى HEAD ، وهو شيء غبي لا يجب عليك فعله). تم تغيير هذا في Git 1.8.2 ، على الرغم من ذلك ، في الإصدارات الحديثة من Git يمكنك استخدام الأوامر أعلاه حتى قبل إجراء الالتزام الأول:

"git reset" (بدون خيارات أو معلمات) المستخدمة للخطأ عندما لا يكون لديك أي التزام في تاريخك ، لكنه الآن يمنحك فهرس فارغ (لمطابقة غير موجود ارتكاب لا تعمد حتى).


التراجع عن ملف تمت إضافته بالفعل سهل للغاية باستخدام git ، لإعادة تعيين ملف myfile.txt الذي تمت إضافته بالفعل ، استخدم:

git reset HEAD myfile.txt

شرح:

بعد قيامك بتنظيم ملف (ملفات) غير مرغوب فيه ، للتراجع ، يمكنك إجراء git reset ، ويكون Head رأس ملفك محليًا وتكون المعلمة الأخيرة هي اسم ملفك.

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


لملف معين:

  • git reset my_file.txt
  • git الخروج my_file.txt

لجميع الملفات المضافة:

  • git إعادة.
  • بوابة الخروج.

ملاحظة: يؤدي السحب إلى تغيير الشفرة في الملفات والانتقال إلى آخر حالة (التزام) تم تحديثها. إعادة التعيين لا يغير الرموز ؛ انها مجرد إعادة تعيين رأس.


سيؤدي هذا الأمر إلى إلغاء تنشيط تغييراتك:

git reset HEAD filename.txt

تستطيع ايضا استخذام

git add -p 

لإضافة أجزاء من الملفات.


للتراجع عن استخدام إضافة git

git reset filename


git reset filename.txt

سيزيل ملفًا باسم filename.txt من الفهرس الحالي ، منطقة "على وشك الالتزام" ، دون تغيير أي شيء آخر.


git reset filename.txt  

سيزيل ملفًا باسم filename.txt من الفهرس الحالي ، منطقة "على وشك الالتزام" ، دون تغيير أي شيء آخر.





git-stage