कैसे एक छिपाने की जगह लागू करने के लिए रिवर्स?


233

मेरे पास एक छोटा सा पैच है जो मेरे गिट्टी की ठोकर से बचा है। मैंने इसे अपनी वर्किंग कॉपी का उपयोग करके लागू किया है git stash apply। अब, मैं पैच को लागू करके उन परिवर्तनों को वापस करना चाहता हूं (इस तरह का क्या git revertकरना है, लेकिन स्टैश के खिलाफ)।

क्या किसी को भी यह करना आता है?

स्पष्टीकरण: मेरी कार्य प्रतिलिपि में अन्य परिवर्तन हैं। मेरा विशेष मामला वर्णन करना कठिन है, लेकिन आप कुछ डिबगिंग या प्रयोगात्मक कोड की कल्पना कर सकते हैं जो कि स्टैश में है। अब यह कुछ अन्य परिवर्तनों के साथ मेरी कार्य प्रतिलिपि में मिलाया गया है और मैं इसके प्रभावों को स्टेश से और उसके बिना देखना चाहता हूँ।

ऐसा लगता नहीं है कि स्टैश वर्तमान में इसका समर्थन करता है, लेकिन यह git stash apply --reverseएक अच्छी सुविधा होगी।


1
क्या केवल वर्तमान और पिछले संशोधन के बीच अंतर करके केवल एक उलटा पैच नहीं बनाया जा सकता है? और फिर उस एक को लागू करें?
राल्फथेंनिजा

क्या लगाए गए डंक के अलावा काम करने वाले पेड़ में भी बदलाव होते हैं?
ग्रेग बेकन

इसे यहाँ जोड़ना, ... एक सवाल नहीं होना चाहिए था ... stackoverflow.com/questions/59973103/…
डॉन थॉमस बॉयल

जवाबों:


188

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

मैं यह वास्तव में हाल ही में काम कर रहा है ...


2
बहुत अच्छे धन्यवाद। लगता है कि इस तरह के लिए एक अच्छी सुविधा हो सकती है।
पाट नॉट

5
हां, git apply -Rएक सुधार है, कम से कम मेरे लिए मेरे विंडोज बॉक्स पर गिट बैश के साथ, क्योंकि patch --reverseफ़ाइल को पैच करने का पता लगाने के लिए समस्याएं थीं (कोई वास्तविक सुराग क्यों वैकल्पिक काम किया)। +1 और अच्छी व्याख्या
hakre

--indexइस तरह से जोड़ना बेहतर नहीं होगा git stash show -p | git apply --reverse --index। क्योंकि आपको इंडेक्स में उन परिवर्तनों को जोड़ने की आवश्यकता नहीं है जो वापस लौट आए हैं।
theUn77777

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
टिम बोलैंड

83

git stash[save]आपकी कार्यशील निर्देशिका स्थिति, और आपकी अनुक्रमणिका स्थिति लेता है, और उन्हें दूर करता है, जिससे अनुक्रमणिका और कार्य क्षेत्र को HEADसंस्करण में स्थापित किया जाता है।

git stash applyउन परिवर्तनों को वापस लाता है, इसलिए git reset --hardउन्हें फिर से हटा देगा।

git stash popउन परिवर्तनों को वापस लाता है और शीर्ष क्रम में किए गए परिवर्तन को निकालता है, इसलिए git stash [save]इस मामले में पूर्व (पूर्व-पॉप) स्थिति में वापस आ जाएगा।


82
git checkout -f

किसी भी गैर-प्रतिबद्ध परिवर्तन को हटा देगा।


4
धन्यवाद, आप मंचन से मेरी मदद करते हैं जो अनपेक्षित नहीं था।
फाफपुरी

1
यह बहुत सरल था
मार्क ए

यह कमाल था!
किरण

22

V1 git मैन पेज में एक स्टैश को अन-अप्लाई करने के बारे में एक संदर्भ था। अंश नीचे है।

नए V2 git मैन पेज में किसी भी प्रकार के स्टेश को अन-अप्लाई करने के लिए कोई संदर्भ शामिल नहीं है लेकिन नीचे अभी भी अच्छी तरह से काम करता है

स्टाॅस को अन- अप्लाई करना कुछ उपयोग की स्थिति में आप स्टैक्ड परिवर्तन लागू करना चाह सकते हैं, कुछ कार्य कर सकते हैं, लेकिन फिर उन परिवर्तनों को अन-लागू कर सकते हैं जो मूल रूप से स्टैश से आए थे। Git इस तरह के स्टेश को अन-एप्लाइड कमांड प्रदान नहीं करता है, लेकिन बस स्टैश से जुड़े पैच को पुनः प्राप्त करके और रिवर्स में इसे लागू करके प्रभाव को प्राप्त करना संभव है:

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

फिर, यदि आप कोई स्टैश निर्दिष्ट नहीं करते हैं, तो Git सबसे हाल के स्टैश को मानता है:

$ 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.1.146, 2019-04-15- इस पुस्तक के V2- गिट टूल्स - स्ट्रैशिंग और क्लीनिंग शामिल हैं । हो सकता है क्योंकि लेखकों को लगता है कि ऐसा करने का एक बेहतर तरीका है जो मुझे नहीं मिल सकता है।
नाद अलाबा

@NadAlaba सिर के लिए धन्यवाद, ने v1 और v2 के बीच के अंतर पर ध्यान देने के लिए उत्तर को अद्यतन किया है ... अजीब गिट लेखकों ने धारा को हटाने के बारे में अनुभाग को हटा दिया
चोको स्मिथ

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

कैसे एक छिपाने की जगह लागू करने के लिए रिवर्स?

दूसरों ने जो उल्लेख किया है, उसके अलावा सबसे आसान तरीका पहले है

git reset HEAD

और फिर सभी स्थानीय परिवर्तनों की जांच करें

git checkout . 

यह अब तक का सबसे आसान तरीका है जब तक आपके पास कोई स्थानीय काम नहीं है जिसे आप बचाना चाहते हैं। यदि आपने किसी शाखा में गलत स्लैश लागू किया है या मर्ज संघर्षों को हल किया है जिसे आप हल नहीं करना चाहते हैं, तो यह पूरी तरह से आपके शाखा के नवीनतम कमिट में सेट किए गए काम को पूरी तरह से रद्द करके इसे पूर्ववत करने का आसान और आसान तरीका है।
शादिनिजा

2

@Greg बेकन जवाब के अलावा, मामले में बाइनरी फ़ाइलों को सूचकांक में जोड़ा गया था और उपयोग करने वाले स्टैश का हिस्सा था

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

यदि आप गलती से टैप किए गए स्टैपिंग को अनस्टैश करने के लिए साझा की गई छवि का अनुसरण कर सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.