Git සමඟ ගොනුවක පැරණි අනුවාදයක් මා දකින්නේ කෙසේද?


1524

කිසියම් ගොනුවක විශේෂිත අනුවාදයක් බැලීමට (එක්කෝ stdout වෙතට හෝ, $PAGERහෝ $EDITOR) බැලීමට Git හි විධානයක් තිබේද?



ඔබ ද්විමය ගොනුවක පැරණි අනුවාදයක් පරීක්ෂා කිරීමට අවශ්‍ය නිසා (උදා: රූපයක්) ඔබ මෙම ප්‍රශ්නයට පැමිණියේ නම්, පැරණි කැපවීම පරීක්ෂා කිරීම වඩා හොඳය, ඔබට දැකීමට අවශ්‍ය දේ බලන්න, ඉන්පසු නැවත HEAD වෙත එන්න. ඒ සඳහා git checkout <sha1-of-the-commit-you-need>, පසුව කරන්න,git checkout HEAD
හෝමෙරෝ එස්මරල්ඩෝ

Answers:


1752

ඔබට git showනිධියේ මුල සිට මාර්ගයක් භාවිතා කළ හැකිය ( ./හෝ ../සාපේක්ෂ ව්යායාම සඳහා):

$ git show REVISION:path/to/file

REVISIONඔබගේ සත්‍ය සංශෝධනය සමඟ ප්‍රතිස්ථාපනය කරන්න (Git commit SHA, ටැග් නාමයක්, ශාඛා නාමයක්, සාපේක්ෂ බැඳීම් නාමයක් හෝ Git හි බැඳීමක් හඳුනා ගැනීමේ වෙනත් ක්‍රමයක් විය හැකිය)

උදාහරණයක් ලෙස, <repository-root>/src/main.cකොමිස් 4 කට පෙර සිට ගොනුවේ අනුවාදය බැලීමට , භාවිතා කරන්න:

$ git show HEAD~4:src/main.c

වින්ඩෝස් සඳහා වන Git වත්මන් නාමාවලියට සාපේක්ෂව මාර්ගවල පවා ඉදිරි කප්පාදුවක් අවශ්‍ය වේ . වැඩි විස්තර සඳහා, man පිටුව බලන්න git-show.


5
එය ඇත්ත වශයෙන්ම වැඩ කරන බවක් නොපෙනේ - ඔබ එය උත්සාහ කළාද? "Git show HEAD: path / to / file.c" සඳහා, මට "නොපැහැදිලි තර්ක" දෝෂයක් ලැබේ.
මයික්


20
ඔබ කවුළු මත සිටී නම්, එය මාර්ග වෙන් කිරීමේ දෙයක් විය හැකිය; මම HEAD: dir \ subdir \ ගොනුව පෙන්වන්නේ නම්, මට නොපැහැදිලි තර්කය ලැබේ. මම git show HEAD: dir / subdir / file නම්, එය අපේක්ෂිත පරිදි ක්‍රියා කරයි.
මැට් මැක්මින්

12
පසු ඔබ සැපයිය යුතු මාර්ගය: git නිධියේ මුල සිට ය. (මෙය පිළිතුරක් ලෙස පහත දක්වා ඇත, නමුත් එය මෙම පිළිතුර පිළිබඳ අදහස් දැක්වීමක් ලෙස අදහස් කර ඇතැයි මම සිතමි)
MatrixFrog

9
ඔවුන් එය එකට අනුචලනය වන පරිදි Vim භේදයකින් දැකීමට අවශ්‍ය නම්, මම එය කරන්නේ කෙසේදැයි පෙන්වන කෙටි බ්ලොග් සටහනක් ලිවීය .
ෆ්ලේවියු

259

දිනය අනුව මෙය කිරීම පෙනේ:

git show HEAD@{2013-02-25}:./fileInCurrentDirectory.txt

බව සටහන HEAD@{2013-02-25}මාර්ගයෙන් මෙම නිධිය තුල "හිස 2013-02-25 මත සිටි" (භාවිතා වන reflog ), "පසුගිය 2013-02-25 පෙර මෙම ශාඛාව ඉතිහාසයේ සිදු නොවේ".


5
නියමයි. ගිතුබ් වෙත ගොස් බැඳීම දෙස බැලීම වෙනුවට මගේ කාලය ඉතිරි කරයි.
ෆයිසර් ඛාන්

ගොනු මාර්ගයේ "තිත" මගේ ගැටළුව විය. ස්තූතියි!
ටොමස්චරඩ්

5
ඔබ ශාඛාවක සිටී නම් masterවෙනුවට මෙම විධානය ප්‍රයෝජනවත් වේHEAD@{2013-02-25}
funroll

1
ඔබට කාලය ඇතුළත් කළ හැකිද git log --since='2016-04-28 23:59:59 +0100'?
ඩම්බල්ඩාඩ්

9
මෙම කාරක රීති ද reflog භාවිතා කාරනය වැදගත් වන අතර, නිසා, දැඩි ඉස්මතු කළ යුතු ද reflog සියලු අනාචාරයේ අඩංගු නොවේ . Blog.endpoint.com/2014/05/git-checkout-at-specific-date.html
ඇලිස් හීටන්

114

ඔබ GUI වලට කැමති නම්, ඔබට gitk භාවිතා කළ හැකිය:

  1. සමඟ gitk ආරම්භ කරන්න:

    gitk /path/to/file
    
  2. තිරයේ ඉහළ කොටසේ සංශෝධනය තෝරන්න, උදා: විස්තරය හෝ දිනය අනුව. පෙරනිමියෙන්, තිරයේ පහළ කොටස එම සංශෝධනය සඳහා වෙනස පෙන්වයි, ("පැච්" රේඩියෝ බොත්තමට අනුරූප වේ).

  3. තෝරාගත් සංශෝධනය සඳහා ගොනුව බැලීමට:

    • "ගස" රේඩියෝ බොත්තම ක්ලික් කරන්න. මෙම සංශෝධනයේදී ගොනු ගසෙහි මුල පෙන්වනු ඇත.
    • ඔබේ ගොනුවට සරඹ කරන්න.

7
මෙය ද ටිග් සමඟ ක්‍රියා කරයි , එය ශාප ගිට් රෙපෝ නරඹන්නෙකි.
මැතිව් ජී

1
A පෝල් ස්ලොකුම්: මෙම විධානය සාම්ප්‍රදායික විධානයක් නොවන නිසා විය හැකිය. මම හිතන්නේ මෙම විධානය ක්‍රියාත්මක වන්නේ වින්ඩෝස් සඳහා පමණි.
එන්විල්

මෙය ක්‍රියාත්මක වන්නේ ඔබේ git ගබඩාවේ මුල සිට නම් පමණි.
මාක්

ඔබට යම් සංශෝධනයක් gitk සමඟ පරීක්ෂා කිරීමට අවශ්‍ය නම් ඔබට මෙම කෙටිමඟ භාවිතා කළ හැකිය : gitk REVISION /path/to/file. නිදසුනක් ලෙස ඔබට යම් අනුවාදයක් පරීක්ෂා කිරීමට අවශ්‍ය වූ විට මෙය ප්‍රයෝජනවත් වේ.
Christian.D

89

ඔබට විධානය සමඟ a commit hash(බොහෝ විට ද හැඳින්වේ commit ID) නියම කළ හැකිය .git show


කෙටියෙන් කිවහොත්

git show <commitHash>:/path/to/file


පියවරෙන් පියවර

  1. දී ඇති ගොනුවක් සඳහා වන සියළු වෙනස්කම් වල ලොගය පෙන්වන්න git log /path/to/file
  2. පෙන්වා ඇත වෙනස්වීම් ලැයිස්තුව දී, එය පෙන්නුම් commit hashවැනි commit 06c98...(06c98 ... මේ සිදු හැෂ් වීම)
  3. පිටපත් කරන්න commit hash
  4. 3 වන පියවර සහ 1 වන පියවර git show <commitHash>:/path/to/fileභාවිතා කරමින් විධානය ක්‍රියාත්මක කරන්න .commit hashpath/to/file

සටහන:./ සාපේක්ෂ මාර්ගයක් නියම කිරීමේදී එකතු කිරීම වැදගත් යැයි පෙනේ, එනම් git show b2f8be577166577c59b55e11cfff1404baf63a84:./flight-simulation/src/main/components/nav-horiz.html.


1
ඔබ ගොනු කිරීමට මාර්ගය නොදන්නේ නම්, git show <SHA1> --name-onlyඑය ලබා ගැනීමට භාවිතා කරන්න.
ටියානා

මෙම විධානය op - ස්වයංක්‍රීයව පවා මතකයෙන් සම්පුර්ණ වේ - මකා දැමූ නාමාවලියක පරීක්ෂා කර ඇත ... එම gg ට වඩා වැඩි
විකල්පයක්

43

අමතරව ජිම් Hunziker පිළිතුරේ

සංශෝධනයෙන් ඔබට ගොනුව අපනයනය කළ හැකිය,

git show HEAD@{2013-02-25}:./fileInCurrentDirectory.txt > old_fileInCurrentDirectory.txt

මෙය උපකාරී වේ යැයි සිතමි :)


25

ගොනුවක පැරණි සංශෝධන සමඟ ඇති වෙනස්කම් ඉක්මනින් දැකීමට:

git show -1 filename.txt > ගොනුවේ අවසාන සංශෝධනය සමඟ සැසඳීමට

git show -2 filename.txt > 2 වන අවසාන සංශෝධනයට සාපේක්ෂව

git show -3 fielname.txt > අවසාන 3 වන අවසාන සංශෝධනයට සාපේක්ෂව


18
එම විධානයන් මා සඳහා වර්තමාන අනුවාදය සමඟ වෙනස්කම් පෙන්වන නමුත් සම්පූර්ණ ගොනුව පෙන්වන්නේ නැත.
ජීන් පෝල්

19

git log -pබැඳීම් ල logs ු-සටහන් පමණක් නොව, එක් එක් බැඳීම්වල වෙනස ද ඔබට පෙන්වනු ඇත (ඒකාබද්ධ කිරීමේ කොමිස් හැර). එවිට ඔබට එබිය හැකිය /, ගොනු නාමය ඇතුළත් කර ඔබන්න enter. ඔබන්න nහෝ pඊළඟ / පෙර සිදුවීමට යන්න. මේ ආකාරයෙන් ඔබ ගොනුවේ වෙනස්කම් පමණක් නොව බැඳීම් තොරතුරු ද දකිනු ඇත.


3
git log -pmඒකාබද්ධ කිරීමේ කොමිස් ද පෙන්වන බව පෙනේ .
සැන්බර්

2
git log -p -- filename.txtඉතිහාසය අපේක්ෂිත ගොනුවට පමණක් සීමා කිරීමට ඔබට ධාවනය කළ හැකිය .
ජීන් පෝල්

3

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

උදා

git_dump_all_versions_of_a_file.sh path/to/somefile.txt

තවත් සමාන ප්‍රශ්නයකට පිළිතුරක් ලෙස මෙහි පිටපත ලබා ගන්න


1
git_root, git_log_shortසහ git_log_message_for_commitඅතුරුදහන්.
මොග්සි

හොඳ ඇල්ලීමක්! මම මෙම පිළිතුර විවිධ ස්ථාන 2 කට දෙවරක් පළ කළ අතර, මෙය ඉවත් කර අනෙකා සමඟ සම්බන්ධ කළෙමි, එහිදී මිනිසුන් මට මේ ගැන කලින් කීවා ... ස්තූතියි @mogsie!
බ්‍රැඩ් පාර්ක්ස්

මෙම පිටපත ඉතා ප්‍රයෝජනවත් වේ!
XMAN

3

මාර්ගය 1: (මම මේ ආකාරයට කැමතියි)

  1. මේ සමඟ බැඳීම් හැඳුනුම්පත සොයා ගන්න :git reflog
  2. බැඳීම් වලින් ගොනු ලැයිස්තුගත කරන්න git diff-tree --no-commit-id --name-only -r <commitHash>

උදාහරණය: git diff-tree --no-commit-id --name-only -r d2f9ba4// "d2f9ba4" යනු "1" සිට කැපවීමේ හැඳුනුම්පතයි.

  1. අවශ්‍ය ගොනුව විධානය සමඟ විවෘත කරන්න:

git show <commitHash>:/path/to/file

උදාහරණය: git show d2f9ba4:Src/Ext/MoreSwiftUI/ListCustom.swift// "Src / ..." යනු "2" සිට ගොනු මාර්ගයයි.

මාර්ගය 2:

  1. මේ සමඟ බැඳීම් හැඳුනුම්පත සොයා ගන්න :git reflog
  2. මෙම කැපවීම නැවත සකස් කරන්න: git reset --hard %commit ID%

git reset --hard c14809fa

  1. ඕනෑම අනවශ්‍ය වෙනසක් සිදු කර අවශ්‍ය ශාඛාවලට නැවුම් කැපවීමක් කරන්න :)

0

දී ඇති සංශෝධනයකින් ගොනු කිහිපයක් ලබා ගැනීමට උදව් කරන්න

ඒකාබද්ධ කිරීමේ ගැටුම් නිරාකරණය කිරීමට උත්සාහ කරන විට, මෙම සහායකයා ඉතා ප්‍රයෝජනවත් වේ:

#!/usr/bin/env python3

import argparse
import os
import subprocess

parser = argparse.ArgumentParser()
parser.add_argument('revision')
parser.add_argument('files', nargs='+')
args = parser.parse_args()
toplevel = subprocess.check_output(['git', 'rev-parse', '--show-toplevel']).rstrip().decode()
for path in args.files:
    file_relative = os.path.relpath(os.path.abspath(path), toplevel)
    base, ext = os.path.splitext(path)
    new_path = base + '.old' + ext
    with open(new_path, 'w') as f:
        subprocess.call(['git', 'show', '{}:./{}'.format(args.revision, path)], stdout=f)

GitHub ඉහළට .

භාවිතය:

git-show-save other-branch file1.c path/to/file2.cpp

ප්‍රති come ලය: පහත දැක්වෙන්නේ ලිපිගොනු වල විකල්ප අනුවාදයන් ය:

file1.old.c
path/to/file2.old.cpp

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


Ic මිකීපර්ල්ස්ටයින් ඔබට වඩා හොඳ ක්‍රියාත්මක කිරීමකින් එකම අතුරු මුහුණතක් ලබා ගත හැකි නම්, මම සියල්ලන්ටම ඇහුම්කන් දෙමි.
සීරෝ සැන්ටිලි 郝海东 冠状 病 六四 六四

සමහර විට මට තේරෙන්නේ නැත (සහ එසේ නම්, මගේ සමාව) නමුත් එය නිකම්ම නොවේ: "git show version: ./ path> new_path"?
මිකී පර්ල්ස්ටයින්

Ic මිකීපර්ල්ස්ටයින් හායි, ඔව්, මගේ විධානය මඟින් එම සීඑල්අයි ජනනය කරයි, නමුත් එය බහු ලිපිගොනු හරහා ලූප සහ ආදානයෙන් ප්‍රතිදාන නාමය නිපදවයි, එබැවින් ඔබ ඕනෑවට වඩා ටයිප් කිරීමට අවශ්‍ය නැත. ඇත්ත වශයෙන්ම විප්ලවීය කිසිවක් නැත, නමුත් පහසුය.
සිරෝ සැන්ටිලි 郝海东 冠状 病 六四 事件
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.