Git හි ගොනුවක් මකා දැමූ විට සොයා ගන්න


1065

මට n කොමිස් සහිත Git ගබඩාවක් තිබේ.

මට අවශ්‍ය ලිපිගොනුවක් මා සතුව ඇති අතර එය ගබඩාවේ තිබී ඇති අතර මම හදිසියේම සොයා බලා "ඔහ්! එම ගොනුව කොහේද ගියේ?"

Git විධානය (ය) මාලාවක් මා සතුව ඇති අතර එය "ගොනුව ඇත්ත වශයෙන්ම_නීඩඩ්.ටෙක්ස්ට් n-13 හි මකාදමා ඇත" යනුවෙන් මට කියනු ඇත්ද?

වෙනත් වචන වලින් කිවහොත්, සෑම පුද්ගල බැඳීමක් දෙසම නොබලා, සහ මගේ Git repo හි සෑම ගොනුවකම සෑම වෙනස්කමක්ම ඇති බව නොදැන, එම ගොනුවේ ඇති අවසාන බැඳීම මට ඉක්මනින් සොයාගත හැකිද, එවිට මට එය නැවත ලබා ගත හැකිද?



2
පේද්‍රෝ විසින් බෙදාගත් සබැඳිය මගේ ප්‍රශ්නයට පිළිතුරක් විය: ඔබට මාර්ගය මතක නැති විට මකා දැමූ ගොනුවක් සොයා ගන්නේ කෙසේද.
ගෝර්ඩන් බීන්

Answers:


1160

git log --full-history -- [file path] ගොනුවක වෙනස්කම් පෙන්වයි, ගොනුව මකා දැමුවද වැඩ කරන්න.

උදාහරණයක්:

git log --full-history  -- myfile

ගොනුවක් මකා දැමූ අන්තිම බැඳීම පමණක් ඔබට දැකීමට අවශ්‍ය නම්, ඊට අමතරව, උදා. git log --full-history -1 -- [file path]

ගොනුව මකා දැමූ කුමන බැඳීම බලන්න


17
රටා සෙවිය හැකිද? ගොනුවේ සම්පූර්ණ නම මට අමතක විය = (සමහර විට සියලු මකාදැමීම් වල
ලොගයක්

7
එය මෙහි හමු විය: stackoverflow.com/questions/6017987/…
wutzebaer

7
කරුණාකර සටහන් කරන්න, ඔබ පවර්ෂෙල් භාවිතා කරන්නේ නම්, යටි ඉරෙන් ගැලවිය යුතුය: git log '-' [ගොනු මාර්ගය]. මෙය වෙනත් කෙනෙකුට දත්මිටි කෑමට සමාන වනු ඇතැයි සිතිය හැකිය.
ඒ. විල්සන්

71
git log -- */<<filename>>.<<file extension>>සම්පූර්ණ ගොනු මාර්ගය නොදැන මට සෙවීමට හැකි විය .
ටොම් හොවාර්ඩ්

3
සැබෑ ලිපිගොනු මාර්ගය සඳහා ස්ථාන දරන්නා ලෙස මෙරෝස් වර්ග වරහන් ඇත.
එමිලි බර්ජරන්

233

කෙටි පිළිතුර:

git log --full-history -- your_file

ඔබගේ රෙපෝ ඉතිහාසයේ ස්පර්ශක ඒකාබද්ධ කිරීමේ කොමිස් ඇතුළු සියලු කැපවීම් ඔබට පෙන්වනු ඇත your_file. අන්තිම (ඉහළ) ගොනුව මකා දැමූ එකකි.

සමහර පැහැදිලි කිරීම්:

මෙහි --full-historyධජය වැදගත් ය. එය නොමැතිව, ඔබ ගොනුවක ලොගය ඉල්ලා සිටින විට Git "ඉතිහාසය සරල කිරීම" සිදු කරයි. මෙය හරියටම ක්‍රියාත්මක වන්නේ කෙසේද යන්න පිළිබඳ තොරතුරු ලේඛනයෙහි සැහැල්ලු වන අතර එය ප්‍රභව කේතයෙන් සොයා ගැනීමට උත්සාහ කිරීමට අවශ්‍ය ධෛර්යය හා ධෛර්යය මට නැත, නමුත් git-log ලියකියවිලි වලට මෙය කීමට බොහෝ දේ ඇත:

පෙරනිමි ප්‍රකාරය

ගසෙහි අවසාන තත්වය පැහැදිලි කරමින් ඉතිහාසය සරලම ඉතිහාසයට සරල කරයි. සරලම දෙය නම් අවසාන ප්‍රති result ලය සමාන නම් සමහර පැති අතු කප්පාදු කිරීමයි (එනම් එකම අන්තර්ගතය සමඟ ශාඛා ඒකාබද්ධ කිරීම)

මෙම කාගේ ඉතිහාසය අපට අවශ්ය ගොනුව විට ගැන නිසැකව ම මකා දමන යම් මකා ගොනු අවසන් රාජ්ය පැහැදිලි සරල ඉතිහාසය නිසා, කිසිදු ඉතිහාසය . බව අවදානමක් පවතින git logතොරව --full-historyහුදෙක් ගොනුව නිර්මාණය කවදාවත් බව කියා ඇත? අවාසනාවට ඔව්. මෙන්න නිරූපණයක්:

mark@lunchbox:~/example$ git init
Initialised empty Git repository in /home/mark/example/.git/
mark@lunchbox:~/example$ touch foo && git add foo && git commit -m "Added foo"
[master (root-commit) ddff7a7] Added foo
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 foo
mark@lunchbox:~/example$ git checkout -b newbranch
Switched to a new branch 'newbranch'
mark@lunchbox:~/example$ touch bar && git add bar && git commit -m "Added bar"
[newbranch 7f9299a] Added bar
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 bar
mark@lunchbox:~/example$ git checkout master
Switched to branch 'master'
mark@lunchbox:~/example$ git rm foo && git commit -m "Deleted foo"
rm 'foo'
[master 7740344] Deleted foo
 1 file changed, 0 insertions(+), 0 deletions(-)
 delete mode 100644 foo
mark@lunchbox:~/example$ git checkout newbranch
Switched to branch 'newbranch'
mark@lunchbox:~/example$ git rm bar && git commit -m "Deleted bar"
rm 'bar'
[newbranch 873ed35] Deleted bar
 1 file changed, 0 insertions(+), 0 deletions(-)
 delete mode 100644 bar
mark@lunchbox:~/example$ git checkout master
Switched to branch 'master'
mark@lunchbox:~/example$ git merge newbranch
Already up-to-date!
Merge made by the 'recursive' strategy.
mark@lunchbox:~/example$ git log -- foo
commit 77403443a13a93073289f95a782307b1ebc21162
Author: Mark Amery 
Date:   Tue Jan 12 22:50:50 2016 +0000

    Deleted foo

commit ddff7a78068aefb7a4d19c82e718099cf57be694
Author: Mark Amery 
Date:   Tue Jan 12 22:50:19 2016 +0000

    Added foo
mark@lunchbox:~/example$ git log -- bar
mark@lunchbox:~/example$ git log --full-history -- foo
commit 2463e56a21e8ee529a59b63f2c6fcc9914a2b37c
Merge: 7740344 873ed35
Author: Mark Amery 
Date:   Tue Jan 12 22:51:36 2016 +0000

    Merge branch 'newbranch'

commit 77403443a13a93073289f95a782307b1ebc21162
Author: Mark Amery 
Date:   Tue Jan 12 22:50:50 2016 +0000

    Deleted foo

commit ddff7a78068aefb7a4d19c82e718099cf57be694
Author: Mark Amery 
Date:   Tue Jan 12 22:50:19 2016 +0000

    Added foo
mark@lunchbox:~/example$ git log --full-history -- bar
commit 873ed352c5e0f296b26d1582b3b0b2d99e40d37c
Author: Mark Amery 
Date:   Tue Jan 12 22:51:29 2016 +0000

    Deleted bar

commit 7f9299a80cc9114bf9f415e1e9a849f5d02f94ec
Author: Mark Amery 
Date:   Tue Jan 12 22:50:38 2016 +0000

    Added bar

කෙසේ දැනුම් git log -- barඉහත වචනාර්ථයෙන් කිසිම ප්රතිදානය ප්රතිඵලයක් පර්යන්තය කසල; Git යනු ඉතිහාසය barකිසි විටෙකත් නොතිබූ ප්‍රබන්ධයක් දක්වා “සරල කිරීම” ය . git log --full-history -- bar, අනෙක් අතට, නිර්මාණය barකළ කැපවීම සහ එය මකා දැමූ කැපවීම අපට ලබා දෙයි .

පැහැදිලිව කිවහොත්: මෙම ප්‍රශ්නය හුදෙක් න්‍යායාත්මක නොවේ. මම ලියකියවිලි දෙස බලා --full-historyධජය සොයාගත්තේ git log -- some_fileමකා දැමූ ගොනුවක් ලුහුබැඳීමට උත්සාහ කරන සැබෑ ගබඩාවක මා අසමත් වූ බැවිනි . දැනට පවතින ගොනුවක් එහි වර්තමාන තත්වයට පත්වූයේ කෙසේද යන්න තේරුම් ගැනීමට ඔබ උත්සාහ කරන විට ඉතිහාසය සරල කිරීම සමහර විට ප්‍රයෝජනවත් වනු ඇත, නමුත් ලිපිගොනු මකාදැමීමක් සොයා ගැනීමට උත්සාහ කරන විට ඔබ සැලකිලිමත් වන කැපවීම සඟවා ගැනීමෙන් ඔබව රවටා ගැනීමට වැඩි ඉඩක් ඇත. . --full-historyමෙම භාවිත අවස්ථාව සඳහා සෑම විටම ධජය භාවිතා කරන්න.


4
මෙය සොයන්නේ වත්මන් ශාඛාවට අදාළ ඉතිහාසය පමණක් බව ('සම්පූර්ණ රෙපෝ ඉතිහාසය' නොවේ) ... එනම්, වත්මන් ශාඛාව තුළ ගොනුව තවමත් මකා දමා නොමැති නමුත් වෙනත් ශාඛාවක තිබේ නම්, මකාදැමීමේ බැඳීම මෙයින් සොයාගත නොහැක. ගොනුව දැනටමත් මකා දමා ඇති ඕනෑම ශාඛාවක ඔබ සිටිය යුතුය . සමහර විට ඒ ගැන සිතන විට පැහැදිලිව පෙනේ, නමුත් එය මුලින් මා අල්ලා ගත්තේය.
ඇනන්ට්‍රොපික්

1
මෙම පිළිතුර ක්‍රියාත්මක වේ. නමුත් git logප්‍රතිදානයේ සිටම, අවසාන කැපවීම ගොනුව මකා දමා ඇති බව කිසිසේත්ම පැහැදිලි නැත . මම ද උත්සාහ git log --name-status --full-history -- file_nameහා git log -p --stat --full-history -- file_name, නමුත් කිසි පැහැදිලිව ගොනු සිදු නවතම ඉවත් කළ බව බයිබලයේ සඳහන් වෙනවා. මෙය දෝෂයක් සේ පෙනේ.
මාටින්_ඩබ්ලිව්

@Martin_ATS mkdir somedir && cd somedir && git init && touch foo && git add foo && git commit -m "Added foo" && git checkout -b newbranch && touch bar && git add bar && git commit -m "Added bar" && git checkout master && git rm foo && git commit -m "Deleted foo" && git checkout newbranch && git rm bar && git commit -m "Deleted bar" && git checkout master && git merge newbranch && git log --name-status --full-history -- barඇතුළත් D barහා A barGit 2.12.2 සමග ලඝු-සටහන නිමැවුම මට. නිමැවුමේ එම රේඛා ඔබට නොපෙනේද? ඔබ සතුව ඇති අනුවාදය කුමක්ද?
මාර්ක් අමරි

git version 2.15.1ඔව්, ඔබේ විධාන අනුක්රමය වාර්තාවේ D barහා A bar. සමහර විට මගේ ගැටලුව මගේ ලිපිගොනු ඉතිහාසයට විශේෂිත වේ. .htaccessGitignore'ed ඉවත් කර ඉවත් කරන ලද ගොනුවක ඉතිහාසය මම සොයා ගතිමි. මම අවසානයේ එය සොයාගෙන ගොනුව නැවත එකතු කළෙමි. මා ඇතුළත් වූ විට --name-statusදී git logවිධාන, මම දෙකක් බලන්න A .htaccessඇතුළත් කිරීම් (මම සිදු නවතම එය නැවත එකතු සිට) නමුත් D .htaccess. එබැවින් සමහර අවස්ථාවලදී, ගබඩාවෙන් ගොනුවක් ඉවත් කර ඇතත්, git logපැහැදිලි D file_nameප්‍රවේශයක් නොපෙන්වයි.
මාටින්_ඩබ්

Ar මාටින්_ඒටීඑස් කුතුහලයෙන්. මම කල්පනා කරන්නේ සමහර විට .htaccessX කැපවීමකට එකතු වී ඇති නමුත් එක්ස් මාස්ටර් වෙත ගෙන එන ඒකාබද්ධ කිරීමේ බැඳීමට ඇතුළත් නොවන්නේද? මට සිතිය හැකි එකම දෙය නම් ගොනුවක් එකතු කර ඇති අතර කිසි විටෙකත් මකා නොදැමූ නමුත් තවමත් එහි නොමැති බව මට තර්ක කළ හැකිය . MCVE එකක් සොයා ගැනීමට උත්සාහ කිරීම සිත්ගන්නාසුළු වනු ඇත, පසුව එය Git දෝෂයක්දැයි සොයා බලන්න, එසේ නොවේ නම්, ඔබේ නඩුව හැසිරවීමට මගේ පිළිතුර වෙනස් කළ හැකිද යන්න.
මාර්ක් අමරි

85

Git ලොග් නමුත් ඔබ සමඟ මාර්ගය උපසර්ගය කළ යුතුය --

උදා:

dan-mac:test dani$ git log file1.txt
fatal: ambiguous argument 'file1.txt': unknown revision or path not in the working tree.

dan-mac:test dani$ git log -- file1.txt
 commit 0f7c4e1c36e0b39225d10b26f3dea40ad128b976
 Author: Daniel Palacio <danpal@gmail.com>
 Date:   Tue Jul 26 23:32:20 2011 -0500

 foo

33

Regexp භාවිතා කරමින් මකාදැමූ ලිපිගොනු වල කොමිස් සොයා ගැනීම සඳහා මම මෙහි විසඳුමක් එක් කර ඇත්තෙමි (ගබඩාවේ ඇති සියලුම මකාදැමූ ගොනු ලැයිස්තුගත කිරීමට ක්‍රමයක් තිබේද?) .

git log --diff-filter=D --summary | sed -n '/^commit/h;/\/some_dir\//{G;s/\ncommit \(.*\)/ \1/gp}'

මෙය some_dir(කැස්කැඩින්) නම් නාමාවලියක් තුළ මකා දැමූ සියල්ල නැවත ලබා දෙයි . එහි ඇති ඕනෑම sed regexp සිදු \/some_dir\/කරනු ඇත.

OSX එකක් (@triplee හා @keif ස්තුතිවන්ත වන්නට)

git log --diff-filter=D --summary | sed -n -e '/^commit/h' -e '\:/:{' -e G -e 's/\ncommit \(.*\)/ \1/gp' -e }

1
හොඳයි. ඕඑස් එක්ස් හි සමහර නොගැලපීම්:sed: 1: "/^commit/h;/\/some_dir\ ...": bad flag in substitute command: '}'
බ්‍රෙන්ට් ෆවුස්ට්

@BrentFoust එය මට පරීක්ෂා කළ නොහැක ... අවසානයේ ඉඩක් එක් කිරීමට උත්සාහ කරන්න (වරහන් පසු නමුත් තනි උපුටා දැක්වීමට පෙර), ඔන්ලයින් මෑන් පිටුව ඒ ගැන පැහැදිලි නැත ...
estani

හොඳ යෝජනාවක්. නමුත් තනි උපුටා දැක්වීමට පෙර ඉඩක් එක් කිරීම ප්‍රයෝජනවත් නොවීය. වසා දැමීමේ වරහනට පෙර ඉඩක් ද නොතිබුණි.
බ්‍රෙන්ට් ෆවුස්ට්

1
sedවිධාන බෙදුම්කරුවන් ලෙස අර්ධ සළකුණු සමඟ BSD / OSX සෑම විටම හොඳ නැත. හිස් පේලි ගැන ඔවුන් වෙනස් උත්සාහ කරන්න, හෝ මාරුsed -n -e '/^commit/h' -e '\:/some_dir/:{' -e G -e 's/\ncommit \(.*\)/ \1/gp' -e }
tripleee

1
මම එය අත්හදා බැලූ git log --diff-filter=D --summary | sed -n -e '/^commit/h' -e '\:/:{' -e G -e 's/\ncommit \(.*\)/ \1/gp' -e }අතර OSX හි මා වෙනුවෙන් වැඩ කළෙමි.
keif

26

ගොනුව මකා දැමූ අවසාන බැඳීම ඔබට පහත පරිදි සොයාගත හැකිය:

git rev-list -n 1 HEAD -- [file_path]

වැඩි විස්තර මෙතැනින් ලබා ගත හැකිය


15
ප්‍රාථමික ඉහළට ඔසවා තැබූ විසඳුම මට වැඩ කළේ නැත, නමුත් මෙය සිදු විය.
නික් හයිනර්

මමත්, මෙය පිළිතුර විය යුතුයි +1
ෂැඩි නයිෆ්

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.