නොකැඩූ git commits මකා දැමිය හැක්කේ කෙසේද?


993

මම වැරදීමකින් වැරදි ශාඛාවකට බැඳී සිටිමි. එම බැඳීම මකා දැමිය හැක්කේ කෙසේද?

Answers:


1902

ඔබ කළ කාර්යය තබා ගනිමින් නවතම කැපවීම මකන්න:

git reset --soft HEAD~1

ඔබ කළ කාර්යය විනාශ කරමින් නවතම කැපවීම මකන්න :

git reset --hard HEAD~1


137
HEAD ~ 1 කැපවීම බව සහතික කර ගන්න ... ඔබටත් කළ හැකියgit reset --hard origin
ඩෙනයිත්

13
සිතුවිලි git remoteලැයිස්තු මා සඳහා ආරම්භයක් git reset --hard originබව පවසයි fatal: ambiguous argument 'origin': unknown revision or path not in the working tree.. මන්ද?
trss

8
මේක නම් නියමයි. මගේ ජීවිතය බේරුවා.
නින්ජාබෝයි

2
git reset HEAD~1ඔබගේ සියලු වෙනස්කම් ද තබා ගන්නා නමුත් සෑම දෙයක්ම තබා ගැනීමට වඩා හිස් දර්ශකයක් ඔබට ඉතිරි කරනු ඇත ( --softවිකල්පය පරිදි).
හොලොවේ

170

මම සොයාගත් හොඳම පිළිතුර අදහස් දැක්වීම්වල පමණක් ඇත්තේ මන්දැයි මම කල්පනා කරමි! ( ඡන්ද 86 කින් ඩෙනයිත් විසින් )

git reset --hard origin

මෙම විධානය මඟින් දේශීය ගබඩාව දුරස්ථ නිධිය සමඟ සමමුහුර්ත කරනු ඇත. ඔබට මූලාරම්භයේ ඇති නිශ්චිත ශාඛාව ලබා ගැනීම සඳහා පහත සඳහන් දෑ කළ හැකිය.

git reset --hard origin/<branch>

18
මේ සඳහා ස්තුති කළ පැහැදිලි තරමක් පුළුල්: නිශ්චිත ශාඛාව සඳහා:git reset --hard origin/<branch>
Cleary

4
නැතහොත් git reset --soft origin/<branch>, ඔබට කැපවීමෙන් මිදීමට අවශ්‍ය නම්, නමුත් දේශීය වැඩ දිගටම කරගෙන යන්න.
ගංගා අශ්වයා

1
මට ලැබෙනවා fatal: ambiguous argument 'origin': unknown revision or path not in the working tree., ඔබ වැනි ශාඛාව සඳහන් කළ යුතුයි:git reset --hard origin/feature/my-cool-stuff
Kip

1
දීප්තිමත්! මෙය සැබවින්ම ක්‍රියාත්මක වන්නේ “පිළිගත්” පිළිතුර මෙන් නොව හිස ඔසවා ඔබව එල්ලා තබමිනි.
mae

56

එය මකා නොදමන්න: මක්නිසාද යත් එක් කැපවීමක් git cherry-pickපමණක් ප්‍රමාණවත් ය.

ඔබ සිටියා නම් නමුත් කිහිපයක් වැරදි ශාඛා මත අනාචාරයේ බව කොහේ git rebase --ontoබබළන:

ඔබට මෙය ඇතැයි සිතමු:

 x--x--x--x <-- master
           \
            -y--y--m--m <- y branch, with commits which should have been on master

, එවිට ඔබට සලකුණු කිරීමට masterහා ඔබට අවශ්‍ය තැනට ගෙන යා හැකිය:

 git checkout master
 git branch tmp
 git checkout y
 git branch -f master

 x--x--x--x <-- tmp
           \
            -y--y--m--m <- y branch, master branch

, තිබිය යුතු තැන y ශාඛාව නැවත සකසන්න:

 git checkout y
 git reset --hard HEAD~2 # ~1 in your case, 
                         # or ~n, n = number of commits to cancel

 x--x--x--x <-- tmp
           \
            -y--y--m--m <- master branch
                ^
                |
                -- y branch

, අවසානයේදී ඔබේ කොමිස් ගෙනයන්න (ඒවා නැවත අයදුම් කරන්න, ඇත්ත වශයෙන්ම නව කොමිස් සාදයි)

 git rebase --onto tmp y master
 git branch -D tmp


 x--x--x--x--m'--m' <-- master
           \
            -y--y <- y branch

අවාසනාවකට මෙන්, එය ප්රශ්නය නොවේ.
කටාරියා

1
At කැටාරියාඒ එය වැරදි ශාඛාවක් මත සිදුකරන ලද කැපවීම මකාදැමීම සඳහා වලංගු විකල්පයක් වන අතර එම තත්වයේම අනෙක් අයට උපකාර කරනු ඇත (වැරදි ශාඛාව මත යහපත් කැපවීම).
VonC

14

කිසිවක් කරන්න git rebase -i FAR_ENOUGH_BACKසහ ඔබ කැමති නැහැ මේ සිදු කිරීම සඳහා වන රේඛාව බස්සනවා.


6

ඔබට එම බැඳීම වෙනත් ශාඛාවකට ගෙනයාමට අවශ්‍ය නම්, එම බැඳීම පිළිබඳ SHA එක ලබා ගන්න

git rev-parse HEAD

ඉන්පසු වත්මන් ශාඛාව මාරු කරන්න

git checkout other-branch

සහ cherry-pickකැපවීමother-branch

git cherry-pick <sha-of-the-commit>

මගේ අත්දැකීම් අනුව, මෙය මුල් ශාඛාවෙන් කළ කැපවීම අහෝසි නොකරන අතර එමඟින් git reset --hard HEAD~1පසුව අවශ්‍ය වේ. මම හිතන්නේ reset --softඑවකට ශාඛා මාරු කර නැවත වැඩ කිරීමෙන් අමතර වැඩ ඉතිරි වනු ඇත. මගේ මූලික දේවල් බොහොමයක් කිරීමට මම නැවතත් SourceTree භාවිතා කරමින් සිටියෙමි, මගේ දෝෂයෙන් පසුව මෙය සමඟ රේඛා-විධාන කරන්න.
ජුසෝපි

4

පහත දැක්වෙන විධානය මා වෙනුවෙන් වැඩ කර ඇති අතර, දේශීය කැපවීම් සියල්ලම අතහැර දමා දේශීය දුරස්ථ සම්භවයක් / ප්‍රධාන ශාඛාවක් ලෙස නැවත සකසනු ලැබේ.

git reset --hard සම්භවය


1
මෙය නිවැරදි පිළිතුරයි.
ටොබියාස් කුඩ්නික්

3

ඔබගේ යොමු කිරීම සඳහා, ඔබගේ වර්තමාන ශාඛාවෙන් git reset --hard සමඟ පමණක් නොව, පහත දැක්වෙන විධානයෙන් ද ඔබට “දැඩි කැපීම” කළ හැකි යැයි මම විශ්වාස කරමි:

git checkout -B <branch-name> <SHA>

ඇත්ත වශයෙන්ම, ඔබ පරීක්ෂා කිරීම ගැන තැකීමක් නොකරන්නේ නම්, ඔබට අවශ්‍ය ඕනෑම දෙයකට ශාඛාව සැකසිය හැකිය:

git branch -f <branch-name> <SHA>

උදාහරණයක් ලෙස, ශාඛාවකින් කොමිස් ඉවත් කිරීම සඳහා ක්‍රමලේඛනමය ක්‍රමයක් වනු ඇත, නිදසුනක් ලෙස, එයට නව කොමිස් පිටපත් කිරීම සඳහා (නැවත භාවිතා කිරීම).

ඔබ වෙනත් ස්ථානයකින් ප්‍රභවයන් ගෙන එය ශාඛාවට දැමූ නිසා ඔබට ශාඛාවක් මාස්ටර් වෙතින් විසන්ධි වී ඇතැයි සිතමු.

ඔබට දැන් වෙනස්කම් ඇති ශාඛාවක් ඇත, අපි එය "මාතෘකාව" ලෙස හඳුන්වමු.

ඔබ දැන් ඔබේ මාතෘකා ශාඛාවේ අනුපිටපතක් සාදා එය "ඩම්ප්" ශාඛාවේ වාඩි වී ඇති ප්‍රභව කේත ඩම්ප් වෙත නැවත ප්‍රතිස්ථාපනය කරනු ඇත:

git branch topic_duplicate topic
git rebase --onto dump master topic_duplicate

දැන් ඔබගේ වෙනස්කම් ශාඛා මාතෘකාව_අවස්ථාවේ "ඩම්ප්" හි ආරම්භක ස්ථානය මත පදනම්ව නැවත යෙදී ඇති නමුත් "මාස්ටර්" සිට සිදුවී ඇති කැපවීම් පමණි. එබැවින් මාස්ටර්ගේ ඔබගේ වෙනස්වීම් දැන් "ඩම්ප්" මත නැවත යෙදී ඇති නමුත් ප්‍රති result ලය අවසන් වන්නේ "මාතෘකාව_ඩප්ලිකේට්" වලින් ය.

එසේ කිරීමෙන් ඔබට "ඩම්ප්" වෙනුවට "මාතෘකාව_ඩප්ලිකේට්" සමඟ ආදේශ කළ හැකිය:

git branch -f dump topic_duplicate
git branch -D topic_duplicate

හෝ සමඟ

git branch -M topic_duplicate dump

නැතහොත් කුණු කසළ බැහැර කිරීමෙන් පමණි

git branch -D dump

සමහර විට ඔබට වර්තමාන "මාතෘකාව_අවස්ථාව" ඉවත් කිරීමෙන් පසු චෙරි-පික් ද කළ හැකිය.

මා කියන්නට උත්සාහ කරන්නේ ඔබට වෙනත් මුතුන් මිත්තෙකු මත පදනම් වූ වර්තමාන "අනුපිටපත්" ශාඛාව යාවත්කාලීන කිරීමට අවශ්‍ය නම්, ඔබ මුලින් ම කලින් කළ "චෙරිපික්" කොමිස් මකා දැමිය යුතුය. git reset --hard <last-commit-to-retain> හෝ git branch -f topic_duplicate <last-commit-to-retain>අනෙක් පිටපත් පිටපත් කිරීමෙන් (ප්‍රධාන වශයෙන්) මාතෘකා ශාඛාව) නැවත ප්‍රතිස්ථාපනය කිරීමෙන් හෝ චෙරි තෝරාගැනීමෙන්.

නැවත ප්‍රතිස්ථාපනය කිරීම ක්‍රියාත්මක වන්නේ දැනටමත් කොමිස් ඇති ශාඛාවක් මත පමණි, එබැවින් ඔබට එය කිරීමට අවශ්‍ය සෑම අවස්ථාවකම ඔබේ මාතෘකා ශාඛාව අනුපිටපත් කළ යුතුය.

චෙරිපික් කිරීම වඩාත් පහසු ය:

git cherry-pick master..topic

එබැවින් සම්පූර්ණ අනුක්‍රමය පහතට පැමිණේ:

git reset --hard <latest-commit-to-keep>
git cherry-pick master..topic

ඔබගේ මාතෘකාව-අනුපිටපත් ශාඛාව පරීක්ෂා කර ඇති විට. එමඟින් කලින් චෙරි තෝරාගත් කොමිස් වත්මන් අනුපිටපතෙන් ඉවත් කරනු ඇති අතර, ඔබගේ වර්තමාන "ඩම්ප්" (විවිධ මුතුන් මිත්තන්) මත "මාතෘකාව" තුළ සිදුවන සියලු වෙනස්කම් නැවත යොදන්න. ඔබේ දේශීය වෙනස්වීම් තවමත් එයට අදාළ වේදැයි පරීක්ෂා කිරීම සඳහා වෙනස් “පහළට” මාස්ටර් භාවිතා කරන අතරම ඔබේ සංවර්ධනය “සැබෑ” උඩුමහලේ මාස්ටර් මත පදනම් කර ගැනීම සාධාරණ පහසු ක්‍රමයක් ලෙස පෙනේ. විකල්පයක් ලෙස ඔබට වෙනසක් ජනනය කර ඕනෑම Git ප්‍රභව ගසකින් පිටත ආලේප කළ හැකිය. නමුත් මේ ආකාරයෙන් ඔබට යාවත්කාලීන කරන ලද (පැච්) අනුවාදයක් ඔබේ බෙදාහැරීමේ අනුවාදය මත පදනම්ව තබා ගත හැකි අතර ඔබේ සැබෑ සංවර්ධනය සැබෑ උඩු යටිකුරු ස්වාමියාට විරුද්ධ වේ.

එබැවින් නිරූපණය කිරීමට:

  • යළි පිහිටුවීම මඟින් ඔබේ ශාඛා ලක්ෂ්‍යය වෙනත් බැඳීමකට යොමු කරනු ඇත (--හාර්ඩ් පෙර කළ බැඳීමද පරීක්ෂා කරයි, --soft විසින් එකතු කරන ලද ලිපිගොනු දර්ශකයේ තබා ගනී (ඔබ නැවත එය සිදු කරන්නේ නම් එය සිදු වේ) සහ පෙරනිමිය (- මිශ්‍ර) සිදු නොවේ. පෙර කැපවීම පරීක්ෂා කරන්න (ඔබගේ දේශීය වෙනස්කම් අතුගා දැමීම) නමුත් එය දර්ශකය හිස් කරනු ඇත (කැපවීම සඳහා කිසිවක් තවම එකතු කර නැත)
  • ඔබට වෙනත් කැපවීමකට යොමු වීමට ශාඛාවකට බල කළ හැකිය
  • එම කැපවීම වහාම පරීක්ෂා කර බැලීමේදී ඔබට එය කළ හැකිය
  • ඔබගේ වර්තමාන ශාඛාවේ ඇති කොමිස්වල වැඩ නැවත ප්‍රතිස්ථාපනය කිරීම
  • චෙරි තෝරාගැනීම යනු වෙනත් ශාඛාවකින් පිටපත් කිරීමයි

මෙය යමෙකුට උපකාරී වේ යැයි සිතමි. මෙය නැවත ලිවීමට මා අදහස් කළ නමුත් මට දැන් කළමනාකරණය කළ නොහැක. සුභ පැතුම්.

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.