Am un mic patch-uri salvate în git marfa. Am'am aplicat-o pentru a-mi copia de lucru folosind git marfa aplica. Acum, am'd place să se retragă respectivele modificări prin inversă aplicarea de patch-uri (un fel de ceea ce
git reveni` ar face, dar împotriva marfa).
Stie cineva cum se face acest lucru?
Clarificare: Există alte modificări în copia de lucru. Cazul meu particular este greu de descris, dar vă puteți imagina unele depanare sau experimentale codul care's in stash. Acum's amestecate în copia de lucru cu unele alte modificări și m-am'd place să văd efectul cu și fără modificări de rezerva.
Nu't arata ca marfa susține acest lucru în prezent, dar o git marfa se aplică-marșarier
ar fi o caracteristică frumos.
Potrivit git-stash manpage, "Un stash este reprezentat ca un comite al cărui arbore de înregistrări de stat din directorul de lucru, și primul său părinte este comis la "CAPUL" atunci când marfa a fost creat," și git rezerva show -p
ne oferă "modificările înregistrate în ascunzătoarea ca un dif intre ascuns stat și originalul său părinte.
Pentru a păstra alte modificări intact, folosesc git rezerva show -p | patch-marșarier`, ca în următoarele:
$ 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
Edit:
O ușoară îmbunătățire la acest lucru este de a utiliza `git se aplică în loc de patch-uri:
git stash show -p | git apply --reverse
Alternativ, puteți utiliza, de asemenea, git aplica -R
ca o prescurtare pentru git aplica --inversa
.
Am'am fost într-adevăr această constatare la îndemână în ultima vreme...
git stash
[salvează]
ia de lucru directorul cu firme de stat, iar indicele de stat, și ascunde-le departe, setare index și de zona de lucru pentru " ȘEF " versiune.
git marfa aplica
aduce înapoi acele schimbări, atât git reset greu
ar elimina-le din nou.
git marfa pop aduce înapoi acele schimbări și elimină partea de sus a ascuns schimba, deci
git marfa [salvează]` s-ar reveni la anterior (pre-pop) de stat în acest caz.
Reducere directă n pasta de din git om page L's clar formulate și include chiar și un alias;
Onu de a aplica o rezervă În unele folosesc scenarii s-ar putea să doriți să se aplice ascuns modificări, a face ceva de lucru, dar apoi onu-să aplice aceste modificări, care inițial a venit de la stash. Git nu oferă astfel o rezervă nu se aplică comanda, dar este posibil pentru a obține efectul de preluarea pur și simplu patch-uri asociate cu o rezervă și aplică-l în sens invers:
$ git stash show -p stash@{0} | git apply -R
Din nou, dacă nu specificați un stash, Git își asumă cele mai recente marfa:
$ git stash show -p | git apply -R
Poate doriți să creați un alias și în mod eficient a adăuga un stash-nu se aplică comanda la Git. De exemplu:
$ git config --global alias.stash-unapply '!git stash show -p | git apply -R'
$ git stash apply
$ #... work work work
$ git stash-unapply
Acest lucru este mult peste datorate, dar dacă am interpreta corect am găsit o soluție simplă, rețineți, aceasta este o explicație în propria terminologie:
git marfa [salvează]
va salva departe schimbările actuale și a stabilit actuala sucursală la "curat de stat"
git ascunde lista
dă ceva de genul: stash@{0}: Pe dezvolte: salvat de testare-lucruri
git aplica stash@{0}
va stabili sucursala curent ca înainte marfa [salvează]
git checkout .
Va stabili sucursala curent ca după marfa [salvează]
Codul care este salvat în ascunzătoarea nu este pierdut, acesta poate fi găsit prin git aplica stash@{0}
din nou.
Anywhay, aceasta a lucrat pentru mine!
În plus față de @Greg Bacon răspuns, în cazul în care fișierele binare au fost adăugate la index și au fost o parte din marfa folosind
git stash show -p | git apply --reverse
poate duce la
error: cannot apply binary patch to '<YOUR_NEW_FILE>' without full index line
error: <YOUR_NEW_FILE>: patch does not apply
Adăugarea de --binar
rezolvă problema, dar, din păcate, am't dat seama încă de ce.
git stash show -p --binary | git apply --reverse
Acest lucru este în plus față de cele de mai sus răspunsuri, dar adaugă de căutare pentru git marfa pe baza mesaj ca marfa număr poate schimba atunci când noi ascunzători sunt salvate. Am scris câteva bash funcții:
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
}
$ git marfa salva "rezerva mea"
$ se aplică "rezerva mea"
$ a elimina "rezerva mea"