Git හි පහත වැටුණු තොගයක් නැවත ලබා ගන්නේ කෙසේද?


1754

මම නිතර නිතර භාවිතා git stashසහ git stash popමගේ කම්කරු ගසක් වෙනස්කම් සුරැකීමට සහ නැවත. ඊයේ මගේ වැඩ කරන ගසෙහි යම් යම් වෙනස්කම් මා විසින් තැන්පත් කර ඇති අතර, පසුව මම වැඩ කරන ගසෙහි තවත් වෙනස්කම් සිදු කළෙමි. මම ආපසු ගොස් ඊයේ සිදු කළ වෙනස්කම් සමාලෝචනය කිරීමට කැමතියි, නමුත් git stash popඊට සම්බන්ධ සියලු බැඳීම් ඉවත් කරන බවක් පෙනේ.

මම දන්නවා .Git / refs / stash හි අඩංගු වන්නේ තොගය සෑදීමට භාවිතා git stashකළ කැපවීමයි . හා .git / ලඝු-සටහන් / ආශ්රේයන් / මැට්ටෙක් අඩංගු මුළු මැට්ටෙක්. නමුත් එම යොමු කිරීම් පසු වී ඇත git stash pop. බැඳීම තවමත් මගේ ගබඩාවේ කොතැනක හෝ ඇති බව මම දනිමි, නමුත් එය කුමක්දැයි මම නොදනිමි.

ඊයේ දිනයේ ස්ටෑෂ් කොමිට් යොමු කිරීම නැවත ලබා ගැනීමට පහසු ක්‍රමයක් තිබේද?

මෙය මට අද දින ඉතා වැදගත් නොවන බව සලකන්න, මන්ද මට දිනපතා උපස්ථ ඇති අතර මගේ වෙනස්කම් ලබා ගැනීම සඳහා ඊයේ වැඩ කරන ගස වෙත ආපසු යා හැකිය. මම ඉල්ලන්නේ පහසු ක්‍රමයක් තිබිය යුතු බැවිනි!


75
අනාගතය සඳහා සටහන: ඔබ සෑම අවස්ථාවකදීම ඔබේ තොග නැති කර git stash popගැනීමට අකමැති නම්, git stash applyඒ වෙනුවට ඔබට කළ හැකිය . ව්‍යවහාරික තොගයට යොමු කිරීම ඉවත් නොකරන්නේ නම් හැර, එය එකම දේ කරයි.
කෙවින්

3
මෙහි සෑම දෙයක්ම උත්සාහ කර ඇත, දැනටමත් පුරවා ඇති තොගයක් සොයාගත නොහැකි විය. IntelliJ හි jetbrains.com/help/idea/local-history.html
ජුවාන් මෙන්ඩිස්


මට මේ ගැටලුව තිබුණා. මගේ ණයකට යාවත්කාලීන කිරීමට, මම දිව git stash, git pull -r upstream, git push -f origin, git stash pop, හා පොප් පවසයි "මාරාන්තික: ලඝු-සටහන ආශ්රේයන් සඳහා / එජා සේවකයින්ගේ හිස්". Answers මම මෙම පිළිතුරු පොකුරක් උත්සාහ කළෙමි, කිසිවක් සාර්ථක වූයේ නැත. මම .git / refs / stash දෙස බලන විට , SHA එහි සිටියේය. නොබැඳි සමමුහුර්තකරණය සඳහා වින්ඩෝස් ජාල ධාවකය සලකුණු කිරීමේ ගැටලුවක් විය හැකිද? 🤷‍♂️
බ්‍රියානරි

Answers:


2810

ඔබ අතහැර දැමූ තොගයේ හැෂ් ඔබ දැනගත් පසු, ඔබට එය තොගයක් ලෙස යෙදිය හැකිය:

git stash apply $stash_hash

නැතහොත්, ඔබට ඒ සඳහා වෙනම ශාඛාවක් සෑදිය හැකිය

git branch recovered $stash_hash

ඊට පසු, ඔබට සියලු සාමාන්ය මෙවලම් සමඟ ඔබට අවශ්ය ඕනෑම දෙයක් කළ හැකිය. ඔබ අවසන් වූ පසු, ශාඛාව ඉවතට විසි කරන්න.

හැෂ් සොයා ගැනීම

ඔබ එය නිකම්ම කර ඇති අතර ටර්මිනලය තවමත් විවෘතව තිබේ නම්, ඔබට තවමත් git stash popතිරයේ මුද්‍රණය කර ඇති හැෂ් අගය ඇත (ස්තූතියි, ඩොල්ඩා).

එසේ නොමැතිනම්, වින්ඩෝස් සඳහා ලිනක්ස්, යුනික්ස් හෝ ගිට් බෑෂ් සඳහා මෙය භාවිතා කර ඔබට එය සොයාගත හැකිය:

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

... හෝ වින්ඩෝස් සඳහා පවර්ෂෙල් භාවිතා කිරීම:

git fsck --no-reflog | select-string 'dangling commit' | foreach { $_.split(' ')[2] }

කිසිදු ශාඛාවකින් හෝ ටැගයකින් තවදුරටත් යොමු නොකෙරෙන ඔබගේ බැඳීම් ප්‍රස්ථාරයේ ඉඟි වලින් මෙය ඔබට පෙන්වනු ඇත - ඔබ විසින් නිර්මාණය කරන ලද සෑම තොගයක්ම ඇතුළුව නැතිවූ සෑම කැපවීමක්ම එම ප්‍රස්ථාරයේ කොතැනක හෝ පවතිනු ඇත.

ඔබට අවශ්‍ය මුදල් තොගය සොයා ගැනීමට ඇති පහසුම ක්‍රමය නම්, එම ලැයිස්තුව මෙයට යොමු කිරීමයි gitk:

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

... හෝ වින්ඩෝස් සඳහා පවර්ෂෙල් භාවිතා කරන්නේ නම් ඉමරජින් වලින් ලැබෙන පිළිතුර බලන්න .

මෙමඟින් නිධිය වෙත ළඟා විය හැකි ද නැද්ද යන්න නොසලකා ගබඩාවේ සෑම කැපවීමක්ම පෙන්වන නිධිය බ්‍රව්සරයක් ඔබට දියත් කරනු ඇත .

ඔබ විස්ථාපනය කල හැකි gitkවගේ දෙයක් සමග එහි git log --graph --oneline --decorateඔබ වෙනම චිත්රක යෙදුම පුරා පුවරුවේ ලස්සන ප්රස්තාරය කැමති නම්.

ස්ටෑෂ් කොමිස් හඳුනා ගැනීමට, මෙම පෝරමයේ බැඳීම් පණිවිඩ සොයන්න:

සමහර ශාඛා         පිළිබඳ WIP : commithash සමහර පැරණි බැඳීම් පණිවිඩ

සටහන : බැඳීම් පණිවිඩය පවතින්නේ ඔබ මෙම පණිවිඩයක් ලබා නොදුන්නේ නම් පමණි ("WIP on" සිට) git stash.


52
ජේඩෙල් මගේ කටින් වචන ගත්තා. මෙම ලිපිය මගේ රැකියාව සුරකින ලදි :) මම එක් කිරීමට කැමතියි - ඔබට අහිමි වූ ඕනෑම දෙයක් මත ඔබ වැඩ කළ දිනය මතක තබා ගැනීමෙන් ඔබ සොයන දේ සඳහා gitk ගවේෂණය කිරීම පහසු කරයි.
ශ්‍රීධර් සර්නොබත්

4
Ode කෝඩි: පවර්ෂෙල් නිසා. MsysGit AWK ද්විමයක් නැව්ගත කරන්නේ දැයි මම නොදනිමි. ගූග්ලිං මට පවසන්නේ පවර්ෂෙල් හි ඇති විධානයට %{ $_.Split(' ')[2]; }සමාන දෙයක් කළ යුතු {print $3}බවයි awk, නමුත් එය පරීක්ෂා කිරීමට මට වින්ඩෝස් පද්ධතියක් නොමැති අතර ඔබට තවමත් එම /dangling commit/කොටස සඳහා සමාන ප්‍රමාණයක් අවශ්‍ය වේ . කෙසේ වෙතත්, ධාවනය git fsck --no-reflogකර ප්‍රතිදානය දෙස බලන්න. ඔබට අවශ්‍ය වන්නේ “කරකැවෙන <commitID>” රේඛාවලින්.
ඇරිස්ටෝටල් පැගල්ට්සිස්

7
කැපවීමේ පණිවුඩයට "WIP" නූලක් ඇති බව සඳහන් කිරීම වටී, ඔබ ගබඩා කිරීමේදී ඔබේම පණිවිඩයක් ලබා නොදුන්නේ නම් (එනම් එසේ කිරීමෙන් git stash save "<message>").
සමීර් අගුවර්

12
පහත වැටීම සිදු වූයේ කවදාදැයි ඔබ දන්නේ නම්, කාලය වැඩි කිරීමෙන් ඔබට කරදරකාරී කොමිස් ලැයිස්තුව ලබා ගැනීමට මෙම එක්-ලයිනර් භාවිතා කළ හැකිය: git fsck --no-reflog | awk '/dangling commit/ {print $3}' | xargs -L 1 git --no-pager show -s --format="%ci %H" | sortඅවසාන ප්‍රවේශය බොහෝ විට ඔබට අවශ්‍ය එකකි stash apply.
ris8_allo_zen0

3
git stash apply {ref}පහත වැටුණු තොගයක් ප්‍රතිෂ් ored ාපනය කරන ලදි! gitඑය නීති විරෝධී විය යුතුය.
ටොම් රසල්

709

ඔබ ටර්මිනලය වසා නොතිබුනේ නම්, ප්‍රතිදානය දෙස බලන්න, git stash popඑවිට ඔබට අතහැර දැමූ තොගයේ වස්තු හැඳුනුම්පත ලැබේ. එය සාමාන්‍යයෙන් මේ වගේ ය:

$ git stash pop
[...]
Dropped refs/stash@{0} (2ca03e22256be97f9e40f08e6d6773c7d41dbfd1)

( git stash dropඑකම රේඛාවක් නිපදවන බව සලකන්න .)

එම තොගය නැවත ලබා ගැනීම සඳහා, දුවන්න git branch tmp 2cae03e, එවිට ඔබට එය ශාඛාවක් ලෙස ලැබෙනු ඇත. මෙය තොගයක් බවට පරිවර්තනය කිරීම සඳහා, ධාවනය කරන්න:

git stash apply tmp
git stash

එය ශාඛාවක් ලෙස තබා ගැනීමෙන් ඔබට එය නිදහසේ හැසිරවීමට ඉඩ සලසයි; උදාහරණයක් ලෙස, එය චෙරි-තෝරා හෝ ඒකාබද්ධ කිරීමට.


54
ඔබ ද කළ හැකි git stash apply commitidනම් git stash, නව මැට්ටෙක් ලබා ගැනීමට.
මැතිව් ෆ්ලැෂෙන්

33
Git ස්වයංක්‍රීයව ගබඩාව ඒකාබද්ධ කර ගැටුම් ඇත්නම්, එය ඔබට හැෂ් නොපෙන්වන බව සලකන්න.
ජේම්ස්

32
@ ජේම්ස්: ඉන්පසු නැවතත්, එම ගැටුම් ධාවනය වීමේ ප්‍රති result ලයක් නම්, එය තොගය පහත වැටෙන්නේ git stash popනැත, එබැවින් එය සාමාන්‍යයෙන් ගැටළුවක් නොවේ.
ඩොල්ඩා 2000

2
මගේ git stash pop නිමැවුමේ SHA එකක් නොතිබුණි. :(
ගිණුම ඉවතට විසි කරන්න

2
Oney හනී: ඒක තමයි කාරණය git stash pop. ඔබට එය අතහැර දැමීමෙන් තොරව තොගය යෙදීමට අවශ්‍ය නම්, git stash applyඒ වෙනුවට භාවිතා කරන්න. මීට අමතරව, ඔබට ශාඛා කිහිපයකට වෙනසක් යෙදීමට අවශ්‍ය නම්, ඒ වෙනුවට ඔබට චෙරි-තේරීම කළ හැකිය.
ඩොල්ඩා 2000

271

පිළිගත් විසඳුමට මෙම එකතු කිරීම සඳහන් කිරීමට අවශ්‍ය විය. මම මෙම ක්‍රමය අත්හදා බැලූ පළමු වතාවට එය ක්ෂණිකව පැහැදිලි නොවීය (සමහර විට එය එසේ විය යුතුය), නමුත් හැෂ් අගයෙන් තොගය යෙදීම සඳහා, “git stash apply” භාවිතා කරන්න:

$ git stash apply ad38abbf76e26c803b27a6079348192d32f52219

මම git සඳහා අළුත් වූ විට, මෙය මට පැහැදිලි නැති අතර, මම "git show", "git apply", "patch" යනාදී විවිධ සංයෝජන උත්සාහ කළෙමි.


3
මෙය වර්තමාන වැඩ කරන ගස සඳහා තොගය අදාළ වන බව සලකන්න. ගස අපිරිසිදු නම්, ඔබට තාවකාලික ශාඛාවක් භාවිතා කිරීමට හෝ පළමුව තොගයක් භාවිතා කිරීමට අවශ්‍ය විය හැකිය, SHA-1 වෙතින් තොගය යොදන්න, නැවත නැවත ගබඩා කරන්න, ඉන්පසු දෙවැන්න සිට අන්තිම තොගය දක්වා (stash @ {1 called ලෙස හැඳින්වේ).
musiKk

116

ඔබේ ගබඩාවේ තවමත් ඇති නමුත් තවදුරටත් ළඟා විය නොහැකි තොග ලැයිස්තුව ලබා ගැනීම සඳහා:

git fsck --unreachable | grep commit | cut -d" " -f3 | xargs git log --merges --no-walk --grep=WIP

ඔබ ඔබේ තොගයට මාතෘකාවක් ලබා දුන්නේ නම් -grep=WIP, විධානය අවසානයේ "WIP" වෙනුවට ඔබේ පණිවිඩයේ කොටසක් ආදේශ කරන්න, උදා -grep=Tesselation.

"WIP" සඳහා විධානය අතුගා දමනුයේ, තොගයක් සඳහා පෙරනිමි බැඳීමේ පණිවිඩය ස්වරූපයෙන් ඇති බැවිනි WIP on mybranch: [previous-commit-hash] Message of the previous commit.


1
echo 'git fsck - unreachable | grep commit | cut -d "" -f3 | xargs git log --merges --no-walk --grep = WIP '> / usr / local / bin / git-stashlog; chmod a + rx / usr / local / bin / git-stashlog # git stashlog
එරික් මාටිනෝ

නැතහොත් ඔබට මෙය ඔබගේ .gitconfig වෙත අන්වර්ථයක් ලෙස එකතු කළ හැකිය (a සමඟ විධානයට පෙර !).
asmeurer

මගේ බේකන් සුරකින ලදි - ඇත්ත වශයෙන්ම නොවේ, නමුත් දින වැඩ නැවත කේතනය කිරීම මට ඉතිරි විය - අගය කරන ලදි - මම මෑතකදී අතහැර දැමූ නිසා, මම ඔබේ විධානයේ ප්‍රතිදානයෙන් ඉහළම SHA එක තෝරා ගත්තෙමි - එවිට .... git stash apply SHA ... වෙනත් පිළිතුරු වල සඳහන් පරිදි - බොහෝ thx
danday74

75

මම දැන් විධානයක් ගොඩනඟා, මගේ නැතිවූ මුදල් සොයා ගැනීමට මට උදව් විය:

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

මෙය .git / object ගසෙහි ඇති සියලුම වස්තු ලැයිස්තුගත කරයි, කැපවූ ආකාරයේ ඒවා සොයාගෙන, පසුව එක් එක් සාරාංශය පෙන්වයි. මෙතැන් සිට සුදුසු "වැඩ පිළිබඳ WIP: 6a9bb2" ("වැඩ" යනු මගේ ශාඛාවයි, 619bb2 මෑත කාලීන කැපවීමකි) සොයා ගැනීම සඳහා වූ කොමිස් හරහා සොයා බැලීම පමණි.

මම "git stash pop" වෙනුවට "git stash apply" භාවිතා කරන්නේ නම් මට මෙම ගැටළුව ඇති නොවන අතර මම "git stash save message " භාවිතා කරන්නේ නම් එම බැඳීම සොයා ගැනීම පහසු වනු ඇත.

යාවත්කාලීන කිරීම: නේතන්ගේ අදහස සමඟ මෙය කෙටි වේ:

for ref in `git fsck --unreachable | grep commit | cut -d' ' -f3`; do git show --summary $ref; done | less

41

git fsck --unreachable | grep commitඑය නැවත ලබා දෙන ලැයිස්තුව තරමක් විශාල විය හැකි වුවත්, sha1 පෙන්විය යුතුය. git show <sha1>එය ඔබට අවශ්‍ය කැපවීම දැයි පෙන්වයි.

git cherry-pick -m 1 <sha1> බැඳීම වත්මන් ශාඛාවට ඒකාබද්ධ කරයි.


38

Gitk භාවිතා කරමින් වින්ඩෝස් පවර්ෂෙල් සමාන:

gitk --all $(git fsck --no-reflog | Select-String "(dangling commit )(.*)" | %{ $_.Line.Split(' ')[2] })

එක් පයිප්පයකින් මෙය කිරීමට වඩාත් කාර්යක්ෂම ක්‍රමයක් තිබිය හැකි නමුත් මෙය කාර්යය කරයි.


1
ඔබගේ පිළිතුරට මම බෙහෙවින්
කෘත ful වෙමි

32

නැතිවූ තොගයක් නැවත සකස් කිරීමට ඔබට අවශ්‍ය නම්, ඔබ මුලින්ම නැතිවූ තොගයේ හැෂ් සොයා ගත යුතුය.

ඇරිස්ටෝටල් පැගල්ට්සිස් යෝජනා git fsckකළ පරිදි ඔබට උදව් කළ යුතුය.

පෞද්ගලිකව මම මගේ log-allඅන්වර්ථය භාවිතා කරන්නේ තත්වය පිළිබඳ වඩා හොඳ දෘෂ්ටියක් ලබා ගැනීම සඳහා සෑම කැපවීමක්ම (ආපසු අයකර ගත හැකි) පෙන්වයි:

git log --graph --decorate --pretty=oneline --abbrev-commit --all $(git fsck --no-reflogs | grep commit | cut -d' ' -f3)

ඔබ "WIP on" පණිවිඩ පමණක් සොයන්නේ නම් ඔබට ඊටත් වඩා වේගවත් සෙවීමක් කළ හැකිය.

ඔබේ sha1 දැනගත් පසු, පැරණි තොගය එක් කිරීම සඳහා ඔබ ඔබේ stash reflog වෙනස් කරයි:

git update-ref refs/stash ed6721d

ආශ්‍රිත පණිවිඩයක් ලබා ගැනීමට ඔබ බොහෝ විට කැමති වනු ඇත -m

git update-ref -m "$(git log -1 --pretty=format:'%s' ed6721d)" refs/stash ed6721d

ඔබට මෙය අන්වර්ථයක් ලෙස භාවිතා කිරීමට පවා අවශ්‍ය වනු ඇත:

restash = !git update-ref -m $(git log -1 --pretty=format:'%s' $1) refs/stash $1

2
කෙසේ වෙතත් එය -d\\ විය යුතුය -d\ (හෝ වඩාත් පැහැදිලි -d' ')
joeytwiddle

දෝෂයක් ඇතිවිය: "මාරාන්තික: නොපැහැදිලි තර්කය 'ඩන්ග්ලිං': නොදන්නා සංශෝධනයක් හෝ වැඩ කරන ගසෙහි නොමැති මාර්ගය."
ඩැනියෙල් රයන්

ඔබට උප විධානය උපුටා දැක්වීම් සමඟ ඔතා ගත යුතුය git update-ref -m "$(git log -1 --pretty=format:'%s' ed6721d)" refs/stash ed6721
ඇන්ඩ්‍රි ෂොස්ටික්

18

මම ඇරිස්ටෝටල්ගේ ප්‍රවේශයට කැමතියි, නමුත් GITK භාවිතා කිරීමට කැමති නැත ... විධාන රේඛාවෙන් GIT භාවිතා කිරීමට මම පුරුදු වී සිටිමි.

ඒ වෙනුවට, මම මගේ කේත සංස්කාරකයේ සමාලෝචනය සඳහා අන්තරාදායක කොමිස් ගෙන කේතය ඩීඅයිඑෆ්එෆ් ගොනුවකට ප්‍රතිදානය කළෙමි.

git show $( git fsck --no-reflog | awk '/dangling commit/ {print $3}' ) > ~/stash_recovery.diff

දැන් ඔබට එහි ප්‍රති ing ලයක් ලෙස ඇති dif / txt ගොනුව (එය ඔබගේ නිවසේ ෆෝල්ඩරයේ) ඔබේ txt සංස්කාරකයට පටවා සත්‍ය කේතය සහ එහි ප්‍රති SH ලයක් ලෙස SHA බලන්න.

ඉන්පසු භාවිතා කරන්න

git stash apply ad38abbf76e26c803b27a6079348192d32f52219

17

මෙම විධානය පර්යන්තයෙන් ලිවීමෙන් ඔබට ළඟා විය නොහැකි සියලු ක්‍රියාකාරකම් ලැයිස්තුගත කළ හැකිය -

git fsck --unreachable

ළඟා විය නොහැකි බැඳීම් හැෂ් පරීක්ෂා කරන්න -

git show hash

ඔබ ගබඩා කළ අයිතමය සොයා ගන්නේ නම් අවසාන වශයෙන් අයදුම් කරන්න -

git stash apply hash

15

මිනිසුන් මෙම ප්‍රශ්නය අසන්නේ ඇයි? ඔවුන් තවමත් ප්‍රත්‍යාවර්තකය ගැන නොදන්නා හෝ තේරුම් ගෙන නැති නිසා.

මෙම ප්‍රශ්නයට බොහෝ පිළිතුරු කිසිවෙකුට මතක නැති විකල්පයන් සහිත දිගු විධාන ලබා දෙයි. එබැවින් මිනිසුන් මෙම ප්‍රශ්නයට පැමිණ ඔවුන්ට අවශ්‍ය යැයි සිතන ඕනෑම දෙයක් පිටපත් කර එය වහාම අමතක කරන්න.

මෙම ප්‍රශ්නය ඇති සෑම කෙනෙකුටම මම උපදෙස් දෙන්නේ reflog (git reflog) පරීක්ෂා කර බලන්න, ඊට වඩා වැඩි යමක් නොවේ. සියලු කොමිස් ලැයිස්තුව ඔබ දුටු පසු, ඔබ සොයන කැපවීම සොයා ගැනීමට සහ චෙරි-තෝරා ගැනීමට හෝ එයින් ශාඛාවක් නිර්මාණය කිරීමට ක්‍රම සියයක් ඇත. මෙම ක්‍රියාවලියේදී ඔබ විවිධ මූලික git විධානයන් සඳහා වන reflog සහ ප්‍රයෝජනවත් විකල්ප ගැන ඉගෙන ගනු ඇත.


1
හායි රොබී. මෙය අදාළ වන්නේ ඔබ වැඩ කරමින් සිටියදී, පැති ලුහුබැඳ ගිය විට සහ සති කිහිපයකට පෙර ඔබ අත්හැර දැමූ ස්ථානයට නැවත පැමිණීමට අවශ්‍ය නම්, ඔබේ තැන්පත් කර ඇති වැඩ සොයාගත නොහැකි බව දැන ගැනීමට පමණි - එය වෙනත් දේවල් වල කොතැනක හෝ නැතිවී ගොස් ඇත. කරමින් සිටියා. එය මෑත ඉතිහාසය නම් reflog විශිෂ්ටයි, නමුත් දිගු කාලීන හිඩැස් සඳහා නොවේ.
emragins

1
හේයි ඉමරජින්ස්, මම එකඟයි, නමුත් මෙය හරියටම OP හි භාවිත අවස්ථාවයි. මෙහි පළ කර ඇති අනෙක් විධානයන් හැසිරෙන්නේ කෙසේදැයි මම නිශ්චිතවම නොදනිමි, නමුත් මගේ අභිප්‍රාය වනුයේ ඔහුගේ ස්ථීර කළ කැපවීම පිරිසිදු වූ පසු ඒවා ද වැඩ කිරීම නවත්වනු ඇති බවයි.
රොබී ඩී

1
හ්ම් ... ඉහත දර්ශනය මා මෙම ප්‍රශ්නයට ගෙන ආවේ, මම දනිමි (නොදැනුවත්ව) මගේ තොගය නැති වූ විට සහ එය නැවත ලබා ගැනීමට මට හැකි වූ විට මාසයකට වඩා සමීප නොවන්නේ නම් එය අවම වශයෙන් සති කිහිපයක් බව මම දනිමි.
emragins

15

Git v2.6.4 සමඟ OSX හි, මම අහම්බෙන් git stash බිංදුව ධාවනය කරමි, පසුව පියවරෙන් පහළින් ඇදගෙන යාමෙන් මම එය සොයා ගතිමි

ඔබ තොගයේ නම දන්නේ නම් භාවිතා කරන්න:

$ git fsck --unreachable | grep commit | cut -c 20- | xargs git show | grep -B 6 -A 2 <name of the stash>

එසේ නොමැතිනම් ඔබ විසින් අතින් ප්‍රති the ලයෙන් හැඳුනුම්පත සොයාගත හැකිය:

$ git fsck --unreachable | grep commit | cut -c 20- | xargs git show

එවිට ඔබ කැපවීමේ හැඳුනුම්පත සොයාගත් විට git stash එක ඔබන්න {commit-id}

මෙය යමෙකුට ඉක්මනින් උපකාරී වේ යැයි සිතමි


12

ඔබට gitk නොමැති විට හෝ ප්‍රතිදානය සඳහා X නොමැති විට, සියලු වෙනස්කම් හරහා යාමට තවත් හොඳ ක්‍රමයක් පිළිගත් විසඳුමට එක් කිරීමට මට අවශ්‍යය.

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

for h in `cat tmp_commits`; do git show $h | less; done

එවිට ඔබට එකින් එක දර්ශනය වන එම හැෂ් සඳහා සියලු වෙනස්කම් ලැබේ. ඊළඟ වෙනස වෙත යාමට 'q' ඔබන්න.


12

සරල විධාන කවුළුවක වින්ඩෝස් මත වැඩ කිරීමට මට කිසිදු පිළිතුරක් ලබා ගත නොහැකි විය (මගේ නඩුවේ වින්ඩෝස් 7). awk, grepසහ Select-stringවිධාන ලෙස හඳුනාගෙන නොමැත. එබැවින් මම වෙනස් ප්‍රවේශයක් උත්සාහ කළෙමි:

  • පළමු ධාවනය: git fsck --unreachable | findstr "commit"
  • ප්‍රතිදානය නොට්පෑඩ් වෙත පිටපත් කරන්න
  • "ළඟා විය නොහැකි බැඳීම" වෙනුවට ආදේශ කරන්න start cmd /k git show

මේ වගේ දෙයක් පෙනෙනු ඇත:

start cmd /k git show 8506d235f935b92df65d58e7d75e9441220537a4 start cmd /k git show 44078733e1b36962571019126243782421fcd8ae start cmd /k git show ec09069ec893db4ec1901f94eefc8dc606b1dbf1 start cmd /k git show d00aab9198e8b81d052d90720165e48b287c302e

  • .bat ගොනුවක් ලෙස සුරකිමින් එය ක්‍රියාත්මක කරන්න
  • ස්ක්‍රිප්ට් මඟින් විධාන කවුළු පොකුරක් විවෘත කරනු ඇත
  • ඔබ සොයන එක ඔබ සොයා ගත්තා නම්, ධාවනය කරන්න: git stash apply (your hash)

හොඳම විසඳුම නොවිය හැකි නමුත් මා වෙනුවෙන් වැඩ කළේය


වින්ඩෝස් වල පවා ඔබට git bash භාවිතා කළ හැකිය. Git bash හි ඔබට අවශ්‍ය සියලුම (unixoid) විධාන රේඛා මෙවලම් තිබේ.
ඒඩ්‍රියන් ඩබ්ලිව්

10

ඇරිස්ටෝටල් විසින් පිළිගත් පිළිතුර, ළඟා විය නොහැකි කොමිස් ද ඇතුළුව, ළඟා විය හැකි සියලු කොමිස් පෙන්වයි. ශබ්දය පෙරීමට:

git fsck --no-reflog | \
awk '/dangling commit/ {print $3}' | \
xargs git log --no-walk --format="%H" \
  --grep="WIP on" --min-parents=3 --max-parents=3

මෙයට ඇතුළත් වනුයේ හරියටම මව් කොමිස් 3 ක් ඇති (තොගයක් ඇති) සහ පණිවුඩයට "ඩබ්ලිව්අයිපී ඔන්" ඇතුළත් වේ.

මතක තබා ගන්න, ඔබ ඔබේ තොගය පණිවිඩයකින් (උදා git stash save "My newly created stash") සුරකින ලද්දේ නම් , මෙය සුපුරුදු "WIP on ..." පණිවිඩය අභිබවා යනු ඇත.

ඔබට එක් එක් බැඳීම පිළිබඳ වැඩි විස්තර පෙන්විය හැකිය, උදා: බැඳීම් පණිවිඩය ප්‍රදර්ශනය කරන්න, නැතහොත් එය වෙත යොමු කරන්න git stash show:

git fsck --no-reflog | \
awk '/dangling commit/ {print $3}' | \
xargs git log --no-walk --format="%H" \
  --grep="WIP on" --min-parents=3 --max-parents=3 | \
xargs -n1 -I '{}' bash -c "\
  git log -1 --format=medium --color=always '{}'; echo; \
  git stash show --color=always '{}'; echo; echo" | \
less -R

6

මගේ ප්‍රියතම දේ මේ ලයිනර් ය:

git log --oneline  $( git fsck --no-reflogs | awk '/dangling commit/ {print $3}' )

මෙය මූලික වශයෙන් මෙම පිළිතුරට සමාන අදහසක් නමුත් වඩා කෙටි ය. ඇත්ත වශයෙන්ම, --graphගසකට සමාන සංදර්ශකයක් ලබා ගැනීම සඳහා ඔබට තවමත් එකතු කළ හැකිය.

ලැයිස්තුවේ ඇති බැඳීම ඔබ සොයාගත් පසු, අයදුම් කරන්න

git stash apply THE_COMMIT_HASH_FOUND

මට නම්, භාවිතා කිරීමෙන් --no-reflogsනැතිවූ තොග ප්‍රවේශය හෙළි විය, නමුත් --unreachable(වෙනත් බොහෝ පිළිතුරු වලින් සොයා ගත් පරිදි) එසේ නොවීය.

ඔබ වින්ඩෝස් යටතේ සිටින විට එය git bash මත ධාවනය කරන්න.

බැර: ඉහත විධානයන් පිළිබඳ විස්තර https://gist.github.com/joseluisq/7f0f1402f05c45bac10814a9e38f81bf වෙතින් ලබාගෙන ඇත.


5

පහත පියවර භාවිතා කිරීමෙන් එය ප්‍රතිසාධනය කරන ලදි:

  1. මකා දැමූ ස්ටෑෂ් හැෂ් කේතය හඳුනා ගන්න:

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

  2. චෙරි පික් ද ස්ටෑෂ්:

    git cherry-pick -m 1 $ stash_hash_code

  3. භාවිතා කරන්නේ නම් ගැටුම් නිරාකරණය කරන්න:

    git mergetool

ඔබ ගෙරිට් භාවිතා කරන්නේ නම් ඊට අමතරව ඔබට පණිවිඩ යැවීමේ ගැටළු ඇති විය හැකිය. ඊළඟ විකල්ප අනුගමනය කිරීමට පෙර කරුණාකර ඔබේ වෙනස්කම් සටහන් කරන්න:

  1. පෙර කැපවීම සඳහා දෘ reset යළි පිහිටුවීම භාවිතා කර මෙම වෙනස නැවත නිර්දේශ කරන්න.
  2. ඔබට වෙනස් කිරීම, නැවත සකස් කිරීම සහ නැවත නිර්දේශ කිරීම ද කළ හැකිය.

iv miva2 ඔබේ සංස්කරණය මෙම ප්‍රශ්නයේ වඩාත්ම නිවැරදි පිළිතුර සඳහා සබැඳිය ඉවත් කළේය. එම ප්රකාශය මෙම සබැඳිය නැවත එකතු stackoverflow.com/questions/89332/...
Abhijeet

4

මා මෙහි පැමිණියේ කුමක් දැයි සොයා බැලුවද, ඇත්ත වශයෙන්ම තොගය නැවත ලබා ගන්නේ කෙසේද යන්නයි. විශේෂයෙන්, මම යමක් ගබඩා කර, පසුව පැරණි අනුවාදයක් පරීක්ෂා කර, පසුව එය පොප් කර ඇත, නමුත් එම මුල් අවස්ථාවේ දී තොගය විවෘතව නොතිබුණි, එම නිසා තොගය අතුරුදහන් විය; මට git stashඑය නැවත තොගයට තල්ලු කිරීමට කළ නොහැක . මෙය මට ප්‍රයෝජනවත් විය:

$ git checkout somethingOld
$ git stash pop
...
nothing added to commit but untracked files present (use "git add" to track)
Dropped refs/stash@{0} (27f6bd8ba3c4a34f134e12fe69bf69c192f71179)
$ git checkout 27f6bd8ba3c
$ git reset HEAD^    # Make the working tree differ from the parent.
$ git stash # Put the stash back in the stack.
Saved working directory and index state WIP on (no branch): c2be516 Some message.
HEAD is now at c2be516 Some message.
$ git checkout somethingOld # Now we are back where we were.

නැවත සලකා බැලීමේදී, මා භාවිතා git stash applyනොකළ යුතුව තිබුණි git stash pop. මම bisectසෑම bisectපියවරකදීම අයදුම් කිරීමට අවශ්‍ය කුඩා පැච් එකක් කළෙමි . දැන් මම මෙය කරනවා:

$ git reset --hard; git bisect good; git stash apply
$ # Run tests
$ git reset --hard; git bisect bad; git stash apply
etc.

මෙය පිළිතුරක්ද, නැතහොත් ප්‍රශ්නය දිගටම කරගෙන යාමද?
ඇලෙක්ස් බ්‍රවුන්

දෙකම ටිකක්. මම මෙම පිටුව සොයාගත්තේ මට තොගයක් නැති වී එය නැවත ලබා ගැනීමට උත්සාහ කළ බැවිනි. මා සඳහා භාවිතා කිරීමේ අවස්ථාව වන්නේ එක් එක් පියවරේදී පරීක්ෂා කිරීමට පෙර වෙනසක් යෙදීමට අවශ්‍ය ස්ථානයකි. ඔබට පොප්, ටෙස්ට්, ස්ටෑෂ්, බයිසෙක්ට් කළ නොහැකි අමාරු ක්‍රමයක් මම ඉගෙන ගත්තෙමි stash apply.
බෙන්
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.