Git හි ශාඛාවකින් කොමිස් මකන්න


3241

බැඳීමක් මකා දැමිය යුතු ආකාරය දැන ගැනීමට මම කැමතියි.

විසින් delete, මම නමකට කළේ නැහැ, මම අනාගතයේ දී තල්ලුව කරන විට, මගේ වෙනස්කම් දුරස්ථ ශාඛාවේ තල්ලු නැහැ නම් එය අදහස්.

මම git help කියවූ අතර, මම භාවිතා කළ යුතු විධානය යැයි සිතමි git reset --hard HEAD. මේක හරිද?


41
ශාඛාවකින් ඕනෑම බැඳීමක් මකා දැමිය යුත්තේ කෙසේදැයි අසන බැවින් මෙය Git undo last commit හි අනුපිටපතක් නොවන බව මම සිතමි . මම හිතන්නේ පිළිතුරක් නොවන ඇත්ත වශයෙන්ම මෙම ප්‍රශ්නයට ආමන්ත්‍රණය කරයි. ඔවුන් සියලු, පසුගිය අනාචාරයේ නැරැඹීමට Rewind නොවන හා ඒ ශක්තියේ ටික කලකට පෙර සිදු වූ තනි නසාගන්නවා. cherry-pickdelete
ක්‍රිස්

12
H ක්‍රිස්, පිළිතුර සමඟ git rebase -i HEAD~10ප්‍රශ්නය ආමන්ත්‍රණය කරයි, මකාදැමීමට අත්තනෝමතික ලෙස තේරීම් කිරීමට එය ඔබට ඉඩ සලසයි. ඔබ ලොගයෙන් ඉවත් කළ කොමිස් නොසලකා හරිමින්, ඔබ එකින් එක සඳහන් කරන පරාසය තුළ ඇති කොමිස් Git අදාළ වේ. මම අද මෙම විධානය භාවිතා කළේ මගේ රෙපෝ සඳහා කළ දෙවන හා තෙවන නවතම කොමිස් ඉවත් කර ගැනීම සඳහා ය. අනෙක් පිළිතුරු කිසිවක් සතුටුදායක නොවන බව මම එකඟ වෙමි.
MST

@MST ඔව්, පිළිගත හැකි පිළිතුරේ විකල්පයන් නොවන බව මා පැවසිය යුතුව තිබුනි, නමුත් ඔබ හරියටම හරි - එම විධානය ක්‍රියාත්මක වන බව පෙනේ
ක්‍රිස්

Answers:


4139

ප්‍රවේශම් වන්න: git reset --hard ඔබේ සේවා නාමාවලි වෙනස්කම් මකා දමනු ඇත. මෙම විධානය ක්‍රියාත්මක කිරීමට පෙර ඔබට තබා ගැනීමට අවශ්‍ය ඕනෑම දේශීය වෙනස්කමක් කිරීමට වග බලා ගන්න .

ඔබ එම කැපවීම මත වාඩි වී සිටින බව උපකල්පනය කළහොත්, මෙම විධානය එය විනාශ කරනු ඇත ...

git reset --hard HEAD~1

මෙම HEAD~1හිස පෙර සිදු වේ.

නැතහොත්, ඔබට ප්‍රතිදානය දෙස බැලීමට, ඔබට git logඋපස්ථ කිරීමට අවශ්‍ය කැපවීමේ හැඳුනුම්පත සොයා ගැනීමට, පසුව මෙය කරන්න:

git reset --hard <sha1-commit-id>

ඔබ දැනටමත් එය තල්ලු කර ඇත්නම්, එයින් මිදීමට ඔබට බල තල්ලුවක් කිරීමට අවශ්‍ය වනු ඇත ...

git push origin HEAD --force

කෙසේ වෙතත් , අනෙක් අය එය ඇදගෙන ඇත්නම්, ඔබ නව ශාඛාවක් ආරම්භ කිරීමට වඩා හොඳ වනු ඇත. ඔවුන් අදින විට, එය එය ඔවුන්ගේ කාර්යයට ඒකාබද්ධ කරන අතර, ඔබ එය නැවත ඉහළට තල්ලු කරනු ඇත.

ඔබ දැනටමත් තල්ලු කර ඇත්නම් git revert, වෙනස්කම් අහෝසි කරන "දර්පණ රූපයක්" කැප කිරීම භාවිතා කිරීම වඩා හොඳ විය හැකිය . කෙසේ වෙතත්, කොමිස් දෙකම ලොගයේ ඇත.


FYI - git reset --hard HEADඔබට වැඩ වලින් ඉවත් වීමට අවශ්‍ය නම් විශිෂ්ටයි. එය ඔබව නැවත නවතම කැපවීම වෙත යලි සකසනු ඇති අතර ඔබේ වැඩ කරන ගසෙහි සහ දර්ශකයේ ඇති සියලුම වෙනස්කම් මකා දමනු ඇත.


අවසාන වශයෙන්, ඔබ "මකා දැමූ" බැඳීමක් සොයා ගැනීමට අවශ්‍ය නම්, git reflogඔබේ ගබඩාව කුණු එකතු නොකළහොත් එය සාමාන්‍යයෙන් පවතී .


59
HEAD~1නැත්නම් නිකම්ම HEAD^. ඔබ තල්ලු කළේ නම්, git revertඒ වෙනුවට භාවිතා කළ යුතුය .
ජකුබ් නාරබ්ස්කි

13
නිසැකවම ඔබට ඔබේ හිසෙන් HEAD~n"ආපසු යන්න" භාවිතා කළ හැකිය n. සමහර විට මෙතැන් සිට ඔබට => වැඩ මකාදැමීම ... --hard HEADලෙස අර්ථ දැක්විය හැකිය HEAD~0.
nuala

13
am beamrider9 imho git rebase යනු සෑම විටම පාහේ කොමිස් මකා දැමීමට වඩා හොඳ ක්‍රමයයි (ග්‍රෙග් හෙව්ගිල්ගේ පිළිතුරෙහි විස්තර කර ඇති පරිදි) - අවම වශයෙන් ප්‍රතික්ෂේප කිරීම ඇත්ත වශයෙන්ම ඔබ 4realz දේවල් මකා දමන බවට විශාල අනතුරු ඇඟවීමක් ඇතුළත් කර ඇති නිසා නොවේ.
නෝවා සුස්මාන්

20
මෙය කැපවීමේ ගසෙහි වෙනස්කම් මකා නොදමනු ඇත. OP දැනටමත් කළ කැපවීමක් ඉල්ලා සිටියේය. ඔබ reset --hard, සහ පරීක්ෂා කර බැලුවහොත් , log --oneline --allකොමිස් තවමත් ගසෙහි පවතී. ගසෙන් මෙම කොමිස් අපි මකා දමන්නේ කෙසේද? ස්තූතියි.
iGbanam

17
reset --softවැඩ කටයුතු ආපසු හැරවීමකින් තොරව දේශීය බැඳීම මකා දැමීමට භාවිතා කරන්න!

707

ඔබ තවමත් කැපවීම කොතැනකටවත් තල්ලු කර නොමැති නම්, git rebase -iඑම කැපවීම ඉවත් කිරීමට ඔබට භාවිතා කළ හැකිය . පළමුව, එම කැපවීම කොතරම් දුරට (දළ වශයෙන්) දැයි සොයා ගන්න. ඉන්පසු කරන්න:

git rebase -i HEAD~N

මෙම ~Nමාර්ගයෙන් පසුගිය rebase Nඅනාචාරයේ ( Nඋදාහරණයක් ලෙස අංකය, විය යුතුය HEAD~10). ඉන්පසුව, වරදකාරී වරද ඉවත් කිරීම සඳහා ඔබට Git විසින් ඉදිරිපත් කරන ගොනුව සංස්කරණය කළ හැකිය. එම ගොනුව සුරකින විට, ඔබ විසින් මකා දැමූ ගොනුව නොපවතින ලෙස Git පහත සඳහන් සියලු කටයුතු නැවත ලියයි.

පින්තූර සහ උදාහරණ සමඟ නැවත ප්‍රතිස්ථාපනය කිරීම පිළිබඳ හොඳ කොටසක් Git පොතෙහි ඇත .

ඔබ යමක් වෙනස් නම් නිසා, මෙම වුවත් සමග ප්රවේශම් වන්න ඇති වෙනත් තැන්වල තල්ලු තවත් ප්රවේශය ඔබ බලය තල්ලුව කරන්න සැලසුම් කරන්නේ නම් මිස අවශ්ය වනු ඇත.


2
සටහන: ඔබට එම අවසාන කණ්ඩායමෙහි කිසියම් --no-ff ඒකාබද්ධ කිරීමක් සිදුවුවහොත්, ප්‍රතිප්‍රහාරය ඔවුන්ව කපා දමනු ඇත :( මෙය මෙම පිටුවේ -p යටතේ සඳහන් කර ඇත . ගැටළුව වන්නේ ඔබ -i වෙනුවට -p වෙනුවට නම්, "මෙම කැපවීම සංස්කරණය කරන්න, එය එක දිගට හරවන්න" යනාදිය සඳහා වන තේරීම් සමඟ ඔබට තවදුරටත් උත්පතන ලබා ගත නොහැක. විසඳුම කිසිවෙකු දන්නවාද?
බුකොව්

4
ඔබ එය තල්ලු කර ඇත්නම් කුමක් කළ යුතුද? (මා දුරස්ථ repo භාවිතා කරමින්)
කොස්ටා

6
Ost කොස්ටා ඔබට push -fතල්ලු කිරීමට බල කිරීමට සහ දුරස්ථ ශාඛාව ඔබේ දේශීය එක සමඟ ප්‍රතිස්ථාපනය කිරීමට භාවිතා කළ හැකිය . එය ඔබේම දුරස්ථ ගබඩාවක් නම්, ගැටළුවක් නැත. මේ අතරේ වෙනත් අයෙකු ලබාගෙන තිබේ නම් කරදරය ආරම්භ වේ.
ග්‍රෙග් හෙව්ගිල්

3
මම GitHub ට වඩා විශාල දත්ත ගොනුවක් එකතු කර කැප කළෙමි (ඔව්, එය කෙසේ හෝ මූලාශ්‍ර ගබඩාවේ නොතිබිය යුතුය; ඔහ් හොඳයි). මම තල්ලු කිරීමට උත්සාහ කළ විට, GitHub එය විශාල ගොනුව නිසා ප්‍රතික්ෂේප කළේය. මට කිරීමට අවශ්‍ය වූයේ මෙම එක් කැපවීමක් අහෝසි කිරීම පමණි. මෙම git rebase -i HEAD~5විධානය විය හරියටම මම මේ මගේ ප්රාදේශීය ණයකට සිට සිදු සම්පූර්ණයෙන්ම ඉවත් කිරීම සඳහා අවශ්ය දේ! ස්තූතියි!
ඇල්ඩෝ

4
umbdumbledad: rebase -iමකාදැමූ බැඳීමට අනුරූප වෙනස්කම් සංරක්ෂණය නොකෙරේ.
ග්‍රෙග් හෙව්ගිල්

518

තවත් හැකියාවක් මගේ පුද්ගලික ප්‍රියතම විධානයන්ගෙන් එකකි:

git rebase -i <commit>~1

මෙය -iඔබට පහර දීමට අවශ්‍ය කැපවීමට මොහොතකට පෙර අන්තර්ක්‍රියාකාරී ආකාරයෙන් ප්‍රතිප්‍රහාරය ආරම්භ කරනු ඇත . එතැන් සිට සංස්කාරක විසින් ලැයිස්තුගත කිරීම ආරම්භ කරනු ඇත. ගොනුව මකා දැමීමට සහ සුරැකීමට ඔබට අවශ්‍ය බැඳීම අඩංගු පේළිය මකන්න. රීබේස් විසින් ඉතිරි කාර්යයන් සිදු කරනු ඇත, එම කැපවීම පමණක් මකාදැමීම සහ අනෙක් සියල්ලම නැවත ලොගයට ඇතුල් කිරීම.


3
thx, btw ඔබට කිසියම් ගැටළුවක් ඇති වුවහොත් (හිස් git rebase --continue
කොමිස්

8
ඊටත් වඩා පහසුයි: git rebase -i HEAD~1
mmell

2
වවුසර්. git rebase -i HEAD~1ඇත්තටම repo එක ගොඩක් පිරිසිදු කළා! එය කළ දේ හරියටම පැවසීම දුෂ්කර ය, නමුත් මුළු දෙයම ඉතා පිළිවෙලට පෙනේ. ටිකක් තැතිගන්වන, ඇත්ත වශයෙන්ම.
චාල්ස් වුඩ්

7
මම හිතන්නේ බැඳීම මකා දමා නැති බවත් හුදෙක් ලැයිස්තුවෙන් ඉවත් කර ඇති බවත් සඳහන් කිරීම වටී. ඔබ අවුල් වුවහොත්, ඔබට reflog භාවිතා කර බැඳීම නැවත ලබා ගත හැකිය .
Zaz

7
රේඛාව මකා දැමීම d / drop වලට සමානද?
ලියෝ

347

මම මෙම පිළිතුර එකතු කරන්නේ දැන් වැඩ කිරීමට උත්සාහ කර ඇති ඕනෑම කෙනෙකුට Git භාවිතා කරන යම් අත්වැරැද්දක් නිසා එම සියලු කාර්යයන් මකා දැමීමට අවශ්‍ය වන්නේ මන්දැයි මා නොදකින බැවිනි!

ඔබට ඔබේ වැඩ කටයුතු කරගෙන යාමට අවශ්‍ය නම් සහ එම විධානය 'අහෝසි කරන්න' (repo වෙත තල්ලු කිරීමට පෙර ඔබ අල්ලා ගත්තේය):

git reset --soft HEAD~1

අවසාන කැපවීමේ සිට ක්‍රියාත්මක වෙමින් පවතින ඔබගේ වැඩ කටයුතු විනාශ කිරීමට ඔබට අවශ්‍ය නම් මිස --hard ධජය භාවිතා නොකරන්න .


5
ඇයිද යන්න පිළිබඳ උදාහරණයක් මෙන්න: ඔබ කරන සංවර්ධන සේවාදායකයක ඔබ කුඩා වැඩ කොටසක් කරයි. එවිට එම සේවාදායකයට පිටතට යන HTTPS ප්‍රවේශය නොමැති බව පෙනේ, එබැවින් ඔබට කැපවීම කොතැනකටවත් තල්ලු කළ නොහැක. එය කිසි විටෙකත් සිදු නොවූ බව මවා පෑමට පහසු වන අතර ඔබේ දේශීය යන්ත්‍රයෙන් පැච් එක නැවත කරන්න.
ස්ටීව් බෙනට්

1
Arth කාර්තික්බොස් සැමවිටම පරාවර්තනය වනු ඇත. පසුව පවා git reset --hard HEAD~1ඔබගේ පෙර නවතම (ඔබ එය කල් ඉකුත් වන තෙක්) reflog හරහා ලබා ගත හැකි වනු ඇත සිදු; මෙහි ද බලන්න: gitready.com/intermediate/2009/02/09/…
කේතනය කිරීම

4
ස්තූතියි. මෙම පිළිතුර ඉහළ ශ්‍රේණිගත කිරීමක් හෝ පිළිගත් පිළිතුරට ඇතුළත් කළ යුතුය. බැඳීමක් මකා දැමීම! = බැඳීමක් ආපසු හැරවීම.
ඇල්සෙන්ඩේ

2
AndRandolphCarter: ඔබට තවමත් නොගැලපෙන වෙනස්කම් අහිමි වනු ඇත.
naught101

7
Ob රොබ්, එක් උදාහරණයක් නම්, ඔබ කිසි විටෙකත් මූලාශ්‍ර පාලනයට යටත් නොවිය යුතු රහසක් (උදා: මුරපදයක්) අඩංගු ගොනුවක් වැරදීමකින් කළ විට ය. අවලංගු කිරීම පමණක් නොව, දේශීය බැඳීම විනාශ කළ යුතුය , එබැවින් එය කිසි විටෙකත් සේවාදායකයට තල්ලු නොවනු ඇත.
බොබ් මේයර්ස්

143

සම්පූර්ණ කැපවීමක් ඉවත් කිරීම

git rebase -p --onto SHA^ SHA

නිසැකවම ඔබට ඉවත් කිරීමට අවශ්‍ය යොමුව සමඟ "SHA" ආදේශ කරන්න. එම විධානයෙහි ඇති "^" වචනානුසාරයෙන් වේ.

http://sethrobertson.github.io/GitFixUm/fixup.html#change_deep


26
මම මෙම පිළිතුර තවත් උච්චාරණය කරන්නේ කෙසේද ??? අනෙක් විසඳුම් හුදෙක් එය අන්තර්ක්‍රියාකාරීව කරන්නේ කෙසේද යන්න හෝ ඉහළ කොමිස් ඉවත් කරන්නේ කෙසේද යන්න පෙන්වයි.
රිබමර්

5
-p, --preserve-merges ඒකාබද්ධ කිරීමේ බැඳීම් හඳුන්වා දීමෙන් නැවත සමතලා කිරීම මගින් ඉතිහාසය සමතලා කිරීම වෙනුවට ඒකාබද්ධ කිරීමේ කොමිස් නැවත සාදන්න. ඒකාබද්ධ කිරීමේ ගැටුම් නිරාකරණ හෝ ඒකාබද්ධ කිරීමේ සංශෝධන සංරක්ෂණය නොකෙරේ.
raittes

5
මෙය සත්‍ය නිවැරදි පිළිතුරයි
හමන් සැමුවෙල්

9
එහි සඳහන් වන්නේ, “ඔබට ඉවත් කිරීමට අවශ්‍ය යොමුව සමඟ SHA වෙනුවට ආදේශ කරන්න” නමුත් පේළියේ SHA එහි දෙවරක් ඇත. මෙන්න මම කළ දේ. git rebase -p --onto 5ca8832c120 ^ 5ca8832c120 නමුත් කිසිවක් වෙනස් වී නැත. මම එකම SHA දෙවරක් භාවිතා කළ යුතුද? එසේ නොවේ නම්, ඉවත් කළ යුතු SHA යනු කුමක්ද සහ අනෙක් SHA කුමක් විය යුතුද?
රුබික්ස්මන්

3
ඇවැත්නි, එය දෝෂ රහිතව ක්‍රියාත්මක විය! මෙය පිළිගත් පිළිතුර විය යුතුය!
ලිරාන් එච්

51

නවතම වෙනස්කම් ඉවත් කිරීම සඳහා ඔබ වෙනස්කම් ප්‍රකාශයට පත් නොකළේ නම්, ඔබට එය කළ හැකිය

$ git reset --hard HEAD^

(මෙය සියලු නොගැලපෙන වෙනස්කම් ද ඉවත් කරන බව සලකන්න; ප්‍රවේශමෙන් භාවිතා කරන්න).

මකා දැමිය යුතු බැඳීම ඔබ දැනටමත් ප්‍රකාශයට පත් කර ඇත්නම්, git revert භාවිතා කරන්න

$ git revert HEAD

එය ක්‍රියාත්මක වූයේ නැත. මම ල log ු-සටහනක් දැමූ විට, සෑම දෙයක්ම තවමත් පවතී, මා එය කරන්නේ ඇයිද යන්න වැඩි වැඩියෙන් එකතු කරයි. මට ඉතිහාසය පිරිසිදු කිරීමට අවශ්‍යයි.
කොස්ටා

Ost කොස්ටා: වැඩ නොකළේ කුමක්ද (එනම් ඔබ භාවිතා කළේ කුමන අනුවාදයද), සහ ඔබ ලොග් ලබාගත්තේ කෙසේද?
ජකුබ් නාරබ්ස්කි

මම මේ ප්‍රශ්නෝත්තරයේ සෑම දෙයක්ම පාහේ උත්සාහ කර ඇත්තෙමි. (මම මෑතකදී git revert HEAD උත්සාහ කළෙමි) මගේ git log:tree = log --all --graph --format=format:'%C(bold blue)%h%C(reset) %C(dim black)%s%C(reset)%C(bold red)%d%C(reset) %C(green)by %an, %ar%C(reset)'
කොස්ටා

1
මට අවශ්‍ය වන්නේ කොමිස් මකා දැමීමට ය (ඒවා කිසි විටෙකත් නොතිබුණි වැනි). මම නව කොමිස් කිහිපයක් සමඟ අමුතු කේතීකරණ ත්‍රාසජනක ගමනක් ගිය අතර ඒ සියල්ල කුණු කූඩයට වැටුණි. මගේ git ලොගයෙන් ඒවා මකා දැමිය හැක්කේ කෙසේද?
කොස්ටා

2
ශුද්ධ වූ කපටිකමක් මායාකාරී ලෙස මට අවශ්‍ය දේ කළා .... ඒ කුමන විධානයන් එය කළේ? !!?!
කොස්ටා

45

අපට 2 සහ 4 කොමිස් ඉවත් කිරීමට අවශ්‍ය බව පවසන්න.

commit 0 : b3d92c5
commit 1 : 2c6a45b
commit 2 : <any_hash>
commit 3 : 77b9b82
commit 4 : <any_hash>

සටහන: ඔබ භාවිතා කරන බැවින් --hardසහ රෙපෝවට වඩා පරිපාලක අයිතිවාසිකම් තිබිය යුතුය-f .

  • git checkout b3d92c5 අවසන් වරට භාවිතා කළ හැකි බැඳීම පරීක්ෂා කරන්න.
  • git checkout -b repair වැඩ කිරීමට නව ශාඛාවක් සාදන්න.
  • git cherry-pick 77b9b82 කැපවීම 3 හරහා ධාවනය කරන්න.
  • git cherry-pick 2c6a45b කැපවීම 1 හරහා ධාවනය කරන්න.
  • git checkout master පිටවීමේ මාස්ටර්.
  • git reset --hard b3d92c5 අවසන් වරට භාවිතා කළ හැකි කැපවීම සඳහා මාස්ටර් නැවත සකසන්න.
  • git merge repair අපගේ නව ශාඛාව මාස්ටර් සමඟ ඒකාබද්ධ කරන්න.
  • git push -f origin master දුරස්ථ repo වෙත මාස්ටර් තල්ලු කරන්න.

1
අවසාන පියවර විය යුතුය git push -f origin masterවිකල්පයක් නැත--hard
Vivex

2
මම හිතන්නේ commit 0ඊට වඩා වයසයි commit 1. ඇයි පළමු හරහා ලකුණු ඔයා මට කියන්න පුළුවන් commit 3(චෙරි-පික් විසින්) සහ ඒ වන විට commit 1? ක පුරාවටම පසු b3d92cd( commit 0) මම චෙරි-තෝරාගන්න බලාපොරොත්තු commit 1පසුව, commit 3. ස්තූතියි.
ජරෙක් සී

AreJarekC මම හිතන්නේ ඉහළම වැරැද්ද මෙහි ඇති නවතම කැපවීමයි, මට යම්කිසි වැරැද්දක්
නොපෙනේ නම්

42
git reset --hard commitId

git push <origin> <branch> --force

PS: commitId යන්නෙන් අදහස් කරන්නේ ඔබට නැවත ආපසු යාමට අවශ්‍ය දෙයයි


git push --force <origin> <branchName>. ශාඛා නම සඳහන් නොකර එය දුරස්ථව ඇති සියලුම ගොනු වෙනස් කළ හැකිය.
sheelpriy

39

ඉතිහාසය බලහත්කාරයෙන් වෙනස් කරන්න

ඔබට අන්තිම බැඳීම මකා දැමීමට අවශ්‍ය නැතැයි උපකල්පනය කරන්න, නමුත් ඔබට අවසාන n කොමිස් වල නිශ්චිත කොමිස් මකා දැමීමට අවශ්‍ය නම්, සමඟ යන්න:

git rebase -i HEAD~<number of commits to go back>, එබැවින් git rebase -i HEAD~5ඔබට අවසාන කොමිස පහ බැලීමට අවශ්‍ය නම්.

එවිට පාඨ සකසනයක් වෙනස් යන වචනය pickසඳහා dropසෑම ලබන ඔබ ඉවත් කිරීමට කැමති නසාගන්නවා. සංස්කාරකය සුරකින්න සහ ඉවත් වන්න. වොයිලා!

ආකලන ලෙස ඉතිහාසය වෙනස් කරන්න

උත්සාහ කරන්න git revert <commit hash>. ප්‍රතිවර්තනය මඟින් නිශ්චිත බැඳීම අහෝසි කරන නව බැඳීමක් නිර්මාණය වේ.


dropමූල පදය අර්ථ දක්වා නැත. බැඳීමක් මකා දැමීමට මුළු පේළියම ඉවත් කරන්න.
ෂයාන් සලේහියන්

1
මට බිංදුව යනු මූලික පදයක් ලෙස අර්ථ දක්වා ඇත, නමුත් බිංදුවක් කිරීමෙන් ඉතිහාසයෙන් බැඳීම ඉවත් වන බවක් නොපෙනුණි. කෙසේ වෙතත් අන්තර්ක්‍රියාකාරී ප්‍රතිප්‍රහාරයෙන් රේඛාව ඉවත් කිරීම.
ඇඩම් පාකින්

මට අවශ්‍ය වූයේ මෙයයි. විශිෂ්ටයි; ස්තූතියි!
diekunstderfuge

30

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

git reset HEAD~1

ගොනුව වේදිකා ගත කළ git add විධාන එකතු කිරීමට පෙර මෙය ඔබගේ ගබඩාව එහි තත්වයට ගෙන එනු ඇත. ඔබගේ වෙනස්කම් ඔබගේ වැඩ කරන නාමාවලියෙහි ඇත. HEAD ~ 1 යන්නෙන් අදහස් කරන්නේ ශාඛාවේ වත්මන් අගයට පහළින් ඇති බැඳීමයි.

ඔබට N කොමිස් ඉවත් කිරීමට අවශ්‍ය නම්, නමුත් ඔබේ වැඩ කරන නාමාවලියෙහි කේත වෙනස්කම් තබා ගන්න:

git reset HEAD~N

ඔබගේ නවතම බැඳීමෙන් මිදීමට ඔබට අවශ්‍ය නම්, සහ කේත වෙනස්වීම් තබා ගැනීමට ඔබට අවශ්‍ය නැතිනම්, ඔබට “දැඩි” යළි පිහිටුවීමක් කළ හැකිය.

git reset --hard HEAD~1

ඒ හා සමානව, ඔබට අවසාන එන් කොමිස් ඉවත දැමීමට අවශ්‍ය නම් සහ කේත වෙනස්වීම් තබා ගැනීමට අවශ්‍ය නොවන්නේ නම්:

git reset --hard HEAD~N

22
git rebase -i HEAD~2

මෙන්න '2' යනු ඔබට නැවත ප්‍රතිස්ථාපනය කිරීමට අවශ්‍ය කොමිස් ගණනයි.

'git rebase -i HEAD`

ඔබට සියලු කොමිස් නැවත ලබා දීමට අවශ්‍ය නම්.

එවිට ඔබට මෙම විකල්පයන්ගෙන් එකක් තෝරා ගැනීමට හැකි වනු ඇත.

p, pick = use commit

r, reword = use commit, but edit the commit message

e, edit = use commit, but stop for amending

s, squash = use commit, but meld into previous commit

f, fixup = like "squash", but discard this commit's log message

x, exec = run command (the rest of the line) using shell

d, drop = remove commit

මෙම රේඛා නැවත ඇණවුම් කළ හැකිය; ඒවා ඉහළ සිට පහළට ක්‍රියාත්මක වේ. ඔබ මෙහි පේළියක් ඉවත් කළහොත් එය අහිමි වනු ඇත. කෙසේ වෙතත්, ඔබ සියල්ල ඉවත් කළහොත්, නැවත ගෙවීම අහෝසි වේ. හිස් කොමිස් අදහස් දක්වා ඇති බව සලකන්න

"D" විකල්පය භාවිතා කිරීමෙන් හෝ ඔබේ බැඳීම ඇති රේඛාවක් ඉවත් කිරීමෙන් ඔබට එම බැඳීම ඉවත් කළ හැකිය.


නවතම git අනුවාදයේ තවත් විකල්පයක් නොමැත d . ඔබට අවශ්‍ය වන්නේ ඒවා මකාදැමීම සඳහා කොමිස් සහිත රේඛා ඉවත් කිරීමයි.
ඔලෙග් අබ්රාෂෙව්

17

දේශීය ශාඛාවේ මකා දැමීමට, භාවිතා කරන්න

git reset --hard HEAD~1

දුරස්ථ ශාඛාවක මකා දැමීමට, භාවිතා කරන්න

git push origin HEAD --force

13

[ඉක්මන් පිළිතුර]

ඔබට විකල්ප බොහොමයක් ඇත, උදාහරණයක් ලෙස:

  • විකල්ප 1:

    git rebase -i <YourCommitId>~1
    

    ඔබට නැවත ආපසු යාමට අවශ්‍ය බැඳීම් ගණන සඳහා YourCommitId වෙනස් කරන්න.

  • විකල්ප 2:

    git reset --hard YourCommitId
    git push <origin> <branch> --force
    

    ඔබට නැවත ආපසු යාමට අවශ්‍ය බැඳීම් ගණන සඳහා YourCommitId වෙනස් කරන්න.

    මම ඔබට මෙම විකල්පය නිර්දේශ නොකරන්නේ ඔබට ඔබගේ වැඩ කටයුතු කරගෙන යා හැකි බැවිනි.

  • විකල්ප 3:

    git reset --soft HEAD~1
    

    ඔබට ඔබේ වැඩ කටයුතු කරගෙන යා හැකි අතර බැඳීම අහෝසි කරන්න.


thankyou thankyou thankyou thankyou (Y)
හබීබ් රෙහ්මාන්

11

මුලාශ්‍රය: https://gist.github.com/sagarjethi/c07723b2f4fa74ad8bdf229166cf79d8

අන්තිම බැඳීම මකන්න

උදාහරණයක් ලෙස ඔබේ අවසාන කැපවීම

git push origin + aa61ab32 ^: මාස්ටර්

දැන් ඔබට මෙම බැඳීම මකා දැමීමට අවශ්‍ය වන අතර පසුව පහත දැක්වෙන දේ කිරීමට පහසු ක්‍රමයකි

පියවර

  1. පළමුවෙන්ම ශාඛාව වත්මන් කැපවීමේ මවුපියන්ට නැවත සකසන්න

  2. එය දුරස්ථයට තල්ලු කරන්න.

git reset HEAD^ --hard

git push origin -f

විශේෂ කැපවීමක් සඳහා, ඔබට නැවත සැකසීමට අවශ්‍ය වන්නේ පහත දැක්වේ

git reset bb676878^ --hard

git push origin -f

9

මෙය කිරීමට තවත් ක්‍රමයක් මෙන්න:

ඔබට ආපසු හැරවීමට අවශ්‍ය ශාඛාව පරීක්ෂා කර, දුරස්ථ සේවාදායකයේ නවතම එක වීමට ඔබට අවශ්‍ය බවට වූ කැපවීම වෙත ඔබේ දේශීය වැඩ පිටපත නැවත සකසන්න (එය පසු වූ සියල්ල අතුරුදහන් වනු ඇත). මෙය සිදු කිරීම සඳහා, SourceTree හි මම දකුණු-ක්ලික් කර තෝරාගත් "මෙම බැඳීමට බ්‍රැන්චේම් නැවත සකසන්න". මම හිතන්නේ විධාන රේඛාව:

git reset --hard COMMIT_ID

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

ඉන්පසු ඔබේ ගබඩාවේ දේශීය නාමාවලිය වෙත ගොස් මෙම විධානය ක්‍රියාත්මක කරන්න:

git -c diff.mnemonicprefix=false -c core.quotepath=false \
push -v -f --tags REPOSITORY_NAME BRANCHNAME:BRANCHNAME

මෙය ඔබගේ දේශීය ගබඩාවේ වර්තමාන එකෙන් පසුව සිදුකරන සියලු කොමිස් මකා දමනු ඇති නමුත් එම එක් ශාඛාවක් සඳහා පමණි.


9

වැරැද්ද:

මම git rebase -i --rootමගේ ශාඛාව සංස්කරණය කළෙමි, මාස්ටර්ට වඩා වෙනස් වූ පළමු කැපවීම මට නැවත කිව හැකි යැයි නොදැන ( වින්ඩෝස් පෙරනිමි දසුන සඳහා වන GitHub යනු මාස්ටර් සමඟ සැසඳීම, එය සම්පූර්ණයෙන්ම සැඟවීම).

මම සිලිකන් නිම්න රැවුලක් වැඩුණු අතර 900+ කොමිස් සබ්ලයිම් තුළට පටවා ඇත. කිසිදු වෙනසක් නොමැතිව පිටව යන මම, මගේ බැටරිය ආරෝපණය කර රැවුල බෑමට පටන් ගත්තෙමි, මන්දයත් 900+ ක් පමණ තනි තනිවම ප්‍රතිචක්‍රීකරණය කර ඇති අතර ඔවුන්ගේ කැපවීම් කාලය නැවත සකස් කර ඇත.

Git පරාජය කිරීමට සහ මුල් කාලය ආරක්ෂා කිරීමට අධිෂ් ined ාන කරගෙන, මම මෙම දේශීය ගබඩාව මකා දමා දුරස්ථයෙන් නැවත ක්ලෝන කළෙමි.

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

විකල්පයන් අවසන් කිරීම:

මම කැමති වූයේ නැත git revert- එය අතිරේක කැපවීමක් ඇති කරයි, එය Git ට ඉහළින් ලබා දෙයි.

git reset --hard HEADreflogඅන්තිම සහ එකම පරීක්ෂා කිරීමෙන් පසුව කිසිවක් කළේ නැතHEAD ක්ලෝනය - Git ජය ගනී.

නවතම SHA ලබා ගැනීම සඳහා, මම github.com හි දුරස්ථ ගබඩාව පරීක්ෂා කළෙමි - සුළු ජයග්‍රහණය.

සිතීමෙන් පසු git reset --hard <SHA>වැඩ , මම තවත් ශාඛාවක් මාස්ටර් වෙත යාවත්කාලීන කළ අතර 1 ... 2 ... පූෆ්! බැඳීම නැවත පැමිණියේය - Git ජය ගනී.

මාස්ටර් වෙත නැවත පරීක්ෂා කිරීම, උත්සාහ කිරීමට කාලය git rebase -i <SHA>, පසුව රේඛාව ඉවත් කරන්න ... කිසිදු ප්‍රයෝජනයක් නැත, කීමට කණගාටුයි. " ඔබ මෙහි රේඛාවක් ඉවත් කළහොත් එය අහිමි වනු ඇත ". Ah ... නව ලක්ෂණයක් යටගොස් ඇති n00b අධ්යාපනයකුත් නැහැ තුළ 2.8.3 නිදහස් සටහන් .

විසඳුම:

git rebase -i <SHA> එවිට d, drop = remove commit .

සත්‍යාපනය සඳහා, මම වෙනත් ශාඛාවකට ගියෙමි, සහ වොයිලා - ස්වාමියාගෙන් ලබා ගැනීමට / අදින්නට කිසිදු සැඟවීමක් නැත.

https://twitter.com/holman/status/706006896273063936

ඔබට සුබ දවසක්.


8

ඉහත සියළු විධානයන් ඔබගේ වැඩ කිරීමේ ගසෙහි සහ දර්ශකයේ කැපවීම සිදු කිරීමට පෙර තිබූ ආකාරයටම යථා තත්වයට පත් කරයි, නමුත් ගබඩාවේ තත්වය යථා තත්වයට පත් නොකරන්න. ඔබ එය දෙස බැලුවහොත්, "ඉවත් කරන ලද" බැඳීම සැබවින්ම ඉවත් නොකෙරේ, එය හුදෙක් වර්තමාන ශාඛාවේ කෙළවරේ ඇති එක නොවේ.

පෝසිලේන් විධානයන් සමඟ බැඳීමක් ඉවත් කිරීමට ක්‍රමයක් නොමැති බව මම සිතමි . එකම ක්‍රමය වන්නේ එය ලොගයෙන් ඉවත් කර reflog කර ඉන්පසු ක්‍රියාත්මක කිරීමයි git prune --expire -now.


1
StackOverflow හි පිළිතුරු පෙන්වන අනුපිළිවෙල සවි කර නැත. කරුණාකර “ඉහත සියලුම විධානයන්” වෙත යොමු නොවන්න. ඔබේම පිළිතුර ස්වයං අන්තර්ගතයක් බවට පත් කරන්න.
පැස්කල් කියුක්

මෙම පිළිතුර සම්පූර්ණයෙන්ම නිවැරදි නොවේ. git prune ඇත්ත වශයෙන්ම "පෝසිලේන්" විධානයන්ගෙන් එකකි . එසේම, ඔබේ පරාවර්තනය සම්පූර්ණයෙන් ඉවත් කිරීමට ඔබට අවශ්‍ය වන්නේ කලාතුරකිනි (එක් භාවිත අවස්ථාවක් නම් ඔබේ තොරතුරු ගබඩාවෙන් සංවේදී තොරතුරු ඉවත් කිරීමයි, නමුත් මා කීවාක් මෙන් එය දුර්ලභ භාවිත අවස්ථාවකි). බොහෝ විට, ඔබට දත්ත නැවත ලබා ගැනීමට අවශ්‍ය නම්, පරණ කොමිස් පරාවර්තනය තුළ තබා ගැනීමට ඔබට අවශ්‍ය වනු ඇත. Pro Git බලන්න : 9.7 Git අභ්‍යන්තර - නඩත්තු සහ දත්ත ප්‍රතිසාධනය .

8

ඉතිහාසය තබා ගැනීමට ඔබට අවශ්‍ය නම්, කැපවීම සහ ආපසු හැරවීම පෙන්වමින්, ඔබ භාවිතා කළ යුත්තේ:

git revert GIT_COMMIT_HASH

ඔබ ආපසු හැරවීමට හේතුව පැහැදිලි කරමින් පණිවිඩය ඇතුළත් කරන්න, පසුව:

git push  

ඔබ නිකුත් කරන විට git log"වැරදි" කැපවීම සහ ලොග් පණිවිඩ ආපසු හැරවීම යන දෙකම ඔබට පෙනෙනු ඇත.


ඔව්, නමුත් එය ඔවුන්ට අවශ්‍ය නොවන බව OP පැහැදිලි විය.
ස්ටීව් බෙනට්

7

ඔබ ඔබගේ අන්තිම කැපවීම අවුල් කර ඇත්නම් (වැරදි පණිවිඩය, වෙනස්කම් කිහිපයක් එකතු කිරීමට අමතක වී ඇත) සහ එය පොදු ගබඩාවකට තල්ලු කිරීමට පෙර එය නිවැරදි කිරීමට අවශ්‍ය නම් ඇයි භාවිතා නොකරන්නේ:

git commit --amend -m "New message here"

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

ඇත්ත වශයෙන්ම ඔබ බැඳීමක් තල්ලු කළ පසු එය සංශෝධනය කරන්නේ නම්, ඔබ ඉතිහාසය නැවත ලියයි, එබැවින් ඔබ එසේ කරන්නේ නම් එහි ඇඟවුම් තේරුම් ගැනීමට වග බලා ගන්න.

පෙර කැපවීමේ පණිවිඩය භාවිතා කිරීමට ඔබ කැමති නම් '-m' වෙනුවට '--no-edit' විකල්පය ද ඔබට ලබා දිය හැකිය.

ලියකියවිලි: http://git-scm.com/docs/git-commit.html


2
OP ඉල්ලන්නේ එය නොවේ.
ස්ටීව් බෙනට්

5

ඔබ දැනටමත් තල්ලු කර ඇත්නම්, පළමුව ඔබට HEAD ($ GIT_COMMIT_HASH_HERE) හි සිටීමට අවශ්‍ය කැපවීම සොයා ගන්න , ඉන්පසු පහත සඳහන් දෑ ක්‍රියාත්මක කරන්න:

git reset --hard $GIT_COMMIT_HASH_HERE
git push origin HEAD --force

ඉන්පසු එක් එක් ස්ථානය ක්ලෝනය ක්ලෝන කර, ධාවනය කරන්න:

git reset --hard origin/master

5

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

git reset --hard HEAD~1

git push -f origin

මෙම උපකාරය බලාපොරොත්තු වේ


5

මම දැනටමත් තල්ලු කර ඇත. සමහර කොමිස් දුරස්ථව ආපසු ලබා දිය යුතුය. යන බොහෝ වෙනස්කම් උත්සාහ, නමුත් මෙම සිට ජස්ටින් GIT පඳුර හරහා මට දඩ වැඩ:

git reset --hard $GIT_COMMIT_HASH_HERE
git push origin HEAD --force

4

දේශීය ශාඛාව මත නැවත සකසන්න

git reset --hard HEAD~<Number of commit> So git reset --hard HEAD~3

බලයට තල්ලු කිරීම ආරම්භයට

git push -f origin

3

තාවකාලික ෆෝල්ඩරයට ඔබේ කේතයේ උපස්ථය ගන්න. පහත දැක්වෙන විධානය සේවාදායකය ලෙසම යලි සකසනු ඇත.

git reset --hard HEAD
git clean -f
git pull

ඔබගේ වෙනස්කම් තබා ගැනීමට ඔබට අවශ්‍ය නම්, සහ මෑත කාලීන කැපවීම් ඉවත් කරන්න

git reset --soft HEAD^
git pull


2

දේශීය බැඳීම මකන්න

ඉහත රූපයේ ඔබට දැකිය හැකි පරිදි, "පරීක්ෂණ වෙනස් කිරීම 2" කැපීම මකා දැමීමට මට අවශ්‍යය (SHA1 ID: 015b5220c50e3dfbb1063f23789d92ae1d3481a2 ( gitkgit bash හි විධානය භාවිතා කිරීමෙන් ඔබට SHA1 ID ලබා ගත හැකිය ).

ඒ සඳහා මට භාවිතා කළ හැකිය (පහත දැක්වෙන විධානයන් දේශීයව පමණක් ක්‍රියාත්මක වේ. මකා දැමීමෙන් පසු ඔබ තල්ලු කළ යුතුය):

  1. git reset --hard 515b5220c50e3dfbb1063f23789d92ae1d3481a2// එය ඔබට එම බැඳීමට උපස්ථ වේ ( පරීක්ෂණ වෙනස් කිරීමේ SHA1 හැඳුනුම්පත 4 කැපවීම 515b5220c50e3dfbb1063f23789d92ae1d3481a2 )
  2. git reset --hard HEAD~1 // එක් කැපවීමට පෙර එය ඔබට උපස්ථ වේ.
  3. git reset --hard HEAD^ // අවසාන කැපවීම git වෙතින් ඉවත් කිරීම

මකා දැමීමෙන් පසු:

කැපවීම මකා දැමීමෙන් පසු


2

git reset --hard HEAD~1
ඔබ දැන් පෙර සිටිනු ඇත. ශාඛාව අදින්න. නව කේතය තල්ලු කරන්න. බැඳීම git වෙතින් ඉවත් කෙරේ


ඔබ දැනටමත් වෙනස්කම් තල්ලු කර නොමැති නම්. එවැනි අවස්ථාවකදී දෘ reset යළි පිහිටුවීම ඔබගේ දුරස්ථය පිරිසිදු නොකරයි. එවැනි අවස්ථාවකදී නැවත සකස් කිරීම හොඳ විකල්පයයි
c0der512

1

git reset --hard

git push සම්භවය HEAD --force

කොමිස් එකක් හෝ කිහිපයක් ටැග් කර ඇත්නම්, පළමුව ටැගය (ය) මකන්න. එසේ නොමැතිනම් ටැග් කළ බැඳීම ඉවත් නොකෙරේ.


0

git revert https://git-scm.com/docs/git-revert භාවිතා කරන්න .එය සියලු කේත ආපසු හරවනු ඇත, එවිට ඔබට ඊළඟ කැපවීම කළ හැකිය. එවිට හිස අවසාන කැපවීම වෙත යොමු වේ. ආපසු හරවන ලද කොමිස් කිසි විටෙකත් මකා නොදමන නමුත් එය ඔබගේ අවසාන කැපවීමට බලපාන්නේ නැත.


0

මගේ නඩුවේදී, මෙම රූකඩය සඳහා මගේ මැජික් කේතය මෙයයි:

git reset --hard @{u}

එය පරීක්ෂා කර මට කියන්න. මම වෙනස් ඒවා කිහිපයක් උත්සාහ කර ඇත්තෙමි, නමුත් මට උදව් කළ එකම එක මෙයයි.

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.