سؤال

لدي تصحيح صغير تم حفظه بعيدًا في خبأ git الخاص بي. لقد طبقتها على نسخة العمل الخاصة بي باستخدام git stash apply. الآن ، أود أن أخرج هذه التغييرات عن طريق تطبيق التصحيح (نوع من مثل ماذا git revert سوف تفعل ولكن ضد المخبأ).

لا أحد يعرف كيفية القيام بذلك؟

توضيح: هناك تغييرات أخرى في نسخة العمل الخاصة بي. من الصعب وصف حالتي الخاصة ولكن يمكنك أن تتخيل بعض الكود التجريبي أو الكود التجريبي الموجود في المخبأ. الآن تم خلطها في نسخة العمل الخاصة بي مع بعض التغييرات الأخرى وأود أن أرى التأثير مع وبدون التغييرات من المخبأ.

لا يبدو أن المخبأ يدعم هذا حاليًا ، ولكن أ git stash apply --reverse ستكون ميزة جميلة.

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

المحلول

بحسب ال git-stash manpage, ، "يتم تمثيل المخبأ كالتزام يسجل شجرته حالة الدليل العام HEAD عندما تم إنشاء الخبأ ، "و git stash show -p يعطينا "التغييرات المسجلة في المخبأ كصرف بين الحالة المخبأة ووالدها الأصلي.

للحفاظ على تغييراتك الأخرى سليمة ، استخدم git stash show -p | patch --reverse كما في ما يلي:

$ git init
Initialized empty Git repository in /tmp/repo/.git/

$ echo Hello, world >messages

$ git add messages

$ git commit -am 'Initial commit'
[master (root-commit)]: created 1ff2478: "Initial commit"
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 messages

$ echo Hello again >>messages

$ git stash

$ git status
# On branch master
nothing to commit (working directory clean)

$ git stash apply
# On branch master
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       modified:   messages
#
no changes added to commit (use "git add" and/or "git commit -a")

$ echo Howdy all >>messages

$ git diff
diff --git a/messages b/messages
index a5c1966..eade523 100644
--- a/messages
+++ b/messages
@@ -1 +1,3 @@
 Hello, world
+Hello again
+Howdy all

$ git stash show -p | patch --reverse
patching file messages
Hunk #1 succeeded at 1 with fuzz 1.

$ git diff
diff --git a/messages b/messages
index a5c1966..364fc91 100644
--- a/messages
+++ b/messages
@@ -1 +1,2 @@
 Hello, world
+Howdy all

يحرر:

تحسن الضوء في هذا هو الاستخدام git apply بدلاً من التصحيح:

git stash show -p | git apply --reverse

بدلاً من ذلك ، يمكنك أيضًا استخدام git apply -R كاختزال ل git apply --reverse.

لقد وجدت هذا مفيدًا حقًا في الآونة الأخيرة ...

نصائح أخرى

git stash[save] يأخذ حالة دليل العمل الخاصة بك ، وحالة الفهرس الخاصة بك ، وتخبأها بعيدا ، وضع الفهرس ومنطقة العمل إلى HEAD إصدار.

git stash apply يعيد تلك التغييرات ، لذلك git reset --hard سوف يزيلها مرة أخرى.

git stash pop يعيد تلك التغييرات ويزيل التغيير العليا المخبأ ، لذلك git stash [save] سيعود إلى الحالة السابقة (قبل البوب) في هذه الحالة.

git checkout -f

سوف يزيل أي تغييرات غير ملزمة.

Direct Cut N Paste من صفحة Git Manمن الواضح أنه صممه وحتى يتضمن اسم مستعار ؛

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

$ git stash show -p stash@{0} | git apply -R

مرة أخرى ، إذا لم تحدد مخبأ ، فإن Git يفترض أحدث خبأ:

$ git stash show -p | git apply -R

قد ترغب في إنشاء الاسم المستعار وإضافة أمر مخبأ إلى GIT بشكل فعال. فمثلا:

$ git config --global alias.stash-unapply '!git stash show -p | git apply -R'
$ git stash apply
$ #... work work work
$ git stash-unapply

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

git stash [save] سيوفر التغييرات الحالية وضبط فرعك الحالي على "الحالة النظيفة"

git stash list يعطي شيئًا مثل: stash@{0}: On develop: saved testing-stuff

git apply stash@{0} سوف يعين الفرع الحالي على أنه قبل stash [save]

git checkout . سوف يعين الفرع الحالي على أنه بعد، بعدما stash [save]

لم يتم العثور على الرمز الذي يتم حفظه في المخبأ ، يمكن العثور عليه git apply stash@{0} تكرارا.

على أي حال ، هذا عمل بالنسبة لي!

بالإضافة إلى إجابة لحم الخنزير المقدد ، في حالة إضافة الملفات الثنائية إلى الفهرس وكانت جزءًا من المخبأ باستخدام

git stash show -p | git apply --reverse

قد يؤدي إلى

error: cannot apply binary patch to '<YOUR_NEW_FILE>' without full index line
error: <YOUR_NEW_FILE>: patch does not apply

مضيفا --binary يحل المشكلة ، لكن للأسف لم يكتشف السبب حتى الآن.

 git stash show -p --binary | git apply --reverse

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

apply(){
  if [ "$1" ]; then
    git stash apply `git stash list | grep -oPm1 "(.*)(?=:.*:.*$1.*)"`
  fi
}
remove(){
  if [ "$1" ]; then
    git stash show -p `git stash list | grep -oPm1 "(.*)(?=:.*:.*$1.*)"` | git apply -R
    git status
  fi
}
  1. قم بإنشاء مخبأ بالاسم (رسالة) $ git stash save "my stash"
  2. لتسمية Apply $ apply "my stash"
  3. لإزالة خبأ اسمه $ remove "my stash"
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top