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


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 لا تدمير أي شيء (وماذا لو أنا أخطأت في تهجئة عليه).

Question

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

git add myfile.txt

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




استخدم 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 *



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

$> git --version
git version 1.6.2.1

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

git reset HEAD .

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




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

git reset HEAD myfile.txt

شرح:

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

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




للتوضيح: تقوم 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 أوامر لكل إجراء يمكن تخيله ، ولكنها تحتاج إلى معرفة واسعة للحصول على الأمور بشكل صحيح ، وبسبب ذلك فهي غير بديهية في أحسن الأحوال ...

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

  • غيرت ملف واستخدمت 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 reset filename.txt

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




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

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

ملفات unstaging [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 إلى unstage ملفات جديدة.




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




git rm --cached . -r

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




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

git rm --cached FILE

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




git reset filename.txt  

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




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

git reset filename




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

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

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




Related