Git හි එක් ගොනුවක වැඩ කරන පිටපත් වෙනස් කිරීම් අහෝසි කරන්න?


1643

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

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

මම කොහොමද ඒක කරන්නේ?

Answers:


2228

ඔයාට පාවිච්චි කරන්න පුළුවන්

git checkout -- file

--(නිම්රොඩ්ම් විසින් යෝජනා කර ඇති පරිදි) ඔබට එය කළ හැකිය , නමුත් ගොනු නාමය ශාඛාවක් හෝ ටැගයක් (හෝ වෙනත් සංශෝධන හඳුනාගැනීමක්) මෙන් පෙනේ නම්, එය ව්‍යාකූල විය හැකිය, එබැවින් භාවිතා --කිරීම වඩාත් සුදුසුය.

ගොනුවක විශේෂිත අනුවාදයක් ද ඔබට පරීක්ෂා කළ හැකිය:

git checkout v1.2.3 -- file         # tag v1.2.3
git checkout stable -- file         # stable branch
git checkout origin/master -- file  # upstream master
git checkout HEAD -- file           # the version from the most recent commit
git checkout HEAD^ -- file          # the version before the most recent commit

34
HEAD සහ HEAD between අතර වෙනස කුමක්ද?
hasen

62
HEAD යනු වත්මන් ශාඛාවේ නවතම කැපවීම වන අතර HEAD the යනු වර්තමාන ශාඛාව සඳහා වන කැපවීමයි. ඔබ විස්තර කරන තත්වය සඳහා, ඔබට git checkout HEAD - ගොනු නාමය භාවිතා කළ හැකිය.
පෝල්

16
කෙටියෙන් "git checkout sha-reference - filename" එහිදී ෂා-යොමු කිරීම යනු ඕනෑම ආකාරයක (ශාඛාවක්, ටැගයක්, මවුපියන් යනාදිය) කැපවීමක ෂා වෙත යොමු කිරීමකි
ලක්ෂ්මන් ප්‍රසාද්

30
සටහන: ගොනුව දැනටමත් වේදිකා ගත කර ඇත්නම්, පළමුව එය නැවත සැකසිය යුතුය. git reset HEAD <filename> ; git checkout -- <filename>
ඔලී

14
ඔව්, ඔබට නවතම දෙයින් කොමිස් HEAD^^2 ක් හෝ HEAD^^^නැවත කොමිස් 3 ක් සඳහා කළ හැකිය . ඔබට නැවත භාවිතා කිරීමට අවශ්‍ය නම් වඩාත් පහසු වන ඔබට භාවිතා කළ හැකිය HEAD~2, නැතහොත් "මෙම කැපවීමේ දෙවන මාපිය" යන්නයි. ඒකාබද්ධ කිරීමේ බැඳීම් නිසා, බැඳීමකට පෙර බැඳීම් එකකට වඩා තිබිය හැකිය, එබැවින් සංඛ්‍යාවක් සමඟ එම දෙමව්පියන්ගෙන් කවරෙකු තෝරා ගන්නේද, සංඛ්‍යාවක් සමඟ සෑම විටම පළමු දෙමව්පියන් තෝරා ගන්නා නමුත් එම වාර ගණන නැවත ලබා ගනී. බලන්න වැඩි විස්තර සඳහා. HEAD~3HEAD^2HEAD^HEAD~git help rev-parse
බ්‍රයන් කැම්බල්

140

භාවිතා කරන්න

git checkout filename

මෙය ගොනු නාමය වත්මන් ශාඛාවේ නවතම අනුවාදය සමඟ ප්‍රතිස්ථාපනය කරයි.

අවවාදයයි: ඔබගේ වෙනස්කම් ඉවතලනු ඇත - උපස්ථයක් තබා නොගනී.


22
@duckx එය ගොනු නාම වලින් ශාඛා නාමයන් ව්‍යාකූල කිරීමයි. ඔබ කියන්නේ නම් git checkout xසහ x යනු ශාඛා නාමයක් මෙන්ම ගොනු නාමයක් වේ නම්, පෙරනිමි හැසිරීම යනු කුමක්දැයි මට විශ්වාස නැත, නමුත් මම සිතන්නේ ඔබට x ශාඛාවට මාරුවීමට අවශ්‍ය යැයි git උපකල්පනය කරනු ඇත. ඔබ භාවිතා කරන විට ඔබ --කියන්නේ පහත දැක්වෙන්නේ ගොනු නාමයයි.
hasen

2
එය ඉවත් කිරීමට ස්තූතියි. සෑම කෙනෙකුම ඔබ උපකල්පනය කරන්නේ කුමක්දැයි උපකල්පනය කරයි - එයින් අදහස් කරන්නේ ඔවුන් ඔබට උදාහරණ පෙන්වන විට ය. එය ඔබට පහසුවෙන් ගූගල් කළ හැකි දෙයක් නොවේ.
පැටෝෂි パ ト シ

2
--එයින් ඉවත් කිරීම සඳහා පිළිතුර සංස්කරණය කළ බව පෙනේ. @ නිවැරදින් පෙන්වා දෙන පරිදි, තවමත් නිවැරදි වුවත්, ගොනු නාමය සහ ශාඛා නම් අතර අපැහැදිලි බවක් තිබේ නම්, ඔබට මෙහි ඉතා නුසුදුසු හැසිරීම් වලින් අවසන් විය හැකිය!
BrainSlugs83

2
මම කැමතියි එය කැමති ආකාරයට, නැතිව --, ලස්සන හා පහසුයි. ගොනු නාම භාවිතා කරමින් ඔබ ශාඛා නම් කරන විට, කොතැනක හෝ නරක චින්තනයක් තිබිය යුතුය ...
මාකෝ ෆවුස්ටිනෙලි

133
git checkout <commit> <filename>

මම අද මෙය භාවිතා කළේ 6.10 ඩ්‍රැපූල් දක්වා ඉහළ නංවන විට මගේ ෆේවිකොන් කොමිස් කිහිපයකට පෙර නැවත ලියා ඇති බව මට වැටහුණු නිසා මට එය නැවත ලබා ගැනීමට සිදු විය. මෙන්න මම කළ දේ:

git checkout 088ecd favicon.ico

1
"Git log --stat" නිමැවුම් ටොන් ගණනක් අනුචලනය කිරීම හැරුණු විට (කලින් මකා දැමූ ගොනුවක) බැඳීම ලබා ගන්නේ කෙසේද?
ඇලෙක්ස්

4
IMO විධාන රේඛාව හරහා gits ලොග් හරහා පරිලෝකනය කර නිවැරදි ගොනුව සොයා ගැනීම දුෂ්කර ය. Sourcetreeapp.com
neoneye

6
git log --oneline <filename>ඔබට වඩාත් සංයුක්ත
ලොගයක්

1
විකල්පයක් ලෙස, ඔබට භාවිතා කළ හැකියgit reflog <filename>
ygesher

70

ඔබගේ ගොනුව දැනටමත් වේදිකා ගත කර ඇත්නම් (ගොනුව සංස්කරණය කිරීමෙන් පසු ඔබ git add යනාදිය සිදු කරන විට) ඔබගේ වෙනස්කම් අස්ථිර කිරීමට.

භාවිත

git reset HEAD <file>

ඉන්පසු

git checkout <file>

දැනටමත් වේදිකා ගත කර නොමැති නම්, භාවිතා කරන්න

git checkout <file>

2
පිළිගත් එක් හාහාට වඩා මෙය ප්‍රයෝජනවත් වී තිබේ. වේදිකාගත කර ඇති වෙනස්කම් සහ නැති දේ අමතක කිරීම පහසුය, එබැවින් නැවත සැකසීම උපකාරී විය. මම මීට පෙර "git reset --hard" උත්සාහ කළද, එය "git reset HEAD" කළ දේ කළේ නැත. මම හිතන්නේ ඇයි?
අර්මාන් බිමාටොව්

20

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

git checkout branchname^ filename

මෙය අවසාන කැපවීමට පෙර තිබූ පරිදි ගොනුව පරීක්ෂා කරනු ඇත. ඔබට තවත් කිහිපයක් ආපසු යාමට අවශ්‍ය නම්, branchname~nඅංකනය භාවිතා කරන්න .


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

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

සමහර විට OP හි භාවිතය නොවිය හැක, නමුත් මාගේ ශාඛාව ස්වාමියාගේ පිටපත සමඟ නැවත ලියන්නේ කෙසේදැයි මම සොයමින් සිටියෙමිbranchname^
ඇලෙක්ස්

16

මට Git bash හරහා සිදු විය:

(use "git checkout -- <file>..." to discard changes in working directory)

  1. Git තත්ත්වය. [එබැවින් එක් ගොනුවක් wad වෙනස් කර ඇති බව අපි දැක ඇත්තෙමු.]
  2. git checkout - index.html [මම index.html ගොනුවේ වෙනස් වී ඇත:
  3. git තත්ත්වය [දැන් එම වෙනස්කම් ඉවත් කරන ලදි]

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


8

මම සෑම විටම මේ සමඟ ව්‍යාකූල වී සිටිමි, එබැවින් මෙන්න මතක් කිරීමේ පරීක්ෂණ අවස්ථාවක්; bashපරීක්ෂා කිරීමට මෙම පිටපත අප සතුව ඇතැයි කියමු git:

set -x
rm -rf test
mkdir test
cd test
git init
git config user.name test
git config user.email test@test.com
echo 1 > a.txt
echo 1 > b.txt
git add *
git commit -m "initial commit"
echo 2 >> b.txt
git add b.txt
git commit -m "second commit"
echo 3 >> b.txt

මෙම අවස්ථාවෙහිදී, වෙනස හැඹිලියේ වේදිකා ගත නොකෙරේ, එසේ git statusය:

$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   b.txt

no changes added to commit (use "git add" and/or "git commit -a")

මෙතැන් සිට, අපි කරන්නේ නම් git checkout, ප්‍රති result ලය මෙයයි:

$ git checkout HEAD -- b.txt
$ git status
On branch master
nothing to commit, working directory clean

ඒ වෙනුවට අප එසේ කරන්නේ නම් git reset, ප්‍රති result ලය වනුයේ:

$ git reset HEAD -- b.txt
Unstaged changes after reset:
M   b.txt
$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   b.txt

no changes added to commit (use "git add" and/or "git commit -a")

ඉතින්, මෙම අවස්ථාවේ දී - වෙනස්කම් වේදිකා ගත නොකළේ නම්, git resetකිසිදු වෙනසක් සිදු නොකරන අතර git checkoutවෙනස්කම් නැවත ලියයි.


දැන් අපි කියමු, ඉහත පිටපතෙහි අවසාන වෙනස වේදිකාගත කර / හැඹිලිගත කර ඇති බව, එනම් අපි ද එසේ කළෙමු git add b.txt අවසානයේ දී කළ .

මෙම අවස්ථාවේ git statusදී, මෙම අවස්ථාවෙහිදී:

$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    modified:   b.txt

මෙතැන් සිට, අපි කරන්නේ නම් git checkout, ප්‍රති result ලය මෙයයි:

$ git checkout HEAD -- b.txt
$ git status
On branch master
nothing to commit, working directory clean

ඒ වෙනුවට අප එසේ කරන්නේ නම් git reset, ප්‍රති result ලය වනුයේ:

$ git reset HEAD -- b.txt
Unstaged changes after reset:
M   b.txt
$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   b.txt

no changes added to commit (use "git add" and/or "git commit -a")

ඉතින්, මෙම අවස්ථාවේ දී - වෙනස්කම් වේදිකාගත කර git resetඇත්නම්, මූලික වශයෙන් වේදිකාගත කරන ලද වෙනස්කම් අස්ථායී වෙනස්කම් බවට පත් git checkoutකරනු ඇත - වෙනස්කම් සම්පූර්ණයෙන්ම නැවත ලියයි .


7

මෙම පිළිතුරු එකම හෝ බහු ෆෝල්ඩරවල (හෝ නාමාවලිවල) විශේෂිත ලිපිගොනු වල ඇති දේශීය වෙනස්කම් අහෝසි කිරීම සඳහා අවශ්‍ය විධානය සඳහා වේ. මෙම පිළිතුරු මගින් පරිශීලකයාට එක් ගොනුවකට වඩා ඇති නමුත් විශේෂයෙන් දේශීය වෙනස්කම් සියල්ල අහෝසි කිරීමට අවශ්‍ය නොවන ප්‍රශ්නයට ආමන්ත්‍රණය කරයි:

ඔබට ලිපිගොනු එකක් හෝ වැඩි ගණනක් තිබේ නම්, එම එක් එක් ලිපිගොනු වලට එකම විධානයක් යෙදිය හැකිය git checkout -- file.

git checkout -- name1/name2/fileOne.ext nameA/subFolder/fileTwo.ext

name1 / name2 / fileOne.ext nameA / subFolder / fileTwo.ext අතර ඇති අවකාශය මතක තබා ගන්න

එකම ෆෝල්ඩරයේ ඇති ගොනු කිහිපයක් සඳහා:

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

git checkout -- name1/name2/*

ඉහත දැක්වෙන තරු ලකුණු මඟින් නම 1 / name2 යටතේ එම ස්ථානයේ ඇති සියලුම ලිපිගොනු අහෝසි කිරීමේ උපක්‍රමය කරයි.

ඒ හා සමානව, පහත දැක්වෙන පරිදි බහු ෆෝල්ඩර සඳහා සියලුම ලිපිගොනු වල වෙනස්කම් අහෝසි කළ හැකිය:

git checkout -- name1/name2/* nameA/subFolder/*

ඉහත සඳහන් නම් 1 / name2 / * nameA / subFolder / * අතර ඇති අවකාශය නැවත මතක තබා ගන්න.

සටහන: name1, name2, nameA, subFolder - මෙම සියලු උදාහරණ ෆෝල්ඩර නාම වලින් දැක්වෙන්නේ ගොනුව (ය) වාසය කළ හැකි ෆෝල්ඩරය හෝ පැකේජයයි.


5

මම මගේ ලිපිගොනු SHA හැඳුනුම්පත භාවිතයෙන් යථා තත්වයට පත් කරමි, මම කරන්නේ එයයි git checkout <sha hash id> <file name>



2

ඔබ තවමත් ඔබගේ කැපවීම තල්ලු කර හෝ වෙනත් ආකාරයකින් බෙදාගෙන නොමැති නම්:

git diff --stat HEAD^...HEAD | \
fgrep filename_snippet_to_revert | cut -d' ' -f2 | xargs git checkout HEAD^ --
git commit -a --amend

0

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


1
භාවිතා කිරීමට නිශ්චිත විධානයන් එකතු කිරීම මුල් පෝස්ටරයට සහ අනාගත අමුත්තන්ට උපකාරී වේ.
ඒඩ්‍රියන්

0

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

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

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.