Zımba nasıl ters uygulanır?


233

Git saklamamda küçük bir yama var. Bunu kullanarak çalışma kopyama uyguladım git stash apply. Şimdi, düzeltme ekini tersine uygulayarak bu değişiklikleri geri almak istiyorum (ne gibi git revertama zula karşı).

Bunu nasıl yapacağını bilen var mı?

Açıklama: Çalışma kopyamda başka değişiklikler var. Benim özel durumumu açıklamak zor, ancak saklanan bazı hata ayıklama veya deneysel kod hayal edebilirsiniz. Şimdi çalışma kopyamda diğer bazı değişikliklerle karıştı ve efekti değişikliklerle ve saklamasız değişikliklerle görmek istiyorum.

Şu anda stash bunu desteklemiyor gibi görünüyor, ancak git stash apply --reversegüzel bir özellik olurdu.


1
Sadece mevcut ve önceki revizyon arasında ayrım yaparak tersine çevrilmiş bir yama oluşturamaz mısınız? Sonra uygula?
ralphtheninja

Çalışma ağacında uygulanan saklamaktan başka değişiklikler var mı?
Greg Bacon

Bunu buraya ekleyerek, ... bir soru değil, bir SSS olması gerekiyordu ... stackoverflow.com/questions/59973103/…
Don Thomas Boyle

Yanıtlar:


188

Göre git-zula man sayfasına , "Bir kimin ağaç çalışma dizini durumunu kaydeder taahhüt edilen bir zulası temsil edilir ve ilk ebeveyn de taahhüt olduğunu HEAD, zulası oluşturulduğu zaman" ve git stash show -pbizi "kaydedilen değişiklikleri verir stash, stashed durumu ile orijinal ebeveyni arasında fark olarak bulunur.

Diğer değişikliklerinizi git stash show -p | patch --reverseolduğu gibi bırakmak için aşağıdakileri kullanın :

$ 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

Düzenle:

Bunun için hafif bir gelişme git applyyama yerine kullanmaktır :

git stash show -p | git apply --reverse

Alternatif git apply -Rolarak, kısayol olarak da kullanabilirsiniz git apply --reverse.

Son zamanlarda bunu gerçekten çok kullanışlı buluyorum ...


2
Harika, teşekkürler. Görünüşe göre bu saklamak için güzel bir özellik olabilir.
Pat Notz

5
Evet, git apply -Rbir düzeltme, en azından benim için git bash ile benim windows kutusu patch --reverseyama dosyasını bulmak için sorun vardı (alternatif neden gerçek ipucu yok). +1 ve iyi açıklama
hakre

--indexböyle eklemek daha iyi olmaz mıydı git stash show -p | git apply --reverse --index. Artık dizine geri döndürülen değişiklikleri eklemeniz gerekmediğinden.
bilinmeyen777

3
@Greg Bacon, hey, sen özetlenen o senaryo geçmesi denedim ama bitince yama başarısız git stash show -p | git apply -R -vmesajı ile: Checking patch messages... error: while searching for: Hello, world Hello again error: patch failed: messages:1. Neyin yanlış olabileceğini biliyor musun?
Max Koretskyi

5
Ben olsun hata: yama başarısız oldu: /src/filename.java:46 hatası: src / filename.java yama geçerli değildir
Tim Boland

83

git stash[save] çalışma dizini durumunuzu ve dizin durumunuzu alır ve bunları saklar, dizini ve çalışma alanını HEAD sürüme .

git stash apply bu değişiklikleri geri getiriyor, yani git reset --hard tekrar kaldırırlar.

git stash popbu değişiklikleri geri getirir ve en üstte saklanan değişikliği kaldırır, bu nedenle git stash [save]bu durumda önceki (pop-pre) duruma dönecektir.


82
git checkout -f

taahhüt edilmeyen değişiklikleri kaldıracaktır.


4
teşekkürler, bana uygulanmayan aşamalı değişimden yardım ediyorsun.
Fa.Shapouri

1
Bu çok daha basitti
Mark A

Bu harikaydı!
Kiran Sk

22

V1 git man sayfasının bir zuvanın kaldırılmasıyla ilgili bir referansı vardı. Alıntı aşağıdadır.

Daha yeni V2 git man sayfası , bir zuvanın kaldırılmasıyla ilgili herhangi bir referans içermiyor, ancak aşağıda hala iyi çalışıyor

Zımba Uygulamasını Kaldırma Bazı kullanım senaryolarında, saklanan değişiklikleri uygulamak, biraz çalışma yapmak, ancak başlangıçta saklanandan gelen değişiklikleri kaldırmak isteyebilirsiniz. Git böyle bir saklamak kaldırma uygulaması vermez, ancak bir saklamakla ilişkili yamayı geri alıp tersine uygulayarak efekti elde etmek mümkündür:

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

Yine, bir zulası belirtmezseniz, Git en son zulayı kabul eder:

$ git stash show -p | git apply -R

Git'inize bir takma ad oluşturmak ve etkin bir şekilde uygulamadan kaldırma komutu eklemek isteyebilirsiniz. Örneğin:

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

1
Herhangi bir nedenle "Stash Uygulamasının Kaldırılması" bağladığınız bu yardımcı bölüm , şu kitabın 2. sürümünden kaldırılmıştır - En son sürüm 2.1.146, 2019-04-15 - bu kitabın V2- Git Tools - Stashing and Cleaning . Çünkü yazarlar bunu yapmanın daha iyi bir yolu olduğunu düşünüyor olabilirler.
Nad Alaba

@NadAlaba kafa kafaları için teşekkürler, v1 ve v2 arasındaki farkı not etmek için cevabı güncelledik ... garip git yazarları bir zuvanın kaldırılmasıyla ilgili bölümü kaldırmışlardı
Choco Smith

13

Bu uzun süredir var, ancak sorunu doğru bir şekilde yorumlarsam basit bir çözüm buldum, not, bu benim kendi terminolojimde bir açıklama:

git stash [save] mevcut değişiklikleri kaydeder ve mevcut dalınızı "temiz duruma" ayarlar

git stash list şöyle bir şey verir: stash@{0}: On develop: saved testing-stuff

git apply stash@{0}mevcut dalı önceki gibi ayarlayacaktır stash [save]

git checkout .Gibi güncel şube ayarlayacaktır sonra stash [save]

Stash'a kaydedilen kod kaybolmaz, git apply stash@{0}tekrar bulunabilir .

Her neyse, bu benim için çalıştı!


Emin olmak için bir git stash apply --reverseilk uyguladım ve sonra git stash apply stash@{x}bahsettiğiniz gibi geri döndüm . Sorunsuz çalıştı.
Carlos Garcia

3

Zımba nasıl ters uygulanır?

Diğerlerinin bahsettikleri dışında, en kolay yol ilk önce

git reset HEAD

ve ardından tüm yerel değişiklikleri kontrol edin

git checkout . 

Kesinlikle kaydetmek istediğiniz yerel işiniz olmadığı sürece bu en kolay yoldur . Çözmek istemediğiniz bir şubeye yanlış zulası uyguladıysanız veya birleştirme çakışmalarına çarparsanız, çalışma kümenizi şubenizin en son taahhüdüne tamamen geri döndürerek bu işlemi geri almanın hızlı ve kolay yoludur.
Shadoninja

2

@Greg Bacon cevabına ek olarak, ikili dosyaların dizine eklenmesi ve

git stash show -p | git apply --reverse

Sonuçlanabilir

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

Eklemek --binarysorunu çözüyor ancak maalesef nedenini henüz çözemedik.

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

1

Eğer kazara saklamak u dokunursanız, untash için paylaştığım görüntüyü takip edebilirsiniz.


0

Bu, yukarıdaki cevaplara ek olarak, ancak yeni saklamalar kaydedildiğinde saklanma numarası değişebileceğinden mesaja dayalı git saklaması için arama ekler. Birkaç bash işlevi yazdım:

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. Adıyla saklamak (mesaj) $ git stash save "my stash"
  2. Görünen ad $ apply "my stash"
  3. Adlandırılmış stash'ı kaldırmak için $ remove "my stash"
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.