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




15 Answers

انت تريد:

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"

    => ابحث عن Stack Overflow - 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 version-control git-commit git-stage

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

git add myfile.txt

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

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




للتوضيح: تقوم 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 rm --cached . -r

سوف "إلغاء إضافة" كل ما قمت بإضافته من الدليل الحالي بشكل متكرر




تمتلك شركة 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 ، لإعادة تعيين ملف myfile.txt الذي تمت إضافته بالفعل ، استخدم:

git reset HEAD myfile.txt

شرح:

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

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




حسب العديد من الإجابات الأخرى ، يمكنك استخدام git reset

لكن:

لقد عثرت على هذه المشاركة الرائعة التي تضيف بالفعل أمر Git (وهو اسم مستعار أيضًا) لـ git unadd : راجع git unadd للحصول على التفاصيل أو ..

ببساطة،

git config --global alias.unadd "reset HEAD"

الآن انت تستطيع

git unadd foo.txt bar.txt



استخدم 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 منذ نشر سؤالك.

$> git --version
git version 1.6.2.1

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

git reset HEAD .

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




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

git rm --cached FILE

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




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

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

إلخ




افترض أن إنشاء ملف جديد newFile.txt .

لنفترض أنني أضفت الملف عن طريق الخطأ ، git add newFile.txt

الآن أريد التراجع عن هذه الإضافة ، قبل الالتزام ، git reset newFile.txt




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

git reset HEAD filename.txt

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

git add -p 

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




أنا مندهش من أن لا أحد يذكر النمط التفاعلي:

git add -i

اختر الخيار 3 لإلغاء إضافة الملفات. في حالتي ، أريد غالبًا إضافة أكثر من ملف واحد ، باستخدام الوضع التفاعلي ، يمكنك استخدام أرقام مثل هذه لإضافة ملفات. سيستغرق ذلك جميعًا ما عدا 4: 1 ، 2 ، 3 ، 5

لاختيار تسلسل اكتب فقط 1-5 لأخذ الكل من 1 إلى 5.

git ملفات التدريج




git add myfile.txt # هذا سيضيف ملفك إلى قائمة ملتزمة

العكس تماما لهذا الأمر هو

git reset HEAD myfile.txt  # this will undo it. 

لذلك ، سوف تكون في حالة سابقة. المحدد سيكون مرة أخرى في قائمة untracked (الحالة السابقة).

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




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

أنا خلقت ملفًا جديدًا وأضفته إلى git. ثم أنا unstaged ذلك باستخدام SourceTree غوي. هذه هي النتيجة:

Unstaging files [08/12/15 10:43]
git -c diff.mnemonicprefix = false -c core.quotepath = false -c credential.helper = sourcetree reset -q - path / to / file / filename.java

SourceTree يستخدم resetلفك الملفات الجديدة.




Related