Git ගබඩාවක මකාදැමුණු ගොනුවක් සොයාගෙන ප්‍රතිස්ථාපනය කරන්න


2814

මම Git ගබඩාවක සිටින බව පවසන්න. මම ගොනුවක් මකා දමා එම වෙනස සිදු කරමි. මම දිගටම වැඩ කරන අතර තවත් කැපවීම් කිහිපයක් කරමි. එවිට, මට එම ගොනුව නැවත පිහිටුවීමට අවශ්‍ය බව මට පෙනී ගියේය.

මට ගොනුවක් භාවිතා කර පරීක්ෂා කළ හැකි බව මම දනිමි git checkout HEAD^ foo.bar, නමුත් එම ගොනුව මකා දැමුවේ කවදාදැයි මම නොදනිමි.

  1. දී ඇති ගොනු නාමයක් මකා දැමූ බැඳීම සොයා ගැනීමට ඉක්මන්ම ක්‍රමය කුමක්ද?
  2. එම ගොනුව මගේ වැඩ කරන පිටපතට නැවත ලබා ගැනීමට ඇති පහසුම ක්‍රමය කුමක්ද?

මගේ ලොග් අතින් පිරික්සීමට, ලබා දී ඇති SHA සඳහා සම්පූර්ණ ව්‍යාපෘතියම පරික්ෂා කර බලා එම ගොනුව මගේ මුල් ව්‍යාපෘති පිරික්සුම තුළට අතින් පිටපත් කිරීම අවශ්‍ය නොවන බව මම බලාපොරොත්තු වෙමි.


39
පෙර විවරණය ශරීරයේ නොව මාතෘකාවේ ඇති ප්‍රශ්නයට පිළිතුරු සපයන බව සලකන්න - එයට ගොනුව මකා දැමූ දිනය සොයා ගැනීම ඇතුළත් වේ .
avdgaag

8
බැඳීම සොයා ගැනීම සඳහා ගොනුවක් මකාදමා ඇත:git log --diff-filter=D -- path/to/file
titaniumdecoy



55
@hhh git checkout deletedFileමක දැමීම ප්රතිලෝම කිරීම වනු ඇත deletedFileඑය මකා දමා තියෙන්නේ නම් නමුත් මකා තවමත් නිරත හෝ සිදු කර නැත . මෙහි ඇති ප්‍රශ්නය එය නොවේ. මෙම ප්‍රශ්නය බොහෝ කලකට පෙර මකාදැමූ ගොනුවක් යථා තත්වයට පත් කරන්නේ කෙසේද යන්නයි.
මාර්ක් අමරි

Answers:


3160

දී ඇති මාර්ගයට බලපාන අවසාන කැපවීම සොයා ගන්න. ගොනුව HEAD බැඳීමෙහි නොමැති බැවින්, මෙම බැඳීම එය මකා දැමිය යුතුය.

git rev-list -n 1 HEAD -- <file_path>

කැරට් ( ^) සංකේතය භාවිතා කරමින්, පෙර කැපවීමේදී අනුවාදය පරීක්ෂා කරන්න :

git checkout <deleting_commit>^ -- <file_path>

නැතහොත් එක් විධානයකින්, $fileසැක සහිත ගොනුව නම් .

git checkout $(git rev-list -n 1 HEAD -- "$file")^ -- "$file"

ඔබ zsh භාවිතා කරන්නේ නම් සහ EXTENDED_GLOB විකල්පය සක්‍රීය කර ඇත්නම්, භාර සංකේතය ක්‍රියා නොකරනු ඇත. ~1ඒ වෙනුවට ඔබට භාවිතා කළ හැකිය .

git checkout $(git rev-list -n 1 HEAD -- "$file")~1 -- "$file"

94
උපක්‍රමය නම් ^ උපසර්ගය භාවිතා කර බැඳීමට පෙර පරීක්ෂා කිරීමයි. ස්තූතියි.
ක්‍රිස්ටියන් ඕඩාර්ඩ්

4
කිසියම් හේතුවක් නිසා, මෙය zsh හි ක්‍රියා නොකරනු ඇත. ± git checkout $(git rev-list -n 1 HEAD "spec/Sporkfile_example.rb")^ -- "spec/Sporkfile_example.rb" zsh: no matches found: b71c152d8f38dcd23ad7600a93f261a7252c59e9^ මම බාෂ් වෙත මාරු වූ අතර එය හොඳින් ක්‍රියාත්මක විය.
zoras

20
වින්ඩෝස් විධාන රේඛාවෙන් මට දෝෂයක් ඇතිවිය. error: pathspec <filename> did not match any file(s) known to git.. විසඳුම වූයේ git bash භාවිතා කිරීමයි.
donturner

56
zoras zsh හි '^' මත තමන්ගේම ව්‍යාප්තියක් ඇති බව මම විශ්වාස කරමි, නමුත් ඔබට '~ 1' හි විකල්ප වාක්‍ය ඛණ්ඩය භාවිතා කළ හැකිය: git checkout <deleting-commit>~1 -- <file-path> ~ X ඔබට නිශ්චිත කැපවීමට පෙර X කොමිස් නියම කිරීමට ඉඩ දෙයි, එබැවින් before 1 යනු පෙර කැපවීමයි, ~ 2 මීට පෙර
කොමිස්

22
වින්ඩෝස් cmd විමසුමේදී, ^චරිතය ගැලවීමේ චරිතය වේ! එමනිසා, cmd මත, ඔබට ^^තනි වචනයක් අවශ්‍ය බව cmd ට ටයිප් කළ යුතුය ^ සහ ඉන් පසුව ඔබ වෙනත් දෙයකින් බේරෙන්නේ නැත. බොහෝ මිනිසුන්ට සිදුවන්නේ ^එය අවකාශයක් අනුගමනය කිරීමයි. එබැවින් cmd සිතන්නේ ඔබ අවකාශයෙන් ගැලවී යන බවයි - එමඟින් හුදෙක් අවකාශයේ අක්‍ෂරයක් ලැබේ. මේ අනුව, git මගින් ක්ලි තර්ක ලබා ගන්නා විට, එය දකින SHA1අතර නැත SHA1^ . එය ඇත්තෙන්ම කරදරයකි. ~ගැලවීමේ චරිතයක් නොවේ, එබැවින් එය තවමත් ක්‍රියාත්මක වන්නේ එබැවිනි. (PS. ගූගල්කරුවන්ට මෙම තොරතුරු අවශ්‍ය වේ යැයි ඔබ සිතන්නේ නම්, කරුණාකර මෙම අදහස ඉදිරිපත් කරන්න)
ඇලෙක්සැන්ඩර් බර්ඩ්

879
  1. භාවිත git log --diff-filter=D --summaryලිපිගොනු මකාදැමූ සහ මකා දැමූ සියලුම කොමිස් ලබා ගැනීමට ;
  2. git checkout $commit~1 path/to/file.extමකා දැමූ ගොනුව නැවත පිහිටුවීමට භාවිතා කරන්න .

කොහෙද $commit1 වන පියවරේදී ඔබ සොයාගත් කැපවීමේ වටිනාකම , උදාe4cf499627


10
කුතුහලය දනවන, ~ 1 යන්නෙන් අදහස් කරන්නේ කුමක්ද?
ටොමී චෙන්

7
om ටොමී - ටිල්ඩ් පිරිවිතර මඟින් නම් කරන ලද බැඳීමේ නව වැනි මුනුබුරා ඔබට ලබා දෙනු ඇත. වැඩි විස්තර සඳහා book.git-scm.com/4_git_treeishes.html බලන්න .
රොබට් මුන්ටේනු

5
මෙය බොහෝ දුරට පහසුම සහ අවබෝධාත්මක ප්‍රවේශයයි. git log -- *PartOfMyFileName*. ස්තූතියි$commit~1
bgs

3
මෙම git checkout $commit~1 filenameකාරක රීති තනි තනි ගොනු සඳහා එක වැඩ, ද මුළු බහලුම් සඳහා ක්රියා කරයි. එනම්: සියලුම මකා දැමූ පින්තූර ./images හි ෂා 12345 සිට ප්‍රතිස්ථාපනය කිරීමට : git checkout 12345~1 images. මෙම පිළිතුරට ස්තූතියි!
noinput

34
Lex ඇලෙක්සාර් $commit~1යන්නෙන් අදහස් කරන්නේ ඔබ බැඳීමේ නම එකතු කළ යුතු බවයි. 1d0c9ef6eb4e39488490543570c31c2ff594426cකොහෙද $commitඉන්නේ වගේ .
ඉයුජින්

320

මකාදැමුණු සියලුම ගොනු ෆෝල්ඩරයක ප්‍රතිස්ථාපනය කිරීමට, පහත දැක්වෙන විධානය ඇතුළත් කරන්න.

git ls-files -d | xargs git checkout --

1
ලිපිගොනු නල මාර්ගයට යන්නේ කොතැනටද? මම කිසිම වෙනසක් දකින්නේ නැහැ.
විලියම් ග්‍රෑන්ඩ්

21
මෙය බොහෝ විට පහසුම ක්‍රමයයි. gitසරලම කර්තව්‍යය පවා කොතරම් දුෂ්කර වී ඇත්ද යන්න එහි විකෘතියයි .
jww

git checkout - [ගොනුව] [ගොනුවේ] වෙනස්කම් නැවත ලබා දෙනු ඇත. නළය [ගොනුව] මකා දැමූ ගොනු වල නම සමඟ ප්‍රතිස්ථාපනය කරයි.
මනු

6
මෙම ls-filesඋප-විධාන යෝග්ය වේ, නමුත් ඉවත් කර ඇති බව ගොනු සඳහා වැඩ කිරීමට බවක් පෙනෙන්නට නැත git rmඑනම් විශ්රාම වැටුප් ඉල්ලූ දේ වන, ෙව්දිකා, තබා කැප.
මාර්ක්හූ

මකාදැමුණු ගොනු ප්‍රතිෂ් oring ාපනය කිරීම සඳහා මෙය ක්‍රියා කළ නමුත් වෙනස් වූ ලිපිගොනු යාවත්කාලීන කර M myChangedFileපසුව පෙන්වන්නේ git checkoutකෙසේද?
ලිබි

126

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

git checkout HEAD -- path/to/file.ext


94

ඔබ උමතු නම්, භාවිතා කරන්න git-bisect. කළ යුතු දේ මෙන්න:

git bisect start
git bisect bad
git bisect good <some commit where you know the file existed>

දැන් ස්වයංක්‍රීය පරීක්ෂණය ක්‍රියාත්මක කිරීමට කාලයයි. ෂෙල් විධානය පවතින්නේ '[ -e foo.bar ]'නම් 0 foo.barසහ වෙනත් ආකාරයකින් 1 ලබා දෙනු ඇත. git-bisectපරීක්ෂණය අසමත් වන පළමු බැඳීම ස්වයංක්‍රීයව සොයා ගැනීමට "ධාවනය" විධානය ද්විමය සෙවුම භාවිතා කරයි. එය ලබා දී ඇති පරාසයෙන් අඩක් ආරම්භ වේ (හොඳ සිට නරක දක්වා) සහ නිශ්චිත පරීක්ෂණයේ ප්‍රති result ල මත පදනම්ව එය අඩකින් කපා දමයි.

git bisect run '[ -e foo.bar ]'

දැන් ඔබ එය මකා දැමූ කැපවීමක සිටී. මෙතැන් සිට, ඔබට අනාගතයට git-revertආපසු ගොස් වෙනස අහෝසි කිරීමට භාවිතා කළ හැකිය,

git bisect reset
git revert <the offending commit>

නැතහොත් ඔබට එක් කැපවීමක් ආපසු ගොස් හානිය අතින් පරීක්ෂා කළ හැකිය:

git checkout HEAD^
cp foo.bar /tmp
git bisect reset
cp /tmp/foo.bar .

2
ඔබට විස්තර කළ git bisect run '[ -e foo.bar ]'හැකිද?
avdgaag

ඔබට ස්වයංක්‍රීයව පරීක්ෂා කළ නොහැකි දෙයක් නම්, ඔබට හොඳ සහ නරක අතින් භාවිතා කළ හැකිය. Bisect man පිටුව බලන්න.
ජොෂ් ලී

2
runavdgaag විසින් git bisect runGit ට කියනුයේ 'run' යන වචනයෙන් පහත විධානය ක්‍රියාත්මක කිරීමෙන් ද්විත්වය ස්වයංක්‍රීය කිරීම සඳහා වන අතර එහිදී විධානය අනුවාදයක් 0සඳහා නැවත පැමිණිය යුතුය good(විස්තර git help bisectසඳහා බලන්න). මෙම '[ -e foo.bar ]'ගොනුව නම් පරීක්ෂා සඳහා ප්රමිතියක් ප්රකාශනයකි foo.barපවතී (ක්රියාත්මක කිරීම ගොනුවේ සාමාන්යයෙන් කරන්නේ /usr/bin/[සාමාන්යයෙන් hardlinked වන /usr/bin/test) හා තනි quation ලකුණු තනි විධාන රේඛාව තර්කයක් ලෙස සියල්ල දමා කිරීම සඳහා භාවිතා වේ.
මිකෝ රන්ටලයිනන්

නියම අදහසක්. මම මෙම ප්‍රවේශය උත්සාහ කළ අතර එය මකා දැමීමට පෙර බැඳීමක් හඳුනා ගත්තා, නමුත් ඇත්ත වශයෙන්ම ගොනුව මකා දැමූ බැඳීම නොවේ. තවත් පරීක්ෂණයකදී මකාදැමීමට පෙර කළ යුතු ක්‍රියා 2 ක් හඳුනාගෙන ඇත.
මයිකල් ඔසොෆ්ස්කි

උමතුද? සමහරවිට. දෝෂයක් හඳුන්වා දුන් ස්ථානය සොයා ගැනීමට බයිසෙක්ට් හොඳ ක්‍රමයක් වන අතර එය කෙසේ හෝ ඉගෙන ගැනීමට වටිනා කුසලතාවකි. එබැවින් මෙහි 'නිවැරදි' හෝ වඩාත්ම 'නිවැරදි' මාර්ගය නොවුනත් එය තවමත් හොඳ අදහසක් වන අතර අනිවාර්යයෙන්ම +1 වටිනවා!
Pryftan

77

මගේ නව ප්රියතම හෙවත්, මත පදනම් bonyiii ගේ පිළිතුර (upvoted), සහ "ගැන මගේ ම පිළිතුර ඉතා Git හෙවත් විධානය තර්කයක් සමත් ":

git config alias.restore '!f() { git checkout $(git rev-list -n 1 HEAD -- $1)~1 -- $(git diff --name-status $(git rev-list -n 1 HEAD -- $1)~1 | grep '^D' | cut -f 2); }; f'

මට ගොනුවක් නැතිවී ඇත, වැරදීමකින් මකාදැමීමට පෙර?
ඉක්මන්:

git restore my_deleted_file

අර්බුදය වළක්වා ඇත.

අනතුරු ඇඟවීම, Git 2.23 (Q3 2019) සමඟ පැමිණේ git restore (!) නම් පරීක්ෂණාත්මක විධානය .
එබැවින් මෙම අන්වර්ථය නැවත නම් කරන්න (පහත පෙන්වා ඇති පරිදි).


අදහස් දැක්වීමේදී රොබට් ඩේලි පහත දැක්වෙන අන්වර්ථ නාමය යෝජනා කරයි :

restore-file = !git checkout $(git rev-list -n 1 HEAD -- "$1")^ -- "$1"

හා ජෙගන් එකතු අදහස් :

විධාන රේඛාවෙන් අන්වර්ථය සැකසීම සඳහා, මම මෙම විධානය භාවිතා කළෙමි:

git config --global alias.restore "\!git checkout \$(git rev-list -n 1 HEAD -- \"\$1\")^ -- \"\$1\"" 

7
මෙය ඉල්ලූ ගොනුව පමණක් නොව සමස්ත කැපවීමම ප්‍රතිස්ථාපනය කරයි.
ඩැනියෙල් බෑන්ග්

5
මෙන්න මගේ අන්වර්ථය, පුදුමාකාර ලෙස ක්‍රියා කරයි:restore-file = !git checkout $(git rev-list -n 1 HEAD -- "$1")^ -- "$1"
void.pointer

1
O රොබට් ඩේලි එය විශිෂ්ටයි! වැඩි දෘශ්‍යතාවයක් සඳහා මම ඔබේ අන්වර්ථය පිළිතුරට ඇතුළත් කර ඇත්තෙමි.
VonC

1
විධාන රේඛාවෙන් අන්වර්ථය සැකසීම සඳහා, මම මෙම විධානය භාවිතා කළෙමි:git config --global alias.restore "\!git checkout \$(git rev-list -n 1 HEAD -- \"\$1\")^ -- \"\$1\""
jegan

2
Expansion of alias 'restore' failed; '!git' is not a git command
K - SO හි විෂ වීම වැඩිවෙමින් පවතී.

55

ඔබ ගොනු නාමය දන්නේ නම්, මෙය මූලික විධානයන් සමඟ පහසු ක්‍රමයකි:

එම ගොනුව සඳහා වන සියලු කොමිස් ලැයිස්තුගත කරන්න.

git log -- path/to/file

අන්තිම බැඳීම (ඉහළම) ගොනුව මකා දැමූ එකකි. එබැවින් ඔබ අවසාන කැපවීම සඳහා දෙවැන්න යථා තත්වයට පත් කළ යුතුය.

git checkout {second to last commit} -- path/to/file

මෙම විසඳුම භාවිතා කළ අතර මකාදැමීම සඳහා කිසිදු කැපවීමක් නොතිබුණි. නවීනතම බැඳීම් හැඳුනුම්පත භාවිතා කර ගොනුව යථා තත්වයට පත් කිරීමට මට හැකි විය.
ආදම්

මකාදැමූ ගොනුවේ නවතම අනුවාදය ඊලඟ සිට අන්තිම කැපවීම (මකාදැමීමට පෙර කළ කැපවීම) අඩංගු නොවේද? දෙවන සිට අන්තිම දක්වා (කලින් මකාදැමීමට පෙර කළ කැපවීම) බලාපොරොත්තු රහිතව යල් පැන ගිය එකක් විය හැකිය.
සන්කැට් 2000

1
මෙය මා දුටු පළමු විසඳුම වන අතර එය ඊළඟ වතාවේ සොයා ගැනීමට නැවත මෙහි පැමිණිය යුතු නැත. සමහරවිට.
එලොෆ්

@ සන්කැට් 2000 “තත්පරයට අන්තිම” යන්නෙහි අර්ථය “මකාදැමීමට පෙර කැපවීම”, එය “අන්තිම සිට ඊළඟට” යන්නයි. en.wiktionary.org/wiki/penultimate#Synonyms
wisbucky

මෙම පිළිතුරට මිලියනය වතාවක් ස්තූතියි !!!!!
රාකේෂ් බීකේ

29

මකාදැමූ සහ කැපවූ ගොනුවක් නැවත පිහිටුවීමට:

git reset HEAD some/path
git checkout -- some/path

එය Git අනුවාදය 1.7.5.4 හි පරීක්ෂා කරන ලදී.


1
ඒක මට වැඩක් වුණේ නැහැ. පිටවීමෙන් පසුව, error: pathspec 'foo' did not match any file(s) known to git.ගොනු නාමය නිවැරදි බව මට සහතික විය. Git අනුවාදය 2.7.0
wisbucky

-1; මේක වැරදියි. මෙම විධානයන් විසින් තවමත් සිදු කර නොමැති මකාදැමීමක් අහෝසි කරනු ඇත (පළමුවැන්න මකාදැමීම අස්ථිර කරයි, එය වේදිකාගත කර ඇත්නම් සහ දෙවැන්න ගොනුවේ අස්ථිර වෙනස්කම් ඉවතලයි), නමුත් ඔබ මෙහි කියා සිටින්නේ ඔවුන් කැපවීමක් නැවත ලබා දෙන බවයි ගොනුව මකා දැමීම, එය සත්‍ය නොවන අතර ඉහත වැස්බකිගේ අදහස් දැක්වීමේදී එවැනි දෝෂයක් සමඟ අසමත් වනු ඇත.
මාර්ක් අමරි

Ark මාක්අමරි ඇත්ත වශයෙන්ම, ඉවත් කරන ලද ලිපිගොනු සඳහා කැපවීම සඳහා පැහැදිලි වේදිකා ගත නොකළ සංවර්ධකයින් සඳහා මෙම විධානය හොඳින් ක්‍රියාත්මක වූ බව මම සිතමි, නමුත් ප්‍රතිෂ් ored ාපනය git add -Aකරන ලද ගොනුව තවමත් කැපවී නොමැති මට්ටමක පවතී.
Fedir RYKHTIK

25

ඔබ වෙනස්කම් කර ගොනුවක් මකා දැමුවද එය සිදු නොකළේ නම්, දැන් ඔබ ඔබගේ වෙනස්කම් සමඟ බිඳී ඇත

git checkout -- .

නමුත් ඔබගේ මකාදැමුණු ලිපිගොනු ආපසු නොපැමිණියේ, ඔබ පහත විධානය කරන්න:

git checkout <file_path>

පෙර, ඔබේ ගොනුව නැවත පැමිණ ඇත.


24

මට මේ විසඳුම තියෙනවා .

  1. පහත දැක්වෙන එක් ක්‍රමයක් භාවිතා කරමින් ගොනුව මකා දැමූ බැඳීමේ හැඳුනුම්පත ලබා ගන්න.

    • git log --grep=*word*
    • git log -Sword
    • git log | grep --context=5 *word*
    • git log --stat | grep --context=5 *word* # ඔබට කිසිවක් මතක නැතිනම් නිර්දේශ කෙරේ
  2. ඔබ මෙවැනි දෙයක් ලබා ගත යුතුය:

commit bfe68bd117e1091c96d2976c99b3bcc8310bebe7 කර්තෘ: ඇලෙක්සැන්ඩර් ඕර්ලොව් දිනය: Thu May 12 23:44:27 2011 +0200

replaced deprecated GWT class
- gwtI18nKeySync.sh, an outdated (?, replaced by a Maven goal) I18n generation script

commit 3ea4e3af253ac6fd1691ff6bb89c964f54802302 කර්තෘ: ඇලෙක්සැන්ඩර් ඕර්ලොව් දිනය: Thu May 12 22:10:22 2011 +0200

3 . දැන් බැඳීම් හැඳුනුම්පත භාවිතා කරමින් bfe68bd117e1091c96d2976c99b3bcc8310bebe7 කරන්න:

git checkout bfe68bd117e1091c96d2976c99b3bcc8310bebe7^1 yourDeletedFile.java

බැඳීම් හැඳුනුම්පතෙහි සඳහන් වන පරිදි ගොනුව දැනටමත් මකාදමා ඇති බැඳීම bfe68b ට පෙර බැඳීම සඳහන් කළ ^1යුතුය. මෙයින් අදහස් කරන්නේ: bfe68b ට පෙර මට බැඳීමක් ලබා දෙන්න.


මෙය පිළිගත් පිළිතුරට සමාන ප්‍රවේශයකි, නමුත් මකාදැමීමේ බැඳීම සොයා ගැනීමට තවත් ක්‍රම කිහිපයක් ඇත. පිළිගත් පිළිතුරෙන් ගත් ප්‍රවේශයට මම තවමත් කැමතියි, නමුත් මේවා හොඳ විකල්ප වේ. ස්තූතියි!
avdgaag

මම හිතන්නේ මුලින් මකා දැමූ ගොනුව පරීක්ෂා කර පසුව (එය වෙනස් නොකර) එය සිදු කිරීමෙන් ගොනුවේ පිටපතක් නිර්මාණය නොවේ . හරිද? (මට මෙය රූප සමඟ කළ යුතු අතර, පිටපත් මඟින් ගබඩාව විශාල වනු ඇත)
ස්ටෝන්ක්‍රෂර්


12

git undelete path/to/file.ext

  1. මෙය ඔබගේ .bash_profile(හෝ ඔබ විධාන කවචයක් විවෘත කරන විට පටවන වෙනත් අදාළ ගොනුවක) තබන්න :

    git config --global alias.undelete '!sh -c "git checkout $(git rev-list -n 1 HEAD -- $1)^ -- $1" -'
    
  2. ඉන්පසු භාවිතා කරන්න:

    git undelete path/to/file.ext
    

මෙම අන්වර්ථය පළමුවෙන්ම මෙම ගොනුව පැවතියේ කොතැනදැයි සොයා බැලීමට පරික්ෂා කරයි, පසුව මෙම ගොනුව පැවති අවසාන කැපවීමෙන් එම ගොනු මාර්ගයේ Git පිරික්සුමක් සිදු කරයි. මූලාශ්රය .


11

බොහෝ අවස්ථාවන්හීදී, Git සමඟ ඒකාබද්ධව coreutils (grep, sed, etc.) භාවිතා කිරීම ප්‍රයෝජනවත් වේ . මම දැනටමත් මෙම මෙවලම් හොඳින් දනිමි, නමුත් Git අඩුය. මකාදැමුණු ගොනුවක් සෙවීමක් කිරීමට මට අවශ්‍ය නම්, මම පහත සඳහන් දෑ කරන්නෙමි:

git log --raw | grep -B 30 $'D\t.*deleted_file.c'

මම සංශෝධනය / කැපවීම සොයාගත් විට:

git checkout <rev>^ -- path/to/refound/deleted_file.c

අනිත් අය මට කලින් ප්‍රකාශ කළා වගේ.

ගොනුව ඉවත් කිරීමට පෙර තිබූ තත්වයට දැන් ප්‍රතිස්ථාපනය වේ. ඔබට එය වටා තබා ගැනීමට අවශ්‍ය නම් එය වැඩ කරන ගස වෙත නැවත කැප කිරීමට මතක තබා ගන්න.


7

නිශ්චිත කැපවීමකින් මකාදැමුණු ලිපිගොනු පොකුරක් යථා තත්වයට පත් කිරීමට මට සිදු වූ අතර, මම එය විධාන දෙකකින් කළමනාකරණය කළෙමි:

git show <rev> --diff-filter=D --summary --name-only --no-commit-id | xargs git checkout <rev>^ -- 
git show <rev> --diff-filter=D --summary --name-only --no-commit-id | xargs git reset HEAD 

(සෑම විධානයකම අවසානයේ ඇති පසුපස අවකාශය සටහන් කරන්න.)

.Gitignore ගොනුවට ලිපිගොනු එකතු කර ඇති අතර පසුව ඉවත් කර ඇත git rm. මට ලිපිගොනු යථා තත්වයට පත් කිරීමට අවශ්‍ය විය, නමුත් ඒවා වේදිකා ගත නොකරන්න. ප්‍රතිෂ් restore ාපනය කිරීම සඳහා මා සතුව ලිපිගොනු සිය ගණනක් තිබූ අතර අනෙක් උදාහරණවල මෙන් එක් එක් ගොනුව සඳහා දේවල් අතින් ටයිප් කිරීම ඉතා මන්දගාමී වනු ඇත.


7

ඇත්ත වශයෙන්ම, මෙම ප්‍රශ්නය කෙලින්ම Git ගැන වේ, නමුත් මා වැනි අය WebStorm VCS වැනි GUI මෙවලම් සමඟ වැඩ කරති Git CLI විධානයන් ගැන දැන ගැනීම හැර .

මකාදැමුණු ගොනුව අඩංගු මාවතේ මම දකුණු ක්ලික් කර, පසුව Git වෙත ගොස් පෙන්වන්න ඉතිහාසය මත ක්ලික් කරන්න .

රූප විස්තරය මෙහි ඇතුළත් කරන්න

VCS මෙවලම් සියළුම සංශෝධන දුම්රියන් පෙන්වන අතර ඒ සෑම ක්‍රියාවක්ම හා වෙනස්කම් මට දැකිය හැකිය.

රූප විස්තරය මෙහි ඇතුළත් කරන්න

ඉන්පසු මම මගේ මිතුරා PostAd.jsගොනුව මකා දැමිය යුතු කොමිස් තෝරා ගනිමි . දැන් පහත බලන්න:

රූප විස්තරය මෙහි ඇතුළත් කරන්න

දැන්, මගේ ආශාව මකා දැමූ ගොනුව මට දැක ගත හැකිය. මම ගොනු නාමය මත දෙවරක් ක්ලික් කළ විට එය යථා තත්වයට පත් වේ.

රූප විස්තරය මෙහි ඇතුළත් කරන්න

මගේ පිළිතුර Git විධාන නොවන බව මම දනිමි, නමුත් එය ආරම්භක සහ වෘත්තීය සංවර්ධකයින්ට වේගවත්, විශ්වාසදායක සහ පහසුය. WebStorm VCS මෙවලම් නියමයි සහ Git සමඟ වැඩ කිරීම සඳහා පරිපූර්ණ වන අතර එයට වෙනත් ප්ලගිනයක් හෝ මෙවලම් අවශ්‍ය නොවේ.


1
මේක නම් නියමයි! ඔබට ස්තුතියි. ඕනෑම ජෙට් බ්‍රේන්ස් IDE භාවිතා කරන අයට නිසැකවම පහසු විසඳුමක්.
ෆේබියානෝ අරූඩා

ගොනුව රූපයක් නම් අපි එය යථා තත්වයට පත් කරන්නේ කෙසේද?
Nodirabegimxonoyim

හිතවත් ab ෆැබියානෝ අරූඩා, ජෙට් බ්‍රේන්ස් අයිඩීඊ යනු සංවර්ධනය සඳහා ප්‍රබල මෙවලම් වේ. ඔබගේ සුන්දර අදහස් දැක්වීමට ස්තූතියි.
අමර්ලිකා ඒ

සංස්කරණයට ස්තූතියි ආදරණීය et පීටර් මෝර්ටෙන්සන්.
අමර්ලික් ඒ

6

මටත් ඒ ප්‍රශ්නයම තිබුණා. එය නොදැන මම කරදරකාරී බැඳීමක් ඇති කර ඇත්තෙමි .

ලැයිස්තුගත කරකැවීම්

git fsck --lost-found

එක් එක් කරදරකාරී කැපවීම පරීක්ෂා කරන්න

git reset --hard <commit id>

මම කරදරකාරී බැඳීමට ගිය විට මගේ ලිපිගොනු නැවත දර්ශනය විය.

git status හේතුව සඳහා:

“HEAD detached from <commit id where it detached>”


2
බොහොම ස්තූතියි. කේත පේළි දහස් ගණනක් ප්‍රතිස්ථාපනය කිරීමට ඔබ මට උදව් කළා.
රූබන්

5
user@bsd:~/work/git$ rm slides.tex
user@bsd:~/work/git$ git pull 
Already up-to-date.
user@bsd:~/work/git$ ls slides.tex
ls: slides.tex: No such file or directory

මකා දැමූ ගොනුව ප්‍රතිස්ථාපනය කරන්න:

user@bsd:~/work/git$ git checkout
D       .slides.tex.swp
D       slides.tex
user@bsd:~/work/git$ git checkout slides.tex 
user@bsd:~/work/git$ ls slides.tex
slides.tex

2
ප්‍රශ්නය වූයේ ගොනුවක් මකා දමා වෙනස් කිරීමෙන් පසුව එය ප්‍රතිෂ් oring ාපනය කිරීමයි. මෙම පිළිතුර වැඩකරන නාමාවලියෙහි පමණක් ඉවත් කරන ලද ගොනුවක් ප්‍රතිස්ථාපනය කිරීමයි.
akaihola

ඒක ඇත්ත, මම හොයපු දේ ඒකයි.
හෝලා සෝයා එඩු ෆෙලිස් නවීඩාඩ්

4

ගොනුව (ය) මකා දැමූ බැඳීම ඔබ දන්නේ නම්, මෙම විධානය ක්‍රියාත්මක <SHA1_deletion>කරන්න.

git diff --diff-filter=D --name-only <SHA1_deletion>~1 <SHA1_deletion> | xargs git checkout <SHA1_deletion>~1 --

පයිප්පයට පෙර කොටස බැඳීමේදී මකා දැමූ සියලුම ලිපිගොනු ලැයිස්තුගත කරයි; ඒවා සියල්ලම ප්‍රතිෂ් restore ාපනය කිරීමට පෙර කළ කැපවීමෙන් ඉවත් වීමකි.


4

ඔබගේ ගොනුව මකා දැමූ බැඳීම සොයා ගන්න:

git log --diff-filter=D --oneline -- path/to/file | cut -f -d ' '

නියැදි ප්‍රතිදානය:

4711174

Git 2.23 ට අනුව ඇත්ත වශයෙන්ම restoreවිධානයක් ඇත. එය තවමත් පර්යේෂණාත්මක ය, නමුත් ඔබ කැපවීමකින් ඉවත් කළ දෙයක් යථා තත්වයට පත් කිරීම සඳහා (මෙම අවස්ථාවේ දී 4711174) ඔබට ටයිප් කළ හැකිය:

git restore --source=4711174^ path/to/file

සටහන ^ අපි සිදු යමක් නැවත අවශ්ය සිදු id පසු ලෙස පෙර ගොනුව මකා දමන බව එක්.

එම --source තර්කය කියනවා, restoreනැවත එය ඕනෑම කැප පවා දර්ශකය කළ හැකි ගොනු (ව) සඳහා සොයා බැලීමට විධාන.

බලන්න: git 2.23.0 සඳහා git-restore doc


4

අපගේ නඩුවේදී අපි වැරදීමකින් ලිපිගොනු මකා දැමූ අතර සමහර ඒවා පසුව සිදු වූ විට අපගේ වැරැද්ද වටහා ගත් අතර මකාදැමුණු සියලුම ලිපිගොනු ආපසු ලබා ගැනීමට අවශ්‍ය වූ නමුත් වෙනස් කළ ඒවා නොවේ.

චාල්ස් බේලිගේ විශිෂ්ට පිළිතුර මත පදනම්ව, මෙන්න මගේ එක් ලයිනර් ය:

git co $(git rev-list -n 1 HEAD -- <file_path>)~1 -- $(git diff --name-status $(git rev-list -n 1 HEAD -- <file_path>)~1 head | grep '^D' | cut -f 2)

2

සරල හා නිරවද්‍ය-

පළමුවෙන්ම, ඔබට එම ගොනුව ඇති නවතම ස්ථාවර බැඳීමක් ලබා ගන්න -

git log 

ඔබ සොයා ගත්තා කියන්න $ commitid 1234567 ..., එසේ නම්

git checkout <$commitid> $fileName

මෙම බැඳීම තුළ තිබූ ගොනු අනුවාදය මෙය යථා තත්වයට පත් කරනු ඇත.


2

එය කළ හැකි හොඳම ක්‍රමය සඳහා එය උත්සාහ කරන්න.


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

git log --diff-filter = D - සාරාංශය

git checkout 84sdhfddbdddf ~ 1

සටහන: 84sdhfddbdddඔබේ යcommit id

මේ හරහා ඔබට මකාදැමුණු සියලුම ගොනු පහසුවෙන් ලබා ගත හැකිය.


1

git revertගොනුව මකා දැමූ ඔබගේ කැපවීම ඔබට සැමවිටම කළ හැකිය . ( මෙයින් උපකල්පනය වන්නේ මකාදැමීම කැපවීමේ එකම වෙනස බවයි. )

> git log
commit 2994bda49cd97ce49099953fc3f76f7d3c35d1d3
Author: Dave <dave@domain.com>
Date:   Thu May 9 11:11:06 2019 -0700

    deleted readme.md

ඔබ දිගටම වැඩ කර ඇත්නම් සහ එම මකාදැමීමට ඔබට අවශ්‍ය නැති බව පසුව අවබෝධ වූයේ නම්, ඔබට එය භාවිතයෙන් ආපසු හැරවිය හැකිය:

> git revert 2994bd

දැන් git logපෙන්වන්නේ:

> git log
Author: Dave <dave@domain.com>
Date:   Thu May 9 11:17:41 2019 -0700

    Revert "deleted readme"

    This reverts commit 2994bda49cd97ce49099953fc3f76f7d3c35d1d3.

සහ readme.mdගබඩාවට යථා තත්වයට පත් කර ඇත.


ගොනුව මකා දැමීමෙන් පසුව කොමිස් ගණනාවක් සිදු කර ඇති බවට ප්‍රශ්නය උපකල්පනය කර ඇති අතර, පසුව සිදුකරන කොමිස් අනවශ්‍ය බවට කිසිදු සාක්ෂියක් නොමැති හෙයින්, විස්තර කර ඇති තත්වය තුළ මෙය OP ට උදව් වනු ඇති බවක් නොපෙනේ.
ජොනතන් ලෙෆ්ලර්

1
ඔව්! ඔබට පසුකාලීන කොමිස් කළ හැකි අතර, මකාදැමීමේ බැඳීම ආපසු හරවන්න. ඒ නිසා / නව්යන දේවල් එකතු දමයි 111 ගොනුව සිදු, සහ 222 සිදු වුණොත්, 333, 444,, ඔබ තවමත් පෙරළුම් 111 delete ඉවත් කිරීමට සිදු කළ හැකි අතර, එය 555 සිදු වී ඇත
ඩේව් Baghdanov

0

පෙර ගොනුවක් දේශීය නාමාවලියකට ලබා ගැනීම සඳහා පහත කේතය භාවිතා කිරීමෙන් මට මෙම ගැටළුව තිබේ:

git checkout <file path with name>

පහත උදාහරණය මා වෙනුවෙන් වැඩ කරයි:

git checkout resources/views/usaSchools.blade.php


ගැටලුව කුමක්දැයි කරුණාකර සඳහන් කරන්න
අක්බෝර්

මකාදැමීම දැනටමත් සිදු කර ඇත. මෙම නඩුවේ සිට යථා තත්වයට පත් කිරීමේ කැපවීම ඔබ විසින් නියම කළ යුතුය.
sba


-1

මකාදැමීම සිදු කර නොමැති නම්, පහත දැක්වෙන විධානය මඟින් වැඩ කරන ගසෙහි මකාදැමුණු ගොනුව යථා තත්වයට පත් කරනු ඇත.

$ git checkout -- <file>

පහත දැක්වෙන විධානය භාවිතා කර වැඩ කරන ගසෙහි මකාදැමුණු සියලුම ගොනු ලැයිස්තුවක් ඔබට ලබා ගත හැකිය.

$ git ls-files --deleted

මකාදැමීම සිදු කර ඇත්නම්, එය සිදු වූ ස්ථානය සොයා ගන්න, ඉන්පසු මෙම බැඳීමෙන් ගොනුව නැවත ලබා ගන්න.

$ git rev-list -n 1 HEAD -- <file>
$ git checkout <commit>^ -- <file>

ඔබ යථා තත්වයට පත් කිරීම සඳහා ගොනුවේ මාර්ගය සොයන්නේ නම්, පහත දැක්වෙන විධානය මඟින් මකාදැමුණු සියලුම ගොනු වල සාරාංශයක් පෙන්වනු ඇත.

$ git log --diff-filter=D --summary

-1

මකාදැමූ සියලුම ගොනුව Git සමඟ ප්‍රතිස්ථාපනය කිරීම සඳහා, ඔබට මෙය කළ හැකිය:

git checkout $(git ls-files --deleted)

කොහෙද git ls-files --deletedලැයිස්තු සියළුම ගොනු සහ මකා git checkout $(git command)නැවත යථා පරාමිතිය ගොනු ලැයිස්තුව.

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.