Git අදින්න අහෝසි කරන්න, පැරණි තත්වයට ගබඩාවන් ගෙන එන්නේ කෙසේද


1031

මගේ මූලාශ්‍රය / ගබඩාව git pull කිරීමට පෙර තිබූ පැරණි තත්වයට පැමිණීමට හැකිවන පරිදි git pull ආපසු හැරවීමට හෝ අහෝසි කිරීමට ක්‍රමයක් තිබේද? මට මෙය කිරීමට අවශ්‍ය වන්නේ එය මට අවශ්‍ය නොවූ සමහර ගොනු ඒකාබද්ධ කළ නමුත් ඉතිරි ගොනු පමණක් ඒකාබද්ධ කිරීම නිසාය. ඉතින්, මට එම ලිපිගොනු නැවත ලබා ගැනීමට අවශ්‍යයි, එය කළ හැකිද?

සංස්කරණය කරන්න: පැහැදිලි කිරීම සඳහා මට git ඒකාබද්ධ කිරීම අහෝසි කිරීමට අවශ්‍යයි. පිළිතුරු කිහිපයක් දැකීමෙන් පසු මම මෙය කළෙමි

git reflog
bb3139b... HEAD@{0}: pull : Fast forward
01b34fa... HEAD@{1}: clone: from ...name...

දැන්, මා කුමක් කළ යුතුද? කරන්නේ git reset --hard හරිද? මට එය නැවත ඉස්කුරුප්පු කිරීමට අවශ්‍ය නැත, එබැවින් සවිස්තරාත්මක පියවර ඉල්ලා සිටීද?


23
ඔබගේ ඉතිහාසයේ ඔබට ඇත්තේ කරුණු දෙකක් පමණක් බව පෙනේ: ක්ලෝනයක් සහ ලබා ගැනීම. ක්ලෝන වෙත යළි පිහිටුවන්න:, git reset --hard 01b34faමේ අවස්ථාවේ දී ඔබට git reset --hard HEAD^HEAD ට පෙර එක් කැපවීමකට නැවත සැකසෙන දේ කළ හැකිව තිබුණි .
jkp

2
ඔබේ වැඩ කරන ලිපිගොනු වෙනස් කිරීමට අවශ්‍ය නම් --hard අවශ්‍ය වේ
විලියම් පර්සෙල්

3
g seg.server.fault: එය ක්‍රියාත්මක වූයේ නම්, ඔබට සැමවිටම පිළිතුර පිළිගත හැකිය;)
jkp

7
git reset --hard HEAD fun
funroll

7
git refloggit සමඟ කර ඇති සියල්ල සියල්ල පෙන්වනු ඇත. සමහර විට ඉලක්කයක් නොවන, git reset --hard [sha1 of something from reflog]පෙන්වා ඇති දේ සියල්ල ආපසු හරවනු ඇතැයි සැලකිලිමත් reflogවේ. නරක දත්ත සමඟ ආරම්භයේ සිට ඇද ගන්නා ලද ප්‍රධාන ශාඛාව නැවත ඒකාබද්ධ කිරීමට ඔබට අවශ්‍යය (සිදු වේ), එම ඒකාබද්ධ කිරීමෙන් පසුව ඔබ වෙනත් ශාඛා වල වැඩ කර ඇත. reflogසෑම ශාඛාවක්ම වෙනත් ශාඛා වල පෙන්වනු ඇත. නමුත් git checkout masterසහ git reset --hard [SH1 of commit on master branch just before merge]නැවත සැකසෙන්නේ වත්මන් ප්‍රධාන ශාඛාව පමණි.
ව්ලැඩිමීර් වුකනාක්

Answers:


1472

ධාවනය git pullමඟින් පහත සඳහන් කාර්යයන් පිළිවෙලින් සිදු කරයි:

  1. git fetch
  2. git merge

ඒකාබද්ධ කිරීමේ පියවර ඔබේ වින්‍යාසය තුළ ඒකාබද්ධ කිරීම සඳහා සකසා ඇති ශාඛා ඒකාබද්ධ කරයි. ඔබ නැති කිරීමට අවශ්ය ඒකාබද්ධ පියවර, නමුත් බොහෝ විට නැත බෝගයන්ගේ (අර්ථයෙන් ගොඩක් බවට පත් නොවන අතර අවශ්ය නොවනු).

ඒකාබද්ධ කිරීම අහෝසි කිරීමට , git reset --hardදේශීය ගබඩාව පෙර තත්වයකට යළි පිහිටුවීමට භාවිතා කරන්න; පෙර තත්වයේ SHA-1 සොයා ගැනීමට git-reflog භාවිතා කර එය නැවත සකසන්න.

අවවාදයයි

මෙම කොටසේ ලැයිස්තුගත කර ඇති විධානයන් සියලු නොගැලපෙන වෙනස්කම් ඉවත් කරයි, එය වැඩ නැතිවීමට හේතු විය හැක:

git reset --hard

විකල්පයක් ලෙස, කාලයාගේ ඇවෑමෙන් නිශ්චිත ස්ථානයකට යළි පිහිටුවන්න,

git reset --hard master@{"10 minutes ago"}

327
පෙර රාජ්ය ගන්න කිරීමට මෙය ඉතා අගනා ක්රමයක්, GIT-reflog භාවිතා කිරීම සහ කාරීව පිටපත් වෙනුවට, වැනි කෙටි මාර්ග භාවිතා කිරීමයි master@{1}මීට පෙර තත්ත්වය වන, master, master@{"5 minutes ago"}, හෝ master@{14:30}. මේ ආකාරයෙන් සංශෝධන නියම කිරීම පිළිබඳ සම්පූර්ණ තොරතුරු man git-rev-parse"සංශෝධන නියම කිරීම" යනුවෙන් හැඳින්වෙන කොටසේ සොයාගත හැකිය .
කැස්කබෙල්

38
මෙම අවස්ථාවෙහිදී ORIG_HEAD ද ක්‍රියා කළ යුතුය ("git reset --hard ORIG_HEAD")
ජකුබ් නාරබ්ස්කි

El ජෙල්ෆ්‍රෝමි: එම තොරතුරට ස්තූතියි, ඔබ සංශෝධන ගැන එතරම් වාචිකව කතා කළ හැකි බව මම දැන සිටියේ නැත. හෙඩ්ට සාපේක්ෂව සංශෝධන තෝරා ගැනීම ගැන මම දැන සිටියෙමි, නමුත් ප්‍රශ්නය ඇසූ විට ඔහුට යන්නට අවශ්‍ය වේලාවට මා දැන සිටියේ නැත.
jkp

මම අදින විට, එය පවසයි Updating d2c90a3..035ac4d. මෙන්න, ඔබට d2c90a3නැවත සැකසීමට පරාමිතියක් ලෙසද භාවිතා කළ හැකිය .
තායි

ඔබ reflog භාවිතා කරන විට හැෂ් ටයිප් කිරීමට අවශ්‍ය නොවේ. ඔබට HEAD @ {1} හෝ පරාවර්තනයේ අර්ථ දක්වා ඇති පෙර අංක භාවිතා කළ හැකිය.
සයිමන් ද කැට්

346

Jkp ගේ පිළිතුරට සමානය, නමුත් මෙන්න සම්පූර්ණ විධානය:

git reset --hard a0d3fe6

එහිදී a0d3fe6 සොයාගත හැකිය

git reflog

ඔබට අවලංගු කිරීමට අවශ්‍ය ස්ථානය දෙස බැලීම.


git reset HEAD --hardඋදාහරණයක් ලෙස මට එය කළ නොහැක්කේ ඇයි ?
සුං චෝ

9
IkeMikeC මෙම ප්‍රවේශය මඟින් ඔබට ඇදීම් කිහිපයක් ආපසු යාමට ඉඩ සලසයි, උදාහරණයක් ලෙස
xji

2
මට වම් පැත්තේ අයිඩී භාවිතා කිරීමට නොහැකි නමුත් git reset --hard HEAD@{n}වැඩ කළා
ඊ. සුන්ඩින්

1
වසර ගණනාවකට පසු මෙහි නැවත නැවත පිටපත් කිරීම වෙනුවට jkp හි පිළිතුර සංස්කරණය කිරීමට ඔබ යෝජනා කළ යුතුව තිබුණි.
අභිෂේක් ආනන්ද්

මා සතුව මෙය තිබේ නම් git reflog: dab04ec HEAD @ {0}, aaaaaa HEAD @ {1} සහ bbbbbbb HEAD @ {2}. මා එසේ කළහොත් මට git reset --hard bbbbbbbහෙඩ් 0 සහ 1 අහිමි වේ ද?
pmiranda

119

ඒකාබද්ධ කිරීම අහෝසි කිරීමට වඩාත් නවීන ක්‍රමයක් නම්:

git merge --abort

සහ තරමක් පැරණි ක්‍රමය:

git reset --merge

පෙර පිළිතුරු වල විස්තර කර ඇති පැරණි පාසල් ක්‍රමය (අනතුරු ඇඟවීම: ඔබගේ සියලු දේශීය වෙනස්කම් ඉවතලනු ඇත):

git reset --hard

නමුත් ඇත්ත වශයෙන්ම, එය ලබා දීම git merge --abortහා සමාන වන බව සැලකිල්ලට ගැනීම වටී . ඒකාබද්ධ කිරීමේ විධානය සඳහා git help හි මෙය කියවිය හැකිය.git reset --mergeMERGE_HEAD

git merge --abort is equivalent to git reset --merge when MERGE_HEAD is present.

අසාර්ථක ඒකාබද්ධ වීමෙන් පසුව, නොමැති විට MERGE_HEAD, අසාර්ථක වූ ඒකාබද්ධ කිරීම අහෝසි කළ හැකි git reset --mergeනමුත් අවශ්‍යයෙන්ම නොවේ git merge --abort, එබැවින් ඒවා එකම දේ සඳහා පැරණි හා නව වාක්‍ය ඛණ්ඩ පමණක් නොවේ . මම සොයා ඒ නිසයි git reset --mergeඑදිනෙදා වැඩ කටයුතු බොහෝ වඩා ප්රයෝජනවත් වේ.


21
git merge --abortඒකාබද්ධ කිරීමකදී ක්‍රියා කරයි, git pullඅවසන් වූ පසු නොවේ. එබැවින් මෙම පිළිතුර ප්‍රශ්නයට අදාළ නොවන බව පෙනේ.
අභිෂේක් ආනන්ද්

1
git reset --mergeකැපවීම සඳහා වේදිකාගත කර නොමැති සියලුම වෙනස්කම් මකා දමයි. මෙය දුෂ්කර ආකාරයකින් සොයා ගන්නා ලදී.
theadriangreen

65

එය පළමු භාවිතය සඳහා ක්‍රියා කරයි: git reflog

ඔබගේ පූර්ව තත්වයේ SHA සොයාගෙන සාදන්න (HEAD @ {1 an උදාහරණයක්)

git reset --hard HEAD@{1}

40

ඔබට gitk තිබේ නම් ("gitk --all ඔබේ git විධාන රේඛාවෙන්" ධාවනය කිරීමට උත්සාහ කරන්න), එය සරල ය. එය ක්‍රියාත්මක කරන්න, ඔබට ආපසු යාමට අවශ්‍ය කැපවීම තෝරන්න (දකුණු-ක්ලික් කරන්න), සහ “මෙහි ප්‍රධාන ශාඛාව යළි පිහිටුවන්න” තෝරන්න. ඔබට නොගැලපෙන වෙනස්කම් නොමැති නම්, "දෘ" "විකල්පය තෝරන්න.


8
ඔබ එය දැක නොමැති නම් මෙය ධාවනය කිරීම වටී. එය පිස්සු GUI එකක් මතු කරයි.
ඉවාන් මොරන්

35

$COMMITඔබ රඟ දැක්වීමට පෙර අවසන් කැපවීමේ හැඳුනුම්පත යැයි සිතමු git pull. අන්තිම ඇදීම අහෝසි කිරීමට ඔබට අවශ්‍ය වන්නේ එයයි

git reset --hard $COMMIT

.

පාරිතෝෂිකය:

අදින්න ගැන කතා කිරීමේදී, මම සිත්ගන්නා උපක්‍රමයක් බෙදා ගැනීමට කැමතියි,

git pull --rebase

මෙම ඉහත විධානය මගේ git ජීවිතයේ වඩාත්ම ප්‍රයෝජනවත් විධානය වන අතර එය බොහෝ කාලයක් ඉතිරි කර ඇත.

ඔබගේ නව සේවාදායකය වෙත තල්ලු කිරීමට පෙර, මෙම විධානය උත්සාහ කරන්න, එය ස්වයංක්‍රීයව නවතම සේවාදායක වෙනස්කම් සමමුහුර්ත කරනු ඇත (ලබා ගැනීම + ඒකාබද්ධ කිරීම සමඟ) සහ ඔබගේ කැපවීම ඉහළින්ම git ලොගයේ තබයි. අතින් අදින්න / ඒකාබද්ධ කිරීම ගැන කරදර විය යුතු නැත.

විස්තර සොයන්න: http://gitolite.com/git-pull--rebase


18

ඔබ අදින්න වෙනස්කම් ආපසු හැරවීමට ඇති පහසුම ක්‍රමය මෙයයි.

** Warning **

කරුණාකර ඔබගේ වෙනස් කළ ලිපිගොනු උපස්ථ කරන්න, මන්ද එය අලුතින් සාදන ලද ගොනු සහ ෆෝල්ඩර මකා දමනු ඇත .

git reset --hard 9573e3e0

9573e3e0ඔබගේ {commit id} කොහෙද?


මෙම ප්‍රතිචාරය ඉතා ප්‍රයෝජනවත් වේ, මන්ද අපි git pull ප්‍රභව ශාඛාවක් කරන්නේ නම් wi මේ වගේ දෙයක් ලබා ගනී නම් Updating ffce65bd..e929e884, කරන්නgit reset --hard ffce65bd
අර්නෙස්ටෝ අල්ෆොන්සෝ

17

ඔබට කළ හැකිය git reset --hard ORIG_HEAD

"අදින්න" හෝ "ඒකාබද්ධ කිරීම" මඟින් එම ක්‍රියාවන් කිරීමට පෙර ORIG_HEAD වත්මන් තත්වය ලෙස සකසන්න.


5

අහෝසි කිරීමට අවශ්‍ය වීමට වඩාත්ම පොදු හේතුව වන අසාර්ථක ඒකාබද්ධ කිරීමක් තිබේ නම් git pull, ධාවනය git reset --mergeයනු යමෙකු අපේක්ෂා කරන දෙයම කරයි: ලබාගත් ලිපිගොනු තබා ගන්න, නමුත් ඒකාබද්ධ git pullකිරීමට උත්සාහ කළ ඒකාබද්ධ කිරීම අහෝසි කරන්න . git mergeසමහර විට උත්පාදනය වන කැළඹීමකින් තොරව කුමක් කළ යුතු දැයි එවිට කෙනෙකුට තීරණය කළ හැකිය . --hardඅනෙක් සෑම පිළිතුරකම සඳහන් කර ඇති නිශ්චිත බැඳීම් හැඳුනුම්පත සොයා ගැනීමට එයට අවශ්‍ය නොවේ.


3

git pull මෙහෙයුමට පහළින් කරන්න.

මම. git fetch

ii. git merge

අදින්න අහෝසි කිරීමට ඕනෑම මෙහෙයුමක් කරන්න:

මම. git reset --hard --- එය සියළුම දේශීය වෙනස්වීම් ද ආපසු හරවයි

හෝ

ii. git reset --hard master@{5.days.ago} (වැනි 10.minutes.ago, 1.hours.ago, 1.days.ago..) දේශීය වෙනස්කම් ලබා ගැනීමට.

හෝ

iii. git reset --hard commitid

වැඩිදියුණු කිරීම:

ඊළඟ වතාවේ භාවිතා කිරීම git pull --rebaseවෙනුවට git pull.. එහි සමමුහුර්ත සේවාදායකය වෙනස් කිරීමෙන් (ලබා ගැනීම සහ ඒකාබද්ධ කිරීම).

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.