de-vraag
  • Otázky
  • Značky
  • Používatelia
Oznámenia
Odmeny
Registrácia
Po registrácii budete informovaní o odpovediach a komentároch na vaše otázky.
Prihlásiť sa
Ak už máte konto, prihláste sa a skontrolujte nové oznámenia.
Za pridané otázky, odpovede a komentáre budú udelené odmeny.
Viac na
Zdroj
Upraviť
Greg Hewgill
Greg Hewgill
Question

Ako obnoviť stratenú zásobu v systéme Git?

Na ukladanie a obnovovanie zmien v pracovnom strome často používam git stash a git stash pop. Včera som mal v pracovnom strome niekoľko zmien, ktoré som uložil a popp, a potom som urobil ďalšie zmeny v pracovnom strome. Chcel by som sa vrátiť a skontrolovať včerajšie uložené zmeny, ale zdá sa, že git stash pop odstráni všetky odkazy na súvisiace revízie.

Viem, že ak použijem git stash, potom .git/refs/stash obsahuje odkaz na revíziu použitú na vytvorenie stash. A .git/logs/refs/stash obsahuje celý stash. Ale tieto odkazy zmiznú po git stash pop. Viem, že revízia je stále niekde v mojom úložisku, ale neviem, čo to bolo.

Existuje nejaký jednoduchý spôsob, ako obnoviť včerajší odkaz na revíziu stash'u?

Upozorňujem, že dnes to pre mňa nie je'kritické, pretože mám denné zálohy a môžem sa vrátiť do včerajšieho pracovného stromu, aby som získal svoje zmeny. Pýtam sa, pretože musí existovať jednoduchší spôsob!

1602 2008-09-18T01:59:06+00:00 3
 Randall
Randall
Edited question 1 júl 2016 в 6:30
Programovanie
recovery
git
git-stash
Popular videos
Find and restore a deleted file in a Git repository
Find and restore a deleted file in a Git repository
pred 3 rokmi
How to get your Minecraft items back after you die without knowing coordinates
How to get your Minecraft items back after you die without knowing coordinates
pred 2 rokmi
Gumball | Darwin's Potato Diet | The Potato | Cartoon Network
Gumball | Darwin's Potato Diet | The Potato | Cartoon Network
pred 3 rokmi
« Predchádzajúci
Ďalšie »
This question has 1 odpoveď in English, to read them log in to your account.
Solution / Answer
Aristotle Pagaltzis
Aristotle Pagaltzis
18 september 2008 в 11:38
2008-09-18T11:38:25+00:00
Viac na
Zdroj
Upraviť
#8475725

Keď poznáte hash revízie skrýše, ktorá vám vypadla, môžete ju použiť ako skrýšu:

git stash apply $stash_hash

Alebo pre ňu môžete vytvoriť samostatnú vetvu pomocou

git branch recovered $stash_hash

Potom môžete robiť, čo chcete, pomocou všetkých bežných nástrojov. Keď skončíte, vetvu jednoducho odstráňte.

Nájdenie hash

Ak ste ho práve vypustili a terminál je stále otvorený, budete mať na obrazovke stále hodnotu hash vypísanú pomocou git stash pop (vďaka, Dolda).

V opačnom prípade ju môžete nájsť pomocou tejto funkcie pre Linux, Unix alebo Git Bash pre Windows:

git fsck --no-reflog | awk '/dangling commit/ {print $3}'

...alebo pomocou Powershell pre Windows:

git fsck --no-reflog | select-string 'dangling commit' | foreach { $bits = $_ -split ' '; echo $bits[2];}

Zobrazia sa vám všetky revízie na koncoch grafu revízií, na ktoré sa už neodkazuje zo žiadnej vetvy alebo značky - každá stratená revízia, vrátane každej revízie zásobníka, ktorú ste kedy vytvorili, bude niekde v tomto grafe.

Najjednoduchší spôsob, ako nájsť požadovanú revíziu stash, je pravdepodobne odovzdať tento zoznam príkazu gitk:

gitk --all $( git fsck --no-reflog | awk '/dangling commit/ {print $3}' )

...alebo si pozrite odpoveď od emragins, ak používate Powershell pre Windows.

Tým sa spustí prehliadač úložiska, ktorý vám zobrazí každú jednu revíziu v úložisku vôbec bez ohľadu na to, či je dosiahnuteľná alebo nie.

Môžete tam nahradiť gitk niečím ako git log --graph --oneline --decorate, ak dávate prednosť peknému grafu na konzole pred samostatnou aplikáciou GUI.

Ak chcete odhaliť revízie skrýše, hľadajte správy o revízii v tomto tvare:

        WIP on somebranch: commithash Some old commit message

Poznámka: Správa o revízii bude v tomto tvare (začínajúcom "WIP on") len vtedy, ak ste správu neposkytli pri git stash.

 jpaugh
jpaugh
Edited answer 14 február 2019 в 7:13
2580
0
Greg Hewgill
Greg Hewgill
18 september 2008 в 2:10
2008-09-18T02:10:13+00:00
Viac na
Zdroj
Upraviť
#8475724

Práve som skonštruoval príkaz, ktorý mi pomohol nájsť stratenú skrinku commit:

for ref in `find .git/objects | sed -e 's#.git/objects/##' | grep / | tr -d /`; do if [ `git cat-file -t $ref` = "commit" ]; then git show --summary $ref; fi; done | less

Tento príkaz vypíše všetky objekty v strome .git/objects, nájde tie, ktoré sú typu commit, a potom zobrazí prehľad každého z nich. Od tohto bodu bolo už len otázkou prechádzania revízií, aby som našiel vhodný "WIP on work: ("work" je moja vetva, 619bb2 je nedávna revízia).

Poznamenávam, že keby som použil "git stash apply" namiesto "git stash pop", nemal by som tento problém, a keby som použil "git stash save message", potom by sa revízia možno našla ľahšie.

Aktualizácia: S Nathanovým'nápadom sa to skráti:

for ref in `git fsck --unreachable | grep commit | cut -d' ' -f3`; do git show --summary $ref; done | less
72
0
Nathan Jones
Nathan Jones
18 september 2008 в 2:08
2008-09-18T02:08:15+00:00
Viac na
Zdroj
Upraviť
#8475723

git fsck --unreachable | grep commit by mal zobraziť sha1, hoci zoznam, ktorý vráti, môže byť dosť veľký. git show <sha1> ukáže, či ide o požadovanú revíziu.

git cherry-pick -m 1 <sha1> zlúči revíziu do aktuálnej vetvy.

Nathan Jones
Nathan Jones
Edited answer 18 september 2008 в 2:14
38
0
Pridať otázku
Kategórie
Všetky
Technológia
Kultúra / Rekreácia
Život / Umenie
Veda
Profesionálne
Obchod
Používatelia
Všetky
New
Popular
1
Zuxriddin Muydinov
Registered pred 12 hodinami
2
Денис Анненский
Registered pred 2 dňami
3
365
Registered pred týždňom
4
True Image
Registered pred týždňom
5
archana agarwal
Registered pred týždňom
DE
ES
FI
FR
ID
JA
KO
LT
NL
PT
RO
RU
SK
ZH
© de-vraag 2022
Zdroj
stackoverflow.com
na základe licencie cc by-sa 3.0 s uvedením autora