كيف يمكنني تجاهل التغييرات غير المرحلية في Git؟

StackOverflow https://stackoverflow.com/questions/52704

  •  09-06-2019
  •  | 
  •  

سؤال

كيف يمكنني تجاهل التغييرات في نسخة العمل الخاصة بي والتي ليست موجودة في الفهرس؟

هل كانت مفيدة؟

المحلول

طريقة أخرى أسرع هي:

git stash save --keep-index --include-untracked

لا تحتاج إلى تضمين --include-untracked إذا كنت لا تريد أن تكون دقيقًا بشأن هذا الأمر.

بعد ذلك، يمكنك إسقاط هذا المخبأ باستخدام ملف git stash drop الأمر إذا أردت.

نصائح أخرى

بالنسبة لجميع الملفات غير المرحلية في دليل العمل الحالي، استخدم:

git checkout -- .

لاستخدام ملف محدد:

git checkout -- path/to/file/to/revert

-- هنا لإزالة غموض الحجة.

يبدو أن الحل الكامل هو:

git clean -df
git checkout -- .

git clean يزيل كافة الملفات التي لم يتم تعقبها (تحذير:في حين أنه لن يحذف الملفات التي تم تجاهلها والمذكورة مباشرة في .gitignore، قد يحذف الملفات التي تم تجاهلها الموجودة في المجلدات) و git checkout مسح كافة التغييرات غير المرحلية.

يؤدي هذا إلى فحص الفهرس الحالي للدليل الحالي، مما يؤدي إلى التخلص من جميع التغييرات في الملفات من الدليل الحالي إلى الأسفل.

git checkout .

أو هذا الذي يقوم بفحص كافة الملفات من الفهرس، والكتابة فوق ملفات شجرة العمل.

git checkout-index -a -f
git clean -df

ينظف شجرة العمل عن طريق إزالة الملفات التي لا تخضع للتحكم في الإصدار بشكل متكرر، بدءًا من الدليل الحالي.

-d:قم بإزالة الدلائل التي لم يتم تعقبها بالإضافة إلى الملفات التي لم يتم تعقبها

-f:القوة (قد لا تكون ضرورية اعتمادًا على clean.requireForce جلسة)

يجري git help clean لرؤية الدليل

المفضل لدي هو

git checkout -p

يتيح لك ذلك إرجاع القطع بشكل انتقائي.

أنظر أيضا:

git add -p

نظرًا لعدم وجود إجابة تقترح مجموعة الخيارات الدقيقة التي أستخدمها، فها هي:

git clean -dfx
git checkout .

هذا هو نص المساعدة عبر الإنترنت للاستخدام git clean خيارات:

-d

قم بإزالة الدلائل التي لم يتم تعقبها بالإضافة إلى الملفات التي لم يتم تعقبها.إذا تمت إدارة دليل لم يتم تعقبه بواسطة مستودع Git مختلف، فلن تتم إزالته افتراضيًا.يستخدم -f الخيار مرتين إذا كنت تريد حقًا إزالة هذا الدليل.

-f

إذا كان متغير التكوين Git clean.requireForce لم يتم تعيين ل false, ، سيرفض Git clean حذف الملفات أو الدلائل ما لم يتم ذلك -f, -n, ، أو -i.سيرفض Git حذف الدلائل الموجودة داخل ملف .git دليل فرعي أو ملف، ما لم يكن في الثانية -f معطى.

-x

لا تستخدم قواعد التجاهل من .gitignore (لكل دليل) و $GIT_DIR/info/exclude, ، ولكن لا تزال تستخدم قواعد التجاهل المقدمة مع -e خيارات.وهذا يسمح بإزالة جميع الملفات التي لم يتم تعقبها، بما في ذلك منتجات البناء.يمكن استخدام هذا (ربما بالاشتراك مع git reset) لإنشاء دليل عمل أصلي لاختبار البنية النظيفة.

أيضًا، git checkout . يجب القيام به في جذر الريبو.

لقد وجدت هذه المقالة مفيدة حقًا لشرح متى يجب استخدام الأمر: http://www.szakmeister.net/blog/2011/oct/12/reverting-changes-git/

هناك حالتان مختلفتان:

  1. إذا لم تكن قد نظمت الملف، ثم تستخدمه git checkout.يقوم Checkout "بتحديث الملفات في شجرة العمل لتتوافق مع الإصدار الموجود في الفهرس".إذا لم يتم تنظيم الملفات (ويعرف أيضًا باسم إضافتها إلى الفهرس)...سيعمل هذا الأمر بشكل أساسي على إعادة الملفات إلى ما كان عليه التزامك الأخير.

    git checkout -- foo.txt

  2. إذا قمت بتنظيم الملف، فاستخدم gitset.تؤدي إعادة التعيين إلى تغيير الفهرس ليتوافق مع الالتزام.

    git reset -- foo.txt

أظن أن استخدام git stash يعد خيارًا شائعًا لأنه أقل خطورة.يمكنك دائمًا الرجوع إليها إذا أخطأت كثيرًا عن طريق الخطأ عند استخدام gitset.إعادة التعيين متكررة بشكل افتراضي.

ألق نظرة على المقالة أعلاه للحصول على مزيد من النصائح.

أسهل طريقة للقيام بذلك هي باستخدام هذا الأمر:

يُستخدم هذا الأمر لتجاهل التغييرات في دليل العمل -

git checkout -- .

https://git-scm.com/docs/git-checkout

في أمر git، يتم تخزين الملفات التي لم يتم تعقبها باستخدام:

git stash -u

http://git-scm.com/docs/git-stash

إذا كنت ترغب فقط لإزالة التغييرات على الملفات الموجودة, ، يستخدم checkout (موثقة هنا).

git checkout -- .
  • لم يتم تحديد فرع، لذلك يقوم بفحص الفرع الحالي.
  • الواصلة المزدوجة (--) يخبر Git أن ما يلي يجب أن يؤخذ كوسيطة (مسار) ثانية، وأنك تخطيت مواصفات الفرع.
  • الفترة (.) يشير إلى جميع المسارات.

إذا أردت لإزالة الملفات المضافة منذ التزامك الأخير، استخدم clean (موثقة هنا):

git clean -i 
  • ال -i الخيار يبدأ التفاعلية clean, ، لمنع عمليات الحذف الخاطئة.
  • تتوفر مجموعة من الخيارات الأخرى لتنفيذ أسرع؛انظر الوثائق.

لو كنت تريد لنقل التغييرات إلى مساحة الاحتفاظ للوصول إليها لاحقًا, ، يستخدم stash (موثقة هنا):

git stash
  • سيتم نقل جميع التغييرات إلى Git's Stash، لإمكانية الوصول إليها لاحقًا.
  • تتوفر مجموعة من الخيارات للتخزين الأكثر دقة؛انظر الوثائق.

إذا لم تكن مهتمًا بالاحتفاظ بالتغييرات غير المرحلية (خاصة إذا كانت التغييرات المرحلية عبارة عن ملفات جديدة)، فقد وجدت هذا مفيدًا:

git diff | git apply --reverse

أثناء كتابة حالة git،(استخدم "git checkout -- ..." لتجاهل التغييرات في دليل العمل)معروض.

على سبيل المثال git checkout -- .

git checkout -f


man git-checkout:

-f, --force

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

عند سحب المسارات من الفهرس، لا تفشل عند الإدخالات غير المدمجة؛بدلاً من ذلك، يتم تجاهل الإدخالات غير المدمجة.

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

git add .
git stash

إذا تأكدت من أن كل شيء على ما يرام، قم برمي المخبأ بعيدًا:

git stash drop

الجواب من بلال مقصود مع git clean لقد نجح الأمر أيضًا بالنسبة لي، ولكن مع المخبأ لدي المزيد من التحكم - إذا قمت بذلك عن طريق الخطأ، فلا يزال بإمكاني استعادة التغييرات التي أجريتها

تحديث

أعتقد أن هناك تغييرًا واحدًا آخر (لا أعرف سبب نجاح ذلك بالنسبة لي من قبل):

git add . -A بدلاً من git add .

بدون ال -A لن يتم تنظيم الملفات المحذوفة

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

لذلك أفعل ذلك للتأكد من أنهم لا يجلسون هناك عندما أقوم بإعادة تعيين git (لاحقًا - يستبعد gitignores على الأصل/اسم الفرع)

ملحوظة:إذا كنت تريد الاحتفاظ بالملفات التي لم يتم تعقبها بعد، ولكن ليس في GITIGNORE، فقد ترغب في تخطي هذه الخطوة، لأنها ستمسح هذه الملفات التي لم يتم تعقبها والتي لم يتم العثور عليها في مستودعك البعيد (شكرًا @XtrmJosh).

git add --all

ثم انا

git fetch --all

ثم أقوم بإعادة التعيين إلى الأصل

git reset --hard origin/branchname

وهو ما سيعيده إلى المربع الأول.تمامًا مثل إعادة استنساخ الفرع، مع الاحتفاظ بجميع ملفاتي المتجاهلة محليًا وفي مكانها.

تم التحديث حسب تعليق المستخدم أدناه:تغيير لإعادة تعيين أي فرع حالي يستخدمه المستخدم.

git reset --hard @{u}

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

يستخدم git clean -f لإزالة تلك الملفات الجديدة - بحذر رغم ذلك! لاحظ خيار القوة.

قل ببساطة

git stash

سيتم إزالة كافة التغييرات المحلية الخاصة بك.يمكنك أيضًا استخدام لاحقًا بالقول

git stash apply 

أو غيت مخبأ البوب

مجرد استخدام:

git stash -u

منتهي.سهل.

اذا أنت حقًا اهتم بمكدس مخبأتك ثم يمكنك المتابعة معه git stash drop.ولكن في هذه المرحلة من الأفضل أن تستخدم (من Mariusz Nowak):

git checkout -- .
git clean -df

ومع ذلك، أنا أحب git stash -u الأفضل لأنه "يتجاهل" كافة التغييرات المتعقبة وغير المتعقبة في فقط أمر واحد.حتى الآن git checkout -- . فقط يتجاهل التغييرات ، و git clean -df يتجاهل فقط التغييرات التي لم يتم تعقبها...وكتابة كلا الأمرين بعيد الكثير من العمل :)

وهذا يعمل حتى في الدلائل التي؛خارج أذونات git العادية.

sudo chmod -R 664 ./* && git checkout -- . && git clean -dfx

حدث لي مؤخرا

cd path_to_project_folder  # take you to your project folder/working directory 
git checkout .             # removes all unstaged changes in working directory

بغض النظر عن حالة الريبو الخاصة بك، يمكنك دائمًا إعادة التعيين إلى أي التزام سابق:

git reset --hard <commit hash>

سيؤدي هذا إلى تجاهل جميع التغييرات التي تم إجراؤها بعد هذا الالتزام.

هناك طريقة أخرى للتخلص من الملفات الجديدة أكثر تحديدًا من git clean -df (سوف تسمح لك بالتخلص من بعض الملفات وليس بالضرورة كلها)، وهي إضافة الملفات الجديدة إلى الفهرس أولاً، ثم تخزينها، ثم إسقاط الملف خبأ.

تكون هذه التقنية مفيدة عندما لا يمكنك، لسبب ما، حذف كافة الملفات التي لم يتم تعقبها بسهولة بواسطة آلية عادية (مثل rm).

في رأيي،

git clean -df

يجب أن تفعل الخدعة.حسب وثائق جيت على بوابة نظيفة

git-clean - إزالة الملفات التي لم يتم تعقبها من شجرة العمل

وصف

يقوم بتنظيف شجرة العمل عن طريق إزالة الملفات بشكل متكرر والتي لا تخضع للسيطرة على الإصدار ، بدءًا من الدليل الحالي.

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

إذا كان أي اختياري ...يتم إعطاء الحجج ، فقط تلك المسارات تتأثر.

خيارات

-d إزالة الدلائل التي لم يتم تعقبها بالإضافة إلى الملفات التي لم يتم تعقبها.إذا تمت إدارة دليل غير مرغوب فيه بواسطة مستودع GIT مختلف ، فلن تتم إزالته افتراضيًا.استخدم -f الخيار مرتين إذا كنت تريد حقًا إزالة مثل هذا الدليل.

-F -القوة إذا كان متغير تكوين GIT Clean.requireforce لم يتم ضبطه على خطأ ، فإن GIT Clean سوف يرفض التشغيل ما لم يتم تقديم -f ، -n أو -i.

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

لقد واجهت مشكلة مماثلة، وربما ليست متطابقة، ويؤسفني أن أقول إن الحل الذي توصلت إليه ليس مثاليًا، ولكنه فعال في النهاية.

غالبًا ما أحصل على رسائل حالة git مثل هذه (تتضمن 2/4 ملفات على الأقل):

$ git status
# Not currently on any branch.
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       modified:   doc/PROJECT/MEDIUM/ATS-constraint/constraint_s2var.dats
#       modified:   doc/PROJECT/MEDIUM/ATS-constraint/parsing/parsing_s2var.dats
#
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       modified:   doc/PROJECT/MEDIUM/ATS-constraint/constraint_s2Var.dats
#       modified:   doc/PROJECT/MEDIUM/ATS-constraint/parsing/parsing_s2Var.dats

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

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

عندما تريد نقل مخبأ إلى شخص آخر:

# add files
git add .  
# diff all the changes to a file
git diff --staged > ~/mijn-fix.diff
# remove local changes 
git reset && git checkout .
# (later you can re-apply the diff:)
git apply ~/mijn-fix.diff

[عدل] كما علق، من الممكن تسمية المخابئ.حسنًا، استخدم هذا إذا كنت تريد مشاركة مخبأتك ;)

يمكنك إنشاء الاسم المستعار الخاص بك والذي يصف كيفية القيام بذلك بطريقة وصفية.

أستخدم الاسم المستعار التالي لتجاهل التغييرات.


تجاهل التغييرات في (قائمة) الملف (الملفات) في شجرة العمل

discard = checkout --

ثم يمكنك استخدامه كتالي لتجاهل كافة التغييرات:

discard .

أو مجرد ملف:

discard filename

بخلاف ذلك، إذا كنت تريد تجاهل جميع التغييرات وأيضًا الملفات التي لم يتم تعقبها، فأنا أستخدم مزيجًا من الخروج والتنظيف:

تنظيف وتجاهل التغييرات والملفات التي لم يتم تعقبها في شجرة العمل

cleanout = !git clean -df && git checkout -- .

وبالتالي فإن الاستخدام بسيط على النحو التالي:

cleanout

متوفر الآن في Github repo التالي والذي يحتوي على الكثير من الأسماء المستعارة:

إذا تم تنفيذ جميع الملفات المرحلية بالفعل، فيمكن ببساطة إعادة تعيين الفرع على سبيل المثال.من واجهة المستخدم الرسومية الخاصة بك بحوالي ثلاث نقرات بالماوس: فرع, إعادة ضبط, نعم!

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

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

قد لا يكون هذا هو الحل التقني الذي تبحث عنه لمشكلتك، لكنني أجده حلاً عمليًا للغاية.فهو يسمح لك بتجاهل التغييرات غير المرحلية بشكل انتقائي، وإعادة تعيين التغييرات التي لا تريدها، والاحتفاظ بالتغييرات التي تريدها.

باختصار، أنا أفعل ذلك بكل بساطة يقترف, إعادة تعيين الفرع, ، و تعديل الالتزام الأخير.

إذا كنت في حالة الوحدة الفرعية ولم تنجح أي حلول أخرى، فجرب:

  • للتحقق من المشكلة (ربما حالة "قذرة") استخدم:

    git diff

  • لإزالة المخبأ

    git submodule update

لقد واجهت موقفًا غريبًا حيث كان الملف دائمًا غير منظم، وهذا يساعدني على الحل.

بوابة RM .gitattributes
بوابة إضافة -A
إعادة تعيين بوابة - من الصعب

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

git update-index --assume-unchanged file_to_ignore

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top