ව්‍යාපෘතියේ ඉතිහාසය මකා දැමූ ගොනුවක් සොයා ගන්නේ කෙසේද?


1302

වරෙක, මගේ ව්‍යාපෘතියේ ලිපිගොනුවක් තිබුනි, දැන් මට ලබා ගැනීමට හැකි වනු ඇත.

ගැටලුව වන්නේ: මම එය මකා දැමුවේ කවදාද සහ කුමන මාවතේද යන්න ගැන මට කිසිම අදහසක් නැත.

මෙම ගොනුව පවතින විට එහි කොමිස් සොයා ගන්නේ කෙසේද?


මෙවැනිම ප්‍රශ්නයක්: stackoverflow.com/questions/7093602/…
eckes


13
මෙහි ඇති පිළිතුරු අනුපිටපත් වල පිළිතුරු වලට වඩා මට ප්‍රයෝජනවත් වේ .
ෆෙලිපේ අල්වරෙස්

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

Answers:


1642

ඔබ භාවිතා කළ හැකි නිශ්චිත මාර්ගය ඔබ නොදන්නේ නම්

git log --all --full-history -- "**/thefile.*"

ගොනුව තිබූ මාර්ගය ඔබ දන්නවා නම්, ඔබට මෙය කළ හැකිය:

git log --all --full-history -- <path-to-file>

මෙම ගොනුව ස්පර්ශ කළ සියලුම ශාඛා වල කොමිස් ලැයිස්තුවක් මෙයින් පෙන්විය යුතුය. එවිට ඔබට අවශ්‍ය ගොනුවේ අනුවාදය සොයාගත හැකි අතර එය සමඟ ප්‍රදර්ශනය කරන්න ...

git show <SHA> -- <path-to-file>

නැතහොත් එය ඔබගේ වැඩ කරන පිටපතට නැවත පිහිටුවන්න:

git checkout <SHA>^ -- <path-to-file>

හඳුනාගත් තැනැත්තාට පෙර පිටවීම ලබා ගන්නා කැරට් සංකේතය ( ^) සැලකිල්ලට ගන්න , මන්දයත් ගොනුව මකාදැමීමේ මොහොතේදී , මකාදැමුණු ගොනුවේ අන්තර්ගතය ලබා ගැනීම සඳහා අප කළ පෙර කැපවීම දෙස බැලිය යුතුය.<SHA>


2
නිරපේක්ෂ මාර්ගයක් වෙනුවට සාපේක්ෂ මාර්ගයක් භාවිතා කිරීමට උත්සාහ කරන්න (ඔබ දැනටමත් නොමැති නම්).
ඇම්බර්

64
ඔබ නිශ්චිත මාර්ගය නොදන්නේ නම් කුමක් කළ යුතුද? ඔබ දන්නා සියල්ලම ගොනු නාමයද?
priestc

18
git log -- <path>ගොනුව කිසි විටෙකත් නොතිබූ ශාඛාවක සිටින විට edPedroMorteRolo හට ප්‍රතිදානයක් නොලැබේ. git log --all -- <path>වෙනත් ශාඛා වල සිදු වූ වෙනස්කම් ඔබ අතපසු නොකිරීමට ඔබ සැමවිටම භාවිතා කළ යුතුය . git log -- <path>ඔබට එක් ශාඛාවකට වඩා තිබේ නම් සහ මාර්ග සහ අතු (මා වැනි) අමතක කිරීමට නැඹුරු නම් විධානය ඉතා භයානක විය හැකි අතර ඔබ වෙනත් සංවර්ධකයින් සමඟ වැඩ කරන්නේ නම් එය ද භයානක ය.
හොබ්ස්

4
Mber ඇම්බර්, ඔබේ පිළිතුරට එකතු කිරීම ගැන සලකා බලන්න --all( පිලිප්ට ස්තූතියි ) git log, එවිට මිනිසුන් වෙනත් ශාඛා වල වෙනස්කම් සහ ලිපිගොනු අතපසු නොකරයි. එය මා වැනි අමතක වූ අයට බොහෝ ශෝකයක් ඉතිරි කරයි.
හොබ්ස්

3
පහත පිළිතුරෙහි සඳහන් කර ඇති පරිදි, ගොනුව git checkout <SHA>^ -- <path-to-file>
ප්‍රතිෂ් oring ාපනය කිරීම

401

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

git log --diff-filter=D --summary | grep delete

ඊළඟ විධානය ක්‍රියාත්මක කර එම කැපවීමේ හැඳුනුම්පත සොයා ගැනීමට සහ බැඳීම් හැඳුනුම්පත පිටපත් කරන්න

git log --all -- FILEPATH

මකා දැමූ ගොනුවේ වෙනස පෙන්වන්න

git show COMMIT_ID -- FILE_PATH

මතක තබා ගන්න, ඔබට >වැනි භාවිතා කරමින් ගොනුවකට ප්‍රතිදානය ලිවිය හැකිය

git show COMMIT_ID -- FILE_PATH > deleted.diff

1
පළමු පියවරේ උපකාරයෙන් මම මාර්ගය සොයා ගත්තද, දෙවන පියවර මෙම දෝෂය විසි කරයි : unknown revision or path not in the working tree.
jvannistelrooy

6
මකාදැමීම් සමඟ බැඳීම් හෑෂ් බැලීමට ඔබට කළ හැකියgit log --diff-filter=D --summary | grep -E 'delete|^commit\s+\S+'
ක්‍රිස් මිඩ්ල්ටන්

1
පියවර 2 කිසිවක් ආපසු ලබා නොදේ. එය සිදුවිය හැක්කේ මන්ද යන්න පිළිබඳ කිසියම් අදහසක් තිබේද? මගේ ගොනු නාමය නිවැරදි ය.
ඩෙනිස් ක්නියාෂෙව්

2
තුන එක් ශ්‍රිතයකට ඒකාබද්ධ කිරීම සොයා ගැනීමට, මෙය ඔබගේ .bashrc හෝ .zshrc වෙත එක් කරන්න: git-grep-latest(){ result_path=$(git log --diff-filter=D --summary | grep $1 | head -1 | awk '{print $4;}'); latest_commit=$(git log --all -- $result_path | head -1 | awk '{print $2;}'); git show $latest_commit -- $result_path; }දැන් ඔබට මෙය කළ හැකිය:git-grep-latest some_text
සසම්භාවී

1
Yt ටයිලර් ජෝන්ස් ඔබට පයිප්ප භාවිතයෙන් ලිනක්ස් සමඟ ඕනෑම දෙයකට පෝෂණය කළ හැකිය - ගූගල් linux pipes.. ඔබ එයට කැමති වනු ඇත.
ජෝන් හන්ට්

38

ඔබට නමින් ගොනුවක් නැවත ලබා ගැනීමට අවශ්‍ය යැයි සිතමු MyFile, නමුත් එහි ගමන් මාර්ගය ගැන අවිනිශ්චිත යැයි සිතමු (හෝ ඒ සඳහා එහි දිගුව):

මූලික: git root වෙත පියවර තැබීමෙන් ව්‍යාකූලත්වයෙන් වළකින්න

නොන්ට්රිවියල් ව්යාපෘතියකට සමාන හෝ සමාන නම් සහිත බහලුම් තිබිය හැකිය.

> cd <project-root>
  1. සම්පූර්ණ මාර්ගය සොයා ගන්න

    git log --diff-filter = D - සාරාංශය | grep delete | grep MyFile

    delete mode 100644 full/path/to/MyFile.js

full/path/to/MyFile.js යනු ඔබ සොයන මාර්ගය සහ ගොනුවයි.

  1. එම ගොනුවට බලපාන සියලු කොමිස් තීරණය කරන්න

    git log --oneline --follow - full / path / to / MyFile.js

    bd8374c Some helpful commit message

    ba8d20e Another prior commit message affecting that file

    cfea812 The first message for a commit in which that file appeared.

  2. ගොනුව පරීක්ෂා කරන්න

ඔබ පළමු ලැයිස්තුගත කළ බැඳීම තෝරා ගන්නේ නම් (අවසාන කාලානුක්‍රමිකව, මෙහි bd8374c), එම බැඳීම මකා දැමූ බැවින් ගොනුව සොයාගත නොහැක.

> git checkout bd8374c -- full/path/to/MyFile.js

`error: pathspec 'full/path/to/MyFile.js' did not match any file(s) known to git.`

පූර්වයෙන් තෝරන්න (භාරයක් එකතු කරන්න) බැඳීම:

> git checkout bd8374c^ -- full/path/to/MyFile.js

3
මෙය පිළිගත් පිළිතුරට වඩා බොහෝ පැහැදිලි ය
පූයාන් කොඩබාක්ෂ්

වින්ඩෝස් කොන්සෝලය සඳහා (cmd), පියවර 2 හි grep වෙනුවට find භාවිතා කරන්න: git log --diff-filter=D --summary | find "delete" | find "MyFile"සහ පියවර 3 , හැෂ් වටා ඇති මිල ගණන් සටහන් කරන්න:git checkout "bd8374c^" -- full/path/to/MyFile.js
user5542121

37

පිළිගත් ප්‍රතිචාරය සංස්කරණය කිරීමට නොහැකි වූ බැවින් එය පිළිතුරක් ලෙස මෙහි එක් කිරීම,

ගොනුව යථා තත්වයට පත් කිරීම සඳහා, පහත සඳහන් දෑ භාවිතා කරන්න (SHA ට පසුව '^' ලකුණ සටහන් කරන්න)

git checkout <SHA>^ -- /path/to/file

ඔබට ^ අවශ්‍ය ඇයිදැයි මට තේරෙන්නේ නැත. ගොනුව එම SHA සමඟ බැඳී ඇත ... ඔබට එතැන් සිට තවත් බැඳීමක් ආපසු ගෙන යාමට අවශ්‍ය ඇයි?
ටෝනි කේ.

19
එය "මකාදැමූ" ලෙස එම ෂා සමඟ බැඳී සිටී, එයින් අදහස් වන්නේ එය තවමත් නොපවතින බවයි. එය නැවත ලබා ගැනීම සඳහා ඔබ ඊට පෙර බැඳීමට යා යුතුය.
tandrewnichols

6
andtandrewnichols එයින් අදහස් කරන්නේ ඔබ වැරදි බැඳීමක් ඇති SHA භාවිතා කරන බවයි - ඔබට අවශ්‍ය ගොනුවේ අනුවාදය සඳහා කැපවීම ඔබට අවශ්‍යය ... එය බොහෝ විට ගොනුව මකා දැමූ අනුවාදය නොවේ.
ඇම්බර්

6
Mber ඇම්බර් සහ ඔබට අවශ්‍ය කැපවීම මකා දැමීමට පෙර නවතම එක විය හැකිය, එබැවින් මෙම පිළිතුර.
සෑම් හෝල්ඩර්

1
Lex ඇලෙක්ස්ආර්: <SHA>~1එය මිල ගණන් වලින් ඔතා අවශ්‍යතාවයකින් තොරව ක්‍රියා කළ යුතුය.
CodeManX

32

ඇම්බර් නිවැරදි පිළිතුරක් දුන්නා! තවත් එක් එකතු කිරීමක් පමණක්, ගොනුවේ නිශ්චිත මාර්ගය ඔබ නොදන්නේ නම් ඔබට ආදේශක කාඩ් භාවිතා කළ හැකිය! මෙය මට වැඩ කළා.

git log --all -- **/thefile.*

5
EdPedroMorteRolo Hmm. දැනට පවතින පිළිතුරක් ඉහළම ඡන්ද දායකයාට පිටපත් කිරීම ගැන මට හැඟෙන්නේ කෙසේදැයි මම නොදනිමි: / මෙම පිළිතුර තනිවම ප්‍රයෝජනවත් විය; ඉහළ නැංවීම ප්‍රමාණවත්ද?
ක්ලෙමන්ට්

2
මෙය ව්‍යාපෘති මූලයේ තිබේ නම් ගොනුව සොයාගත නොහැක (සිග්වින් හි පරීක්ෂා කර ඇත).
wortwart

20

පහත දැක්වෙන්නේ සරල විධානයකි, එහිදී dev හෝ git පරිශීලකයෙකුට නිධි මූල නාමාවලියෙන් මකාදැමුණු ගොනු නාමයක් ලබා දී ඉතිහාසය ලබා ගත හැකිය:

git log --diff-filter=D --summary | grep filename | awk '{print $4; exit}' | xargs git log --all -- 

ඕනෑම කෙනෙකුට, විධානය වැඩි දියුණු කළ හැකි නම්, කරුණාකර කරන්න.


1
නියමයි, ස්තූතියි! මගේ ගොනුව කිසි විටෙකත් නොතිබූ බවක් පෙනේ, නමුත් එය වෙනම හා වඩා

ඔබේ ගොනුව 'අස්ථානගත' වී ඇති බවක් පෙනේ නම්, මෙය නිධිය මූල නාමාවලියෙන් ක්‍රියාත්මක කිරීමට වග බලා ගන්න
සමස්පින්

18

gitkඅඩක් මතක තබා ගත් ගොනුව සොයා ගැනීමට ඔබට ඉතිහාසය පුරා සැරිසැරීමට හැකි වන පරිදි නරඹන්නන්ගෙන් එකක් භාවිතා කිරීමට උත්සාහ කරන්න . ( gitk --allසියලුම ශාඛා සඳහා අවශ්‍ය නම් භාවිතා කරන්න )


4
--allඔබේ පිළිතුර සහ පිළිගත් පිළිතුර යන දෙකම සඳහා එම විකල්පය ඉතා වැදගත් වේ.
හොබ්ස්

3
ඉතිහාසය පුරා සැරිසැරීම බොහෝ ව්‍යාපෘති සඳහා අසාමාන්‍ය කාලයක් ගතවනු ඇත.
mikemaccana

5

සාරාංශය:

  1. පියවර 1

මකාදැමූ ලිපිගොනු ඉතිහාසයේ ඔබේ ගොනුවේ සම්පූර්ණ මාර්ගය සොයන්න git log --diff-filter=D --summary | grep filename

  1. පියවර 2

ඔබගේ ගොනුව මකා දැමීමට පෙර ඔබ එය ප්‍රතිෂ් restore ාපනය කරයි

restore () {
  filepath="$@"
  last_commit=$(git log --all --full-history -- $filepath | grep commit | head -1 | awk '{print $2; exit}')
  echo "Restoring file from commit before $last_commit"
  git checkout $last_commit^ -- $filepath
}

restore my/file_path

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.