কিভাবে একটি স্ট্যাশ প্রয়োগ বিপরীত?


233

আমার গিট স্ট্যাশে আমি একটি ছোট প্যাচ সংরক্ষণ করেছি। আমি এটি ব্যবহার করে আমার ওয়ার্কিং কপিটিতে প্রয়োগ করেছি git stash apply। এখন, আমি প্যাচ প্রয়োগ করে উল্টিয়ে এই পরিবর্তনগুলি ফিরিয়ে আনা করতে চাই ( git revertস্ট্যাশগুলির বিরুদ্ধে যা করা উচিত তবে তা পছন্দ করুন )।

কেউ কি জানেন, এটা কিভাবে করে?

স্পেসিফিকেশন: আমার ওয়ার্কিং কপির অন্যান্য পরিবর্তন রয়েছে। আমার বিশেষ কেসটি বর্ণনা করা শক্ত তবে আপনি স্ট্যাশগুলিতে থাকা কিছু ডিবাগিং বা পরীক্ষামূলক কোডটি কল্পনা করতে পারেন। এখন এটি আমার কার্যকরী অনুলিমে কিছু অন্যান্য পরিবর্তনের সাথে মিশ্রিত হয়েছে এবং আমি স্ট্যাশ থেকে আসা পরিবর্তনগুলি ছাড়া এবং এর প্রভাব দেখতে চাই।

দেখে মনে হচ্ছে না স্ট্যাশ এটি বর্তমানে সমর্থন করে তবে একটি দুর্দান্ত git stash apply --reverseবৈশিষ্ট্য হবে।


1
কেবলমাত্র বর্তমান এবং পূর্ববর্তী সংশোধনগুলির মধ্যে পার্থক্য করে কেবল একটি বিপরীত প্যাচ তৈরি করতে পারি না? এবং তারপর যে একটি প্রয়োগ?
রালফিথিনেঞ্জ

কার্যত গাছের মধ্যে প্রয়োগকৃত স্ট্যাশ ছাড়াও কি পরিবর্তন রয়েছে?
গ্রেগ বেকন

এটি এখানে যুক্ত করা, ... একটি প্রশ্ন হওয়া উচিত নয় এমন একটি FAQ হওয়ার কথা ... স্ট্যাকওভারফ্লো
ডন টমাস বয়েল

উত্তর:


188

মতে Git-লুকোবার জায়গা র 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

আমি ইদানীং এটি সত্যিই কার্যকর খুঁজে পেয়েছি ...


2
অান্তরিক ধন্যবাদ. দেখে মনে হচ্ছে স্ট্যাশগুলির জন্য এটি দুর্দান্ত বৈশিষ্ট্য হতে পারে।
প্যাট নটজ

5
হ্যাঁ, git apply -Rএকটি উন্নতি, অন্তত আমার উইন্ডোজ বাক্সে গিট ব্যাশের সাথে patch --reverseফাইলের প্যাচ করার জন্য ফাইলটি সনাক্ত করতে সমস্যা হওয়ায় (বিকল্পটি কেন কাজ করেছে তা সত্য নয়)। +1 এবং ভাল ব্যাখ্যা
hakre

এটি --indexঠিক যুক্ত করা ভাল না git stash show -p | git apply --reverse --index? কারণ আপনাকে আর সূচিগুলিতে ফিরে যাওয়ার পরিবর্তিত পরিবর্তনগুলি যুক্ত করতে হবে না।
দ্য ইউএন7777

3
@Greg বেকন, হেই, আমি স্ক্রিপ্ট যে আপনার রূপরেখা মধ্য দিয়ে যেতে চেষ্টা করেছি, কিন্তু প্যাচ ব্যর্থ যখন আমি দৌড়ে git stash show -p | git apply -R -vবার্তা সঙ্গে: Checking patch messages... error: while searching for: Hello, world Hello again error: patch failed: messages:1। আপনি কি জানেন ভুল হতে পারে?
ম্যাক্স কোরেটস্কি

5
আমি ত্রুটি পেয়েছি : প্যাচ ব্যর্থ হয়েছে: /src/filename.java:46 ত্রুটি: src / filename.java প্যাচ প্রযোজ্য নয়
টিম বোল্যান্ড

83

git stash[save]আপনার কার্যক্ষম ডিরেক্টরি এবং আপনার সূচকের স্থিতি নেয় এবং এগুলিকে ছড়িয়ে দেয়, সূচি এবং কার্যক্ষেত্রকে HEADসংস্করণে সেট করে।

git stash applyএই পরিবর্তনগুলি ফিরিয়ে আনে, তাই git reset --hardএগুলি আবার সরিয়ে ফেলবে।

git stash popএই পরিবর্তনগুলি ফিরিয়ে আনে এবং শীর্ষস্থানীয় স্ট্যাশড পরিবর্তনগুলি সরিয়ে দেয়, সুতরাং git stash [save]এই ক্ষেত্রে পূর্ববর্তী (প্রাক-পপ) অবস্থায় ফিরে আসবে।


82
git checkout -f

কোনও অ-অঙ্গীকারবদ্ধ পরিবর্তন মুছে ফেলবে।


4
ধন্যবাদ, আপনি আমাকে পর্যায়ক্রমে পরিবর্তন থেকে সহায়তা করেছেন যা প্রয়োগ হয়নি।
ফা.শাপুরি

1
এটি অনেক সহজ ছিল
মার্ক করুন

এই দুর্দান্ত ছিল!
কিরণ এসকি

22

ভি 1 গিট ম্যান পৃষ্ঠায় কোনও স্ট্যাশ আন-প্রয়োগ সম্পর্কে একটি উল্লেখ রয়েছে। উদ্ধৃতিটি নীচে রয়েছে।

নতুন ভি 2 গিট ম্যান পৃষ্ঠাতে কোনও স্ট্যাশ আন-প্রয়োগ করার বিষয়ে কোনও রেফারেন্স অন্তর্ভুক্ত নেই তবে নীচে এখনও ভালভাবে কাজ করে

কোনও স্ট্যাশ আন-প্রয়োগ না করা কিছু ব্যবহারের ক্ষেত্রে আপনি স্ট্যাশড পরিবর্তনগুলি প্রয়োগ করতে পারেন, কিছু কাজ করতে পারেন, তবে তারপরে মূলত স্ট্যাশ থেকে আসা পরিবর্তনগুলি আন-প্রয়োগ করুন। গিট এ জাতীয় স্ট্যাশ আন-প্রয়োগ আদেশটি সরবরাহ করে না, তবে কেবল স্ট্যাশের সাথে যুক্ত প্যাচটি পুনরুদ্ধার করে এবং বিপরীতে প্রয়োগ করে প্রভাব অর্জন করা সম্ভব:

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

আবার, যদি আপনি কোনও স্ট্যাশ নির্দিষ্ট না করেন, গিট সবচেয়ে সাম্প্রতিক স্ট্যাশ ধরে:

$ git stash show -p | git apply -R

আপনি একটি উপাধি তৈরি করতে এবং কার্যকরভাবে আপনার গিটকে স্ট্যাশ-প্রয়োগযোগ্য কমান্ড যুক্ত করতে চাইতে পারেন। উদাহরণ স্বরূপ:

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

1
যে কারণেই এই সহায়ক বিভাগটি আপনি "স্ট্যাশ আন-প্রয়োগ করা" যুক্ত করেছেন এটি দ্বিতীয় সংস্করণ থেকে সরানো হয়েছে -এই সর্বশেষতম সংস্করণটি এখন 2.2.1.17, 2019-04-15- এই বইয়ের ভি 2- গিট সরঞ্জামগুলির - স্ট্যাশিং এবং ক্লিনিংয়ের । হতে পারে কারণ লেখকরা মনে করেন এটি করার আরও ভাল উপায় আছে যা আমি খুঁজে পেতে পারি না বলে মনে হয়।
নাদ আলাবা

@ নাদ আলাবা মাথা নেওয়ার জন্য ধন্যবাদ জানালেন, ভি 1 এবং ভি 2 এর মধ্যে পার্থক্য সম্পর্কে মন্তব্য করার জন্য উত্তরটি আপডেট করেছেন ... অদ্ভুত গিট লেখকরা স্ট্যাশ আন-প্রয়োগ সম্পর্কে বিভাগটি সরিয়ে দিয়েছেন
চকো স্মিথ

13

এটি যথেষ্ট সময় শেষ, তবে আমি যদি সমস্যার সঠিকভাবে ব্যাখ্যা করি তবে আমি একটি সহজ সমাধান খুঁজে পেয়েছি, দ্রষ্টব্য, এটি আমার নিজের পরিভাষায় এটি একটি ব্যাখ্যা:

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 apply --reverseপ্রথম প্রয়োগ করেছি এবং তারপরে git stash apply stash@{x}আপনি যা উল্লেখ করেছেন ঠিক তেমন ফিরে গিয়েছি । কোনও সমস্যা ছাড়াই কাজ করেছেন।
কার্লোস গার্সিয়া

3

কিভাবে একটি স্ট্যাশ প্রয়োগ বিপরীত?

অন্যরা যা উল্লেখ করেছে তা বাদ দিয়ে প্রথমে সহজ উপায় way

git reset HEAD

এবং তারপরে সমস্ত স্থানীয় পরিবর্তনগুলি চেকআউট করুন

git checkout . 

এটি এখন পর্যন্ত সবচেয়ে সহজতম উপায় যতক্ষণ না আপনার কাছে সংরক্ষণের জন্য স্থানীয় কোনও কাজ নেই । আপনি যদি কোনও শাখায় ভুল স্ট্যাশ প্রয়োগ করেন বা আপনি সমাধান করতে চান না এমন মার্জ সংঘাতগুলি হিট করেন, তবে আপনার শাখাটির সর্বশেষ প্রতিশ্রুতিতে সম্পূর্ণভাবে আপনার কার্য সেটটিকে ফিরিয়ে দিয়ে এটিকে পূর্বাবস্থায় ফেলার দ্রুত এবং সহজ উপায়।
শাদোনিনজা

2

@ গ্রেগ বেকন উত্তর ছাড়াও, ক্ষেত্রে বাইনারি ফাইলগুলি সূচকে যুক্ত করা হয়েছিল এবং এটি স্ট্যাশ ব্যবহারের অংশ ছিল

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

0

এটি উপরের উত্তরগুলির সাথে যুক্ত তবে বার্তাটির উপর ভিত্তি করে গিট স্ট্যাশের অনুসন্ধান যুক্ত করে কারণ নতুন স্ট্যাশগুলি সংরক্ষণ করা হলে স্ট্যাশ সংখ্যাটি পরিবর্তন করতে পারে। আমি কয়েকটি বাশ ফাংশন লিখেছি:

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 "my stash"
  3. নামের স্ট্যাশ অপসারণ করতে $ remove "my stash"

0

যদি আপনি দুর্ঘটনাক্রমে স্ট্যাশিং টেপ করেন তবে আনস্ট্যাশ করার জন্য আমি ভাগ করে নেওয়া চিত্রটি অনুসরণ করতে পারি।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.