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




15 Answers

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

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

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

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

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




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

git clean -df
git checkout -- .

git-scm.com/docs/git-clean بإزالة جميع الملفات غير المتحررة ( تحذير : على الرغم من أنه لن يقوم بحذف الملفات التي تم تجاهلها والتي تم ذكرها مباشرة في .gitignore ، فقد يحذف الملفات التي تم تجاهلها والموجودة في المجلدات ) ويؤدي git checkout مسح جميع التغييرات غير الثابتة.




git clean -df

ينظف شجرة العمل بشكل متكرر لإزالة الملفات التي ليست تحت تحكم الإصدار ، بدءا من الدليل الحالي.

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

-f : Force (قد لا تكون ضرورية بناءً على الإعداد clean.requireForce )

تشغيل git help clean لرؤية الدليل




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

git clean -dfx
git checkout .

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

-d

قم بإزالة دلائل untracked بالإضافة إلى الملفات untracked. إذا تم إدارة دليل untracked بواسطة مستودع 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 . يجب القيام به في جذر الريبو.




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

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

git checkout -- .

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

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

git stash -u

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




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

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




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

git add .
git stash

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

git stash drop

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

تحديث

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

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

بدون -A لن يتم عرض الملفات التي تمت إزالتها




إذا كنت ترغب فقط في إزالة التغييرات إلى الملفات الموجودة ، استخدم checkout ( https://git-scm.com/docs/git-checkout ).

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

إذا كنت ترغب في إزالة الملفات التي تمت إضافتها منذ ارتكابك الأخير ، فاستخدم clean ( git-scm.com/docs/git-clean ):

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

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

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



ببساطة قل

git stash

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

git stash apply 

أو git stash pop




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

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

حدث لي مؤخرا




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

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




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

كان لدي مشكلة مماثلة ، وربما غير متطابقة ، وأنا حزين لأن أقول إن الحل ليس مثاليا ، لكنه فعال في نهاية المطاف.

غالبًا ما أحصل على رسائل حالة مثل هذه (تتضمن ملفات 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

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

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

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




لا يعمل أي من الحلول إذا قمت بتغيير أذونات الملف (هذا على DOS / Windoze)

Mon 23/11/2015-15:16:34.80 C:\...\work\checkout\slf4j+> git status
On branch SLF4J_1.5.3
Changes not staged for commit:
  (use "git add ..." to update what will be committed)
  (use "git checkout -- ..." to discard changes in working directory)

        modified:   .gitignore
        modified:   LICENSE.txt
        modified:   TODO.txt
        modified:   codeStyle.xml
        modified:   pom.xml
        modified:   version.pl

no changes added to commit (use "git add" and/or "git commit -a")

Mon 23/11/2015-15:16:37.87 C:\...\work\checkout\slf4j+> git diff
diff --git a/.gitignore b/.gitignore
old mode 100644
new mode 100755
diff --git a/LICENSE.txt b/LICENSE.txt
old mode 100644
new mode 100755
diff --git a/TODO.txt b/TODO.txt
old mode 100644
new mode 100755
diff --git a/codeStyle.xml b/codeStyle.xml
old mode 100644
new mode 100755
diff --git a/pom.xml b/pom.xml
old mode 100644
new mode 100755
diff --git a/version.pl b/version.pl
old mode 100644
new mode 100755

Mon 23/11/2015-15:16:45.22 C:\...\work\checkout\slf4j+> git reset --hard HEAD
HEAD is now at 8fa8488 12133-CHIXMISSINGMESSAGES MALCOLMBOEKHOFF 20141223124940 Added .gitignore

Mon 23/11/2015-15:16:47.42 C:\...\work\checkout\slf4j+> git clean -f

Mon 23/11/2015-15:16:53.49 C:\...\work\checkout\slf4j+> git stash save -u
Saved working directory and index state WIP on SLF4J_1.5.3: 8fa8488 12133-CHIXMISSINGMESSAGES MALCOLMBOEKHOFF 20141223124940 Added .gitignore
HEAD is now at 8fa8488 12133-CHIXMISSINGMESSAGES MALCOLMBOEKHOFF 20141223124940 Added .gitignore

Mon 23/11/2015-15:17:00.40 C:\...\work\checkout\slf4j+> git stash drop
Dropped refs/[email protected]{0} (cb4966e9b1e9c9d8daa79ab94edc0c1442a294dd)

Mon 23/11/2015-15:17:06.75 C:\...\work\checkout\slf4j+> git stash drop
Dropped refs/[email protected]{0} (e6c49c470f433ce344e305c5b778e810625d0529)

Mon 23/11/2015-15:17:08.90 C:\...\work\checkout\slf4j+> git stash drop
No stash found.

Mon 23/11/2015-15:17:15.21 C:\...\work\checkout\slf4j+> git checkout -- .

Mon 23/11/2015-15:22:00.68 C:\...\work\checkout\slf4j+> git checkout -f -- .

Mon 23/11/2015-15:22:04.53 C:\...\work\checkout\slf4j+> git status
On branch SLF4J_1.5.3
Changes not staged for commit:
  (use "git add ..." to update what will be committed)
  (use "git checkout -- ..." to discard changes in working directory)

        modified:   .gitignore
        modified:   LICENSE.txt
        modified:   TODO.txt
        modified:   codeStyle.xml
        modified:   pom.xml
        modified:   version.pl

no changes added to commit (use "git add" and/or "git commit -a")

Mon 23/11/2015-15:22:13.06 C:\...\work\checkout\slf4j+> git diff
diff --git a/.gitignore b/.gitignore
old mode 100644
new mode 100755
diff --git a/LICENSE.txt b/LICENSE.txt
old mode 100644
new mode 100755
diff --git a/TODO.txt b/TODO.txt
old mode 100644
new mode 100755
diff --git a/codeStyle.xml b/codeStyle.xml
old mode 100644
new mode 100755
diff --git a/pom.xml b/pom.xml
old mode 100644
new mode 100755
diff --git a/version.pl b/version.pl
old mode 100644
new mode 100755

الطريقة الوحيدة لإصلاح هذا هي إعادة تعيين الأذونات على الملفات التي تم تغييرها يدوياً:

Mon 23/11/2015-15:25:43.79 C:\...\work\checkout\slf4j+> git status -s | egrep "^ M" | cut -c4- | for /f "usebackq tokens=* delims=" %A in (`more`) do chmod 644 %~A

Mon 23/11/2015-15:25:55.37 C:\...\work\checkout\slf4j+> git status
On branch SLF4J_1.5.3
nothing to commit, working directory clean

Mon 23/11/2015-15:25:59.28 C:\...\work\checkout\slf4j+>

Mon 23/11/2015-15:26:31.12 C:\...\work\checkout\slf4j+> git diff




إذا كنت تعمل في حالة ما إذا كان هناك أي نوع آخر من الحلول الفرعية ، فليس عليك عمل حلول أخرى:

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

    git diff

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

    git submodule update




Related

git

Tags

git