it-swarm.asia

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

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

git add myfile.txt

لم أركض حتى الآن git commit. هل هناك طريقة للتراجع عن هذا ، لذلك لن يتم تضمين هذه الملفات في الالتزام؟


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

8101
paxos1977

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

git reset <file>

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

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

git reset

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

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

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

9181
genehack

انت تريد:

git rm --cached <added_file_to_undo>

منطق:

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

git reset .

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

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

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

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

    ... الكثير من لفائف حماقة بواسطة ...

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

  5. google "تراجع عن إضافة git"

    => ابحث عن 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:

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

أنا المضي قدما في استخدام

git rm --cached .

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

git rm -r --cached .

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

git add -n .

قمت بنسخ كل شيء في مكان آمن قبل الوثوق بـ git help rm حول --cached لا أتلف أي شيء (وماذا لو أخطأت في الكتابة).

2047
Rhubarb

إذا كتبت:

git status

سوف يخبرك git بما يتم تنظيمه ، وما إلى ذلك ، بما في ذلك الإرشادات الخاصة بكيفية التخلص من الضوضاء:

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

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

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

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

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

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

git stage

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

من المؤسف أنه لا توجد أوامر 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
238
takeshin

إضافة إلى الإجابة المقبولة ، إذا كان ملفك المُضاف بطريق الخطأ كبيرًا ، فربما تلاحظ أنه ، حتى بعد إزالته من الفهرس بـ "git reset" ، لا يزال يبدو أنه يشغل مساحة في دليل .git. لا يوجد ما يدعو للقلق ، فالملف لا يزال موجودًا بالفعل في المستودع ، ولكن فقط "ككائن فضفاض" ، لن يتم نسخه إلى مستودعات أخرى (عن طريق clone ، Push) ، وسيتم استعادة المساحة في النهاية - على الرغم من ربما ليس قريبا جدا. إذا كنت قلقًا ، يمكنك الجري:

git gc --Prune=now

تحديث (فيما يلي محاولتي لمسح بعض الالتباس الذي يمكن أن ينشأ من الإجابات الأكثر تصويتًا):

إذن ، ما هو تراجع الحقيقي لـ git add؟

git reset HEAD <file>؟

أو

git rm --cached <file>؟

بالمعنى الدقيق للكلمة ، وإذا لم أكن مخطئا: لا شيء.

git add(لا يمكن التراجع - بأمان ، بشكل عام.

لنتذكر أولاً ما يفعله git add <file> فعليًا:

  1. إذا كان <file>لم يتم تعقبه سابقًا ، git addيضيفه إلى ذاكرة التخزين المؤقت ، مع محتواه الحالي.

  2. إذا كان <file>تم التعقب بالفعل ، git addيحفظ المحتوى الحالي (لقطة ، إصدار) في ذاكرة التخزين المؤقت. في GIT ، لا يزال يسمى هذا الإجراء add ، (وليس مجرد update it) ، لأن نسختين مختلفتين (لقطات) من الملف تعتبر عنصرين مختلفين: وبالتالي ، نحن إضافة عنصر جديد بالفعل إلى ذاكرة التخزين المؤقت ، ليتم الالتزام به لاحقًا.

في ضوء ذلك ، فإن السؤال غامض بعض الشيء:

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

يبدو أن سيناريو OP هو الأول (الملف الذي لم يتم تتبعه) ، فنحن نريد "التراجع" لإزالة الملف (وليس فقط المحتويات الحالية) من العناصر المتعقبة. If هذه هي الحالة ، فلا بأس في تشغيل git rm --cached <file>.

ويمكننا أيضًا تشغيل git reset HEAD <file>. هذا هو الأفضل بشكل عام ، لأنه يعمل في كلا السيناريوهين: إنه يعمل أيضًا على التراجع عندما قمنا بشكل خاطئ بإضافة نسخة من عنصر تم تتبعه بالفعل.

ولكن هناك اثنين من المحاذير.

أولاً: لا يوجد (كما هو موضح في الإجابة) سوى سيناريو واحد لا يعمل فيه git reset HEAD ، لكن git rm --cached يعمل: مستودع جديد (لا يوجد أي التزام). ولكن ، في الواقع ، هذه حالة غير ذات صلة عمليا.

ثانياً: كن على دراية بأنه لا يمكن لـ git reset HEAD سحريًا استرداد محتويات الملف المخزنة مؤقتًا مسبقًا ، بل يعيدها فقط من HEAD. إذا استبدلنا git add المضلل بإصدار سابق غير مرتبط على مراحل ، فلن نتمكن من استعادته. لهذا السبب ، بالمعنى الدقيق للكلمة ، لا يمكننا التراجع عن [*].

مثال:

$ git init
$ echo "version 1" > file.txt
$ git add file.txt   # first add  of file.txt
$ git commit -m 'first commit'
$ echo "version 2" > file.txt
$ git add  file.txt   # stage (don't commit) "version 2" of file.txt
$ git diff --cached file.txt
-version 1
+version 2
$ echo "version 3" > file.txt   
$ git diff  file.txt
-version 2
+version 3
$ git add  file.txt    # oops we didn't mean this
$ git reset HEAD file.txt  # undo ?
$ git diff --cached file.txt  # no dif, of course. stage == HEAD
$ git diff file.txt   # we have lost irrevocably "version 2"
-version 1
+version 3

بالطبع ، هذا ليس بالغ الأهمية إذا اتبعنا سير العمل البطيء المعتاد المتمثل في "إضافة git" فقط لإضافة ملفات جديدة (الحالة 1) ، وقمنا بتحديث محتويات جديدة عبر الأمر الالتزام git commit -a.


* (تحرير: ما سبق صحيحًا من الناحية العملية ، ولكن لا يزال من الممكن أن تكون هناك بعض الطرق المخترقة/المعقدة قليلاً لاستعادة التغييرات التي تم تنظيمها ولكن لم يتم الالتزام بها ثم الكتابة فوقها - راجع التعليقات التي قام بها يوهانس ماتوكيك وإولسميت)

161
leonbloy
git rm --cached . -r

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

91
braitsch

يركض

git gui

وقم بإزالة جميع الملفات يدويًا أو عن طريق تحديدها جميعًا والنقر فوق الزر إلغاء التثبيت من الالتزام .

85
Khaja Minhajuddin

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

git reset HEAD myfile.txt

اشرح:

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

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

 git reset HEAD file

82
Alireza

لدى 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 لن يعمل مع الملفات الفردية.

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

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

    git rm <file>
    
80
sjas

لم يتم طرح السؤال بوضوح. السبب هو أن 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
71
Michael_Scharf

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

61
Paul Betts

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

ولكن:

لقد وجدت هذا المنشور الصغير العظيم الذي يضيف فعليًا أمر Git (اسم مستعار جيدًا) لـ git unadd: راجع git unadd للحصول على التفاصيل أو ..

ببساطة،

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

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

git unadd foo.txt bar.txt
55
electblake

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

git help rm
46
gnud

استخدم 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" (revert) ، "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)
$
42
Alex North-Keys

إليك طريقة لتجنب هذه المشكلة المحيرة عند بدء مشروع جديد:

  • أنشئ الدليل الرئيسي لمشروعك الجديد.
  • تشغيل git init.
  • الآن قم بإنشاء ملف .gitignore (حتى لو كان فارغًا).
  • ارتكب ملف .gitignore الخاص بك.

Git يجعل الأمر صعبًا فعلًا git reset إذا لم يكن لديك أي تعهدات. إذا أنشأت التزامًا أوليًا صغيرًا فقط من أجل الحصول على التزام ، فيمكنك بعد ذلك git add -A و git reset عدة مرات كما تريد من أجل الحصول على كل شيء بشكل صحيح.

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

  • تحقق من أن الالتزام الأولي. سيؤدي هذا إلى إزالة جميع الملفات الخاصة بك.
  • ثم تحقق من الالتزام الأخير الخاص بك مرة أخرى. سيؤدي هذا إلى استرداد نُسخ جديدة من ملفاتك ، باستخدام إعدادات نهاية السطر الحالية.
37
Ryan Lundy

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

$> git --version
git version 1.6.2.1

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

git reset HEAD .

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

33
Kokotte23

لاحظ أنك إذا فشلت في تحديد مراجعة ، فعليك تضمين فاصل. مثال من وحدة التحكم الخاصة بي:

git reset <path_to_file>
fatal: ambiguous argument '<path_to_file>': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions

git reset -- <path_to_file>
Unstaged changes after reset:
M   <path_to_file>

(بوابة الإصدار 1.7.5.4)

33
powlo

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

git rm --cached FILE

استخدم rm - مؤقتًا فقط للملفات الجديدة المضافة بطريق الخطأ.

30
Ran

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

git reset *
24
Zorayr

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

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

إلخ

24
boulder_ruby

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

22
Donovan

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

 enter image description here

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

 enter image description here

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

 enter image description here

18
Vidura Mudalige

لملف محدد:

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

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

  • بوابة إعادة تعيين.
  • بوابة الخروج.

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

17
Hasib Kamal

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

git reset filename

13
Anirudh Sood

سيؤدي هذا الأمر إلى إلغاء تثبيت تغييراتك:

git reset HEAD filename.txt

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

git add -p 

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

13
wallerjake

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

git add -i

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

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

Git gaging files

13
Jonathan

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

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

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

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

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

9
Silent Spectator
git reset filename.txt

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

9
Rahul Sinha

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

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

الملفات غير الثابتة [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 لإلغاء تثبيت الملفات الجديدة.

8
miva2
git reset filename.txt  

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

7
Joseph Mathew

أحد الحلول الأكثر سهولة هو استخدام SourceTree .

يمكنك فقط سحب وإفلات الملفات من المرحلتين وبدون مراحل  enter image description here

7
Marcin Szymczak

يساعدك الأمر git reset على تعديل منطقة التدريج أو منطقة التدريج وشجرة العمل. تعني قدرة Git على صياغة ما تريده تمامًا أنك تحتاج أحيانًا إلى التراجع عن التغييرات التي أجريتها باستخدام git add.

يمكنك القيام بذلك عن طريق الاتصال بـ git reset HEAD <file to change>. لديك خياران للتخلص من التغييرات تمامًا. git checkout HEAD <file(s) or path(s)> هي طريقة سريعة للتراجع عن التغييرات في منطقة التدريج وشجرة العمل. كن حذرا مع هذا الأمر ، لأنه يزيل جميع التغييرات على شجرة العمل الخاصة بك. لا يعلم Git عن تلك التغييرات لأنها لم تلتزم مطلقًا. لا توجد طريقة لاستعادة هذه التغييرات بمجرد تشغيل هذا الأمر.

أمر آخر تحت تصرفك هو git reset --hard. إنه مدمر بنفس القدر لشجرة العمل الخاصة بك - أي تغييرات غير ملتزم بها أو التغييرات المرحلية تضيع بعد تشغيلها. تشغيل git reset -hard HEAD يفعل نفس الشيء مثل git checkout HEAD. انها فقط لا تتطلب ملف أو مسار للعمل.

يمكنك استخدام --soft مع git reset. يقوم بإعادة ضبط مستودع التخزين على الالتزام الذي تحدده وضبط كل هذه التغييرات. لن تتأثر أي تغييرات قمت بتنظيمها بالفعل ، ولا التغييرات في شجرة العمل الخاصة بك.

أخيرًا ، يمكنك استخدام --mixed لإعادة تعيين شجرة العمل دون إجراء أي تغييرات. هذا أيضا unstages أي التغييرات التي يتم تنظيمها.

1
SAIguru011