කලින් කළ බැඳීමකට Git ගබඩාවක් නැවත ලබා දෙන්නේ කෙසේද?


7630

මගේ වර්තමාන තත්වයෙන් එක්තරා කැපවීමකින් සාදන ලද ඡායාරූපයක් වෙත ආපසු යන්නේ කෙසේද?

මා එසේ කරන්නේ නම් git log, මට පහත ප්‍රතිදානය ලැබේ:

$ git log
commit a867b4af366350be2e7c21b8de9cc6504678a61b`
Author: Me <me@me.com>
Date:   Thu Nov 4 18:59:41 2010 -0400

blah blah blah...

commit 25eee4caef46ae64aa08e8ab3f988bc917ee1ce4
Author: Me <me@me.com>
Date:   Thu Nov 4 05:13:39 2010 -0400

more blah blah blah...

commit 0766c053c0ea2035e90f504928f8df3c9363b8bd
Author: Me <me@me.com>
Date:   Thu Nov 4 00:55:06 2010 -0400

And yet more blah blah...

commit 0d1d7fc32e5a947fbd92ee598033d85bfc445a50
Author: Me <me@me.com>
Date:   Wed Nov 3 23:56:08 2010 -0400

Yep, more blah blah.

නොවැම්බර් 3 සිට එනම් බැඳීමට මා ආපසු යන්නේ කෙසේද 0d1d7fc?



116
ගිතූබ් වෙතින් කෙළින්ම, git හි ඇති දේවල් අහෝසි කිරීම පිළිබඳ ඉතා පැහැදිලි හා ගැඹුරු ලිපියක් මෙන්න .
නොබිටා

3
ආශ්‍රිත: පොදු ගබඩාවක පැරණි Git බැඳීමකට පෙරළීම . එම ප්‍රශ්නය මඟින් repo පොදු බවට බාධාවක් එක් කරන බව සලකන්න.

58
මම git වලට කැමතියි, නමුත් ඇදහිය නොහැකි තරම් සරල විය යුතු දෙයකට පිළිතුරු 35 ක් තිබීම Git සමඟ විශාල ගැටලුවක් නිරාවරණය කරයි. නැත්නම් එය ලියකියවිලි ද?
මෆින් මෑන්

2
කොහොමද යන වචනය භාවිතා කිරීමේ දී භාෂාව "උගුලක්" යනු පෙරළුම් කිරීමට ව්යවහාර අර්ථය ලෙස නැවත සකස් කිරීමට පවා මෙහි adressed නොවන ??? වෙනස අවධාරණය කිරීම සඳහා මේ දක්වා සංස්කරණයක් නොව 6594 ක් දක්වා ඉහළ ගොස් තිබේද? "කැපවීම" යන ප්‍රකාශය සමඟ මෙහි "ගොනුවක් සුරැකීම" ගැන සඳහන් කිරීම වඩා ව්‍යාකූල නොවනු ඇත ...
රොමේන් වලරි

Answers:


9736

මෙය "ආපසු හැරවීම" යන්නෙන් ඔබ අදහස් කරන දේ මත බොහෝ දේ රඳා පවතී.

තාවකාලිකව වෙනත් කැපවීමකට මාරු වන්න

ඔබට තාවකාලිකව ආපසු යාමට අවශ්‍ය නම්, මෝඩයා, පසුව ඔබ සිටින තැනට නැවත එන්න, ඔබ කළ යුත්තේ අපේක්ෂිත කැපවීම පරීක්ෂා කිරීම පමණි:

# This will detach your HEAD, that is, leave you with no branch checked out:
git checkout 0d1d7fc32

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

git checkout -b old-state 0d1d7fc32

ඔබ සිටි ස්ථානයට ආපසු යාමට, ඔබ නැවත සිටි ශාඛාව පරීක්ෂා කරන්න. (ඔබ සෑම විටම ශාඛා මාරු කිරීමේදී වෙනස්කම් සිදු කර ඇත්නම්, ඔබට ඒවා සුදුසු පරිදි ගණුදෙනු කිරීමට සිදුවේ. ඒවා ඉවතට විසි කිරීම සඳහා ඔබට නැවත සැකසිය හැකිය; ඔබට එහි ශාඛාවක් අවශ්‍ය නම් ඔවුන් එහි ශාඛාවකට.)

ප්‍රකාශයට පත් නොකළ කොමිස් මකා දමන්න

අනෙක් අතට, එතැන් සිට ඔබ කළ සෑම දෙයක්ම ඇත්තෙන්ම ඉවත් කිරීමට ඔබට අවශ්‍ය නම්, හැකියාවන් දෙකක් තිබේ. එකක්, ඔබ මෙම කොමිස් කිසිවක් ප්‍රකාශයට පත් කර නොමැති නම්, නැවත සකසන්න:

# This will destroy any local modifications.
# Don't do it if you have uncommitted work you want to keep.
git reset --hard 0d1d7fc32

# Alternatively, if there's work to keep:
git stash
git reset --hard 0d1d7fc32
git stash pop
# This saves the modifications, then reapplies that patch after resetting.
# You could get merge conflicts, if you've modified things which were
# changed since the commit you reset to.

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

නව කොමිස් සමඟ ප්‍රකාශිත කොමිස් අහෝසි කරන්න

අනෙක් අතට, ඔබ මෙම කෘතිය ප්‍රකාශයට පත් කර ඇත්නම්, ශාඛාව නැවත සැකසීමට ඔබට අවශ්‍ය නොවනු ඇත. එවැනි අවස්ථාවකදී, ඔබට ඇත්ත වශයෙන්ම කොමිස් ආපසු හැරවිය හැකිය. Git සමඟ, ප්‍රතිවර්තනයට නිශ්චිත අර්ථයක් ඇත: එය අවලංගු කිරීම සඳහා ප්‍රතිලෝම පැච් සමඟ බැඳීමක් ඇති කරන්න. මේ ආකාරයෙන් ඔබ කිසිදු ඉතිහාසයක් නැවත ලියන්නේ නැත.

# This will create three separate revert commits:
git revert a867b4af 25eee4ca 0766c053

# It also takes ranges. This will revert the last two commits:
git revert HEAD~2..HEAD

#Similarly, you can revert a range of commits using commit hashes:
git revert a867b4af..0766c053 

# Reverting a merge commit
git revert -m 1 <merge_commit_sha>

# To get just one, you could use `rebase -i` to squash them afterwards
# Or, you could do it manually (be sure to do this at top level of the repo)
# get your index and work tree into the desired state, without changing HEAD:
git checkout 0d1d7fc32 .

# Then commit. Be sure and write a good message describing what you just did
git commit

මෙම git-revertmanpage , ඇත්තෙන්ම, යථාර්ථය එහි විස්තර මෙම ගොඩක් ආවරණය කරයි. තවත් ප්‍රයෝජනවත් සබැඳියක් වන්නේ git-revert ගැන සාකච්ඡා කරන මෙම git-scm.com කොටසයි .

සියල්ලට පසු ආපසු හැරවීමට ඔබට අවශ්‍ය නැති බව ඔබ තීරණය කරන්නේ නම්, ඔබට ආපසු හැරවීම ආපසු හැරවිය හැකිය (මෙහි විස්තර කර ඇති පරිදි) හෝ ආපසු හැරවීමට පෙර නැවත සැකසිය හැකිය (පෙර කොටස බලන්න).

මෙම අවස්ථාවේදී ඔබට මෙම පිළිතුර ප්‍රයෝජනවත් විය හැකිය:
HEAD පෙර ස්ථානයකට ගෙන යන්නේ කෙසේද? (වෙන්වූ හිස)


118
රොඩ් ගේ අදහස් @ මත git revert HEAD~3ආපසු යා කිරීමට හොඳම බදුල්ල දිස්ත්රික්කයේ, හාලිඇල ලෙස 3අනාචාරයේ am වැදගත් සමුළුව වේ.
නිව් ඇලෙක්සැන්ඩ්‍රියා

20
ඔබට සම්පූර්ණ අංකය ලිවිය හැකිද? වැනි:git reset --hard 0d1d7fc32e5a947fbd92ee598033d85bfc445a50
ස්පොකන්

16
@MathiasMadsenStav ඔව්, ඔබට සම්පූර්ණ SHA1 මගින් කොමිස් නියම කළ හැකිය. පිළිතුර වඩාත් කියවිය හැකි වන පරිදි මම කෙටියෙන් හැෂ් භාවිතා කළ අතර ඔබ යතුරු ලියනය කරන්නේ නම් ඒවා භාවිතා කිරීමටද නැඹුරු වේ. ඔබ පිටපත් කර අලවන්නේ නම්, සෑම අතින්ම සම්පූර්ණ හැෂ් භාවිතා කරන්න. කොමිස් නම් කළ හැකි ආකාරය පිළිබඳ සම්පූර්ණ විස්තරයක් සඳහා මිනිසාගේ සංශෝධන නියම කිරීම බලන්න .
කැස්කබෙල්

59
ඔබට භාවිතා කළ හැකි git revert --no-commit hash1 hash2 ...අතර මෙයින් පසු සෑම ප්‍රතිවර්තනයක්ම එක git commit -m "Message"
කැපවීමකින්

6
මෙම සන්දර්භය තුළ 'ප්‍රකාශනය' යන්නෙන් අදහස් කරන්නේ කුමක්ද?
හොවිකැම්ප්

1853

මෙහි සංකීර්ණ හා භයානක පිළිතුරු ගොඩක්, නමුත් එය ඇත්තෙන්ම පහසු ය:

git revert --no-commit 0766c053..HEAD
git commit

මේ හිස නැවත සිට තේරුම වැඩ ගසක් බව රාජ්ය සිදු උරහිස් දෑතින් අල්ලාගත්ත ඇත, සිදු හැෂ් සියල්ල ආපසු ඇත නම් වීමු කර සිට සෑම නසාගන්නවා. එවිට ඔබට වර්තමාන ගස කැප කළ හැකි අතර, එය ඔබ "ආපසු හරවා" ඇති කැපවීමට සමානවම අළුත් බැඳීමක් නිර්මාණය කරනු ඇත.

(මෙම --no-commitධජය once- දී GIT පෙරළුම් සියලු අනාචාරයේ වෙනත් ආකාරයකින් ඔබට අනවශ්ය නව අනාචාරයේ ඔබේ ඉතිහාසය littering, පරාසය තුළ එක් එක් සිදු පණිවිඩයක් සඳහා ඔබෙන් විමසනු කර ගත හැක. ඉඩ දෙනවා)

මෙය පෙර තත්වයකට ආපසු යාමට ආරක්ෂිත සහ පහසු ක්‍රමයකි . කිසිදු ඉතිහාසයක් විනාශ නොවන බැවින් එය දැනටමත් ප්‍රසිද්ධ කර ඇති කොමිස් සඳහා භාවිතා කළ හැකිය.


23
ඔබට සැබවින්ම තනි කැපවීම් කිරීමට අවශ්‍ය නම් (සෑම දෙයක්ම එක් විශාල කැපවීමකින් ආපසු හරවනවා වෙනුවට), එවිට ඔබට --no-editඒ වෙනුවට සමත් විය හැකිය, එවිට --no-commitඑක් එක් ආපසු හැරවීම සඳහා කැපවීමේ පණිවිඩයක් සංස්කරණය කිරීමට ඔබට අවශ්‍ය නොවේ.

88
0766c053..HEAD අතර එකක් සිදු වුවහොත් එය ඒකාබද්ධ කිරීමක් නම් දෝෂයක් මතු වනු ඇත (-m නිශ්චිතව දක්වා නොමැති විට). මෙය හමු වන අයට මෙය උදව් විය හැකිය: stackoverflow.com/questions/5970889/…
timhc22

7
ඔබ භාවිතයට පෙර වෙනස්කම් දැකීමට git diff --cached.
ජෝන් අර්ක්

21
$ git revert --no-commit 53742ae..HEADප්‍රතිලාභfatal: empty commit set passed
ඇලෙක්ස් ජී

10
Lex ඇලෙක්ස් ජී එයට හේතුව ඔබට ආපසු යාමට අවශ්‍ය හැෂ් එකට පෙර හැෂ් එකක් ඇතුල් කළ යුතු බැවිනි . මගේ නඩුවේදී, හැෂ් වැනි ඒවා විය: 81bcc9e HEAD{0}; e475924 HEAD{1}, ...(සිට git reflog), සහ මා කළ දේ අහෝසි කිරීමට මට අවශ්‍ය විය 81bcc9e, එවිට මට කළ යුතුව තිබුණේgit revert e475924..HEAD
එපික් පැන්ඩාෆෝර්ස්

1611

ව්‍යාජ කෝඩර්?

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

අන් අය සමඟ වැඩ කරනවාද? Git සංකීර්ණයි. ඔබ කිසියම් දෙයක් කිරීමට පෙර මෙම පිළිතුරට පහළින් ඇති අදහස් කියවන්න.

වැඩ කරන පිටපත මෑත කාලීන කැපවීම වෙත ආපසු හරවයි

කිසියම් වෙනස්කමක් නොසලකා හරිමින් පෙර බැඳීමකට ආපසු යාමට:

git reset --hard HEAD

ඔබේ වර්තමාන ශාඛාවේ අවසාන කැපවීම HEAD වේ

වැඩ කරන පිටපත පැරණි බැඳීමකට ආපසු හරවයි

නවතම බැඳීමට වඩා පැරණි බැඳීමක් වෙත ආපසු යාමට:

# Resets index to former commit; replace '56e05fced' with your commit code
git reset 56e05fced 

# Moves pointer back to previous HEAD
git reset --soft HEAD@{1}

git commit -m "Revert to 56e05fced"

# Updates working copy to reflect the new commit
git reset --hard

බැර කිරීම් සමාන තොග පිටාර ගැලීමේ ප්‍රශ්නයකට යයි, Git හි SHA හෑෂ් එකකින් කළ කැපවීමකට ආපසු යන්න? .


33
මම එය කළ නමුත් දුරස්ථ ගබඩාවට තල්ලු කිරීමට මට නොහැකි විය. මට විශේෂිත වයස්ගත කැපවීමක් හෙඩ් බවට පත්වීමට අවශ්‍යයි ...
ලෙනන්

7
එයින් අදහස් වන්නේ ඔබ ආපසු හැරවීමට අවශ්‍ය කොමිස් ඔබ දැනටමත් තල්ලු කර ඇති බවයි. එය ඔබගේ කේතය පරීක්ෂා කර එය මත වැඩ කරන පුද්ගලයින්ට ගැටලු රාශියක් නිර්මාණය කළ හැකිය. ඔවුනට ඔබේ කැපවීම සුමට ලෙස යෙදිය නොහැකි බැවින්. එවැනි අවස්ථාවකදී git revert එකක් කිරීම වඩා හොඳය. ඔබ පමණක් repo භාවිතා කරන්නේ නම්. Git push -f කරන්න (නමුත් එසේ කිරීමට පෙර දෙවරක් සිතන්න)
vinothkr

6
විකල්ප යළිත් මෘදු යළි පිහිටුවීම සහ දෘ reset යළි පිහිටුවීම වෙනුවට, පළමු වරට දෘ reset යළි පිහිටුවීම කළ හැකි බව පෙන්වා දීමට මට අවශ්‍යය git reset --hard 56e05fc; git reset --soft HEAD@{1}; git commit.

5
ගිටියේ නිර්මාතෘ වන නියුටන් ලිනස් එය ඉතා සංකීර්ණ යැයි විවේචනය කළේය. ඔහු "කම්පනයට" පත් වූ බව පවසන ඔහු එහි සංකීර්ණත්වය අනුව ජනප්‍රිය විය
boulder_ruby

5
ouldboulder_ruby මම හිතන්නේ ඔබ අදහස් කළේ ලිනස් ටොවල්ඩ්ස් යනු git හි නිර්මාතෘ බවයි. නමුත් මම හිතන්නේ ලිනස් පෝලිං බොහෝ විට එකඟ වනු ඇත්තේ git සංකීර්ණ බවය.
සන්කැට් 2000

215

මට සහ බොහෝ විට අනෙක් අයට ඇති හොඳම විකල්පය වන්නේ Git reset විකල්පයයි:

git reset --hard <commidId> && git clean -f

මෙය මට හොඳම විකල්පයයි! එය සරල, වේගවත් හා effective ලදායී වේ!


** සටහන: ** අදහස් දැක්වීම්වල සඳහන් පරිදි ඔබ ඔබේ ශාඛාව පැරණි කොමිස්වල පිටපත් ඇති වෙනත් පුද්ගලයින් සමඟ බෙදා ගන්නේ නම් මෙය නොකරන්න

අදහස් දැක්වීම් වලින්, ඔබට අඩු 'බෝල්සි' ක්‍රමයක් අවශ්‍ය නම් ඔබට භාවිතා කළ හැකිය

git clean -i

37
අනිවාර්ය අවවාදයයි: ඔබ ඔබේ ශාඛාව පැරණි කොමිස් වල පිටපත් ඇති වෙනත් පුද්ගලයින් සමඟ බෙදා ගන්නේ නම් මෙය නොකරන්න , මන්ද මේ වගේ දෘ reset යළි පිහිටුවීම භාවිතා කිරීමෙන් ඔවුන්ට අලුතින් යළි පිහිටුවීමේ ශාඛාව සමඟ ඔවුන්ගේ වැඩ නැවත සමමුහුර්ත කිරීමට සිදුවනු ඇත. දෘ reset යළි පිහිටුවීමකින් වැඩ අහිමි නොවී ආරක්ෂිතව ආපසු හරවා ගන්නේ කෙසේද යන්න විස්තරාත්මකව පැහැදිලි කරන විසඳුමක් සඳහා, මෙම පිළිතුර බලන්න .

7
මම දෙවනුව @ කප්කේක් අනතුරු ඇඟවීම ... ප්‍රතිවිපාක ගැන හොඳින් දැනුවත් වන්න. සටහන, කෙසේ වෙතත්, ඔබගේ අවශ්යතාව ඇත්තටම එම අනාචාරයේ සදහටම ඉතිහාසයේ සිට අතුරුදහන් කිරීම නම්, මෙම යළි පිහිටුවීමේ + පිරිසිදු ක්රමය එය කරන්නේ, ඔබ සඳහා අවශ්ය වනු ඇත බව බලය ඔබේ විකරණය ශාඛා නැවත ඕනෑම සහ සියලු remotes කිරීමට තල්ලු.
ashnazg

5
git clean -f DANGER DANGER
Tisch

2
මෙය මගේ දේශීය පිටපතෙහි ප්‍රධානියා අපේක්ෂිත කැපවීමට සකසයි. නමුත් දුරස්ථය පිටුපස ඇති නිසා මට කිසිදු වෙනසක් තල්ලු කළ නොහැක. මම දුරස්ථයෙන් අදින්නේ නම් එය දුරස්ථ ශාඛාවේ නවතම කැපවීම සිදු වූ ස්ථානයට ආපසු යයි. තල්ලු කර ඇති මගේ දේශීය පිටපතෙහි (සෑම තැනකින්ම) කිහිපයක්ම සම්පූර්ණයෙන්ම මකා දමන්නේ කෙසේද?
ඇඩේ

2
DeAde .. ඔබට git push -fධජය භාවිතා කළ හැකිය .. නමුත් ප්‍රවේශම් වන්න, එය දුරස්ථය අභිබවා යනු ඇත .. ඔබට කිරීමට අවශ්‍ය දේ ඔබ දන්නා බවට වග බලා ගන්න ..
Pogrindis

176

පිළිතුරු දීමට පෙර පසුබිම එකතු කර, මෙය කුමක්දැයි පැහැදිලි කරමු HEAD.

First of all what is HEAD?

HEADයනු හුදෙක් වත්මන් ශාඛාවේ වර්තමාන බැඳීම (නවතම) වෙත යොමු කිරීමකි. HEADඕනෑම වේලාවක තනි විය හැක්කේ (හැර git worktree).

අන්තර්ගතය HEADඇතුළත ගබඩා කර ඇති .git/HEADඅතර එහි වර්තමාන බැඳීමේ බයිට් 40 SHA-1 අඩංගු වේ.


detached HEAD

ඔබ නවතම බැඳීම මත නොසිටින්නේ නම් - HEADඉතිහාසයේ පූර්ව කැපවීමකට යොමු වන අර්ථය එය හැඳින්වේ detached HEAD.

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

විධාන රේඛාවේ එය මේ ආකාරයට පෙනෙනු ඇත - ශාඛා නාමය වෙනුවට SHA-1 HEADවත්මන් ශාඛාවේ කෙළවරට යොමු නොවන බැවින් :

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


වෙන්වූ හෙඩ් එකකින් සුවය ලබා ගන්නේ කෙසේද යන්න පිළිබඳ විකල්ප කිහිපයක්:


git checkout

git checkout <commit_id>
git checkout -b <new branch> <commit_id>
git checkout HEAD~X // x is the number of commits t go back

මෙය අපේක්ෂිත කැපවීම වෙත යොමු කරමින් නව ශාඛාවක් පරීක්ෂා කරනු ඇත. මෙම විධානය ලබා දී ඇති බැඳීමකට පිවිසෙනු ඇත.

මෙම අවස්ථාවෙහිදී ඔබට ශාඛාවක් සාදා මේ මොහොතේ සිට වැඩ කිරීමට පටන් ගත හැකිය:

# Checkout a given commit.
# Doing so will result in a `detached HEAD` which mean that the `HEAD`
# is not pointing to the latest so you will need to checkout branch
# in order to be able to update the code.
git checkout <commit-id>

# Create a new branch forked to the given commit
git checkout -b <branch name>

git reflog

ඔබට සෑම විටම එය භාවිතා reflogකළ හැකිය. git reflogයාවත්කාලීන කරන ලද ඕනෑම වෙනසක් පෙන්වනු HEADඇති අතර අපේක්ෂිත reflog ප්‍රවේශය පරීක්ෂා කිරීමෙන් මෙම බැඳීම සඳහා HEADපසුබෑමක් ඇති වේ.

HEAD වෙනස් කරන සෑම අවස්ථාවකම නව ප්‍රවේශයක් ලැබෙනු ඇත reflog

git reflog
git checkout HEAD@{...}

මෙය ඔබ අපේක්ෂිත කැපවීම වෙත ආපසු ගෙන යනු ඇත

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


git reset HEAD --hard <commit_id>

අපේක්ෂිත කැපවීම වෙත ඔබේ හිස ආපසු ගෙන යන්න.

# This will destroy any local modifications.
# Don't do it if you have uncommitted work you want to keep.
git reset --hard 0d1d7fc32

# Alternatively, if there's work to keep:
git stash
git reset --hard 0d1d7fc32
git stash pop
# This saves the modifications, then reapplies that patch after resetting.
# You could get merge conflicts, if you've modified things which were
# changed since the commit you reset to.
  • සටහන: ( Git 2.7 සිට ) ඔබටද එය භාවිතා git rebase --no-autostashකළ හැකිය.

මෙම විධානය මඟින් විදහා දක්වන්නේ කුමන විධානය කරන්නේද යන්නයි. ඔබට පෙනෙන පරිදි reset && checkoutවෙනස් කරන්න HEAD.

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


6
විශිෂ්ට ඉඟියක් git reflog, මට අවශ්‍ය වූයේ
එයයි

4
අපොයි! මේ සියල්ල ඉතා සංකීර්ණ බවක් පෙනේ ... ක්‍රියාවලියට ඔබව අඩියක් පස්සට ගෙන යන සරල විධානයක් නැද්ද? ඔබේ ව්‍යාපෘතියේ 1.1 අනුවාදයේ සිට 1.0 අනුවාදය වෙත ආපසු යාමට කැමතිද? මම බලාපොරොත්තු වන්නේ: git stepback_one_commit හෝ වෙනත් දෙයක් ....
Kokodoko

ඇත: git reset HEAD^--hard`
CodeWizard

3
Ok කොකොඩෝකෝ ඔව්, එය අතිශය සංකීර්ණයි ... සහ ආරම්භ කරන පුද්ගලයින් සඳහා විශේෂ experts යන් එතරම් සැලකිල්ලක් නොදක්වන බවට කදිම නිදසුනකි. කරුණාකර මෙහි මගේ පිළිතුර සහ මම එහි නිර්දේශ කරන පොත වෙත යොමු වන්න. Git යනු ඔබට සිතාමතාම ලබා ගත හැකි දෙයක් නොවේ. කෝඩ් විශාර්ඩ් එසේ නොකළ බව මට විශ්වාසයි.
මයික් මීයන්

145

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

git reset --soft HEAD~1
  • --softනොසලකා --hardහරින ලද ලිපිගොනු ඉවතලන ඒවාට එරෙහිව වැඩ කරන ලිපිගොනු ලෙස රඳවා ගත යුතු බව පෙන්නුම් කරයි .
  • HEAD~1අවසාන කැපවීමයි. ඔබට 3 කොමිස් ආපසු හැරවීමට අවශ්‍ය නම් ඔබට භාවිතා කළ හැකිය HEAD~3. ඔබට නිශ්චිත සංශෝධන අංකයකට පෙරළීමට අවශ්‍ය නම්, ඔබට එහි SHA හැෂ් භාවිතයෙන්ද එය කළ හැකිය.

ඔබ වැරදි දෙයක් කළ අවස්ථාවන්හිදී මෙය අතිශයින්ම ප්‍රයෝජනවත් විධානයක් වන අතර එම අන්තිම කැපවීම අහෝසි කිරීමට ඔබට අවශ්‍යය.

මුලාශ්‍රය: http://nakkaya.com/2009/09/24/git-delete-last-commit/


3
මෙය මෘදු හා මෘදුයි: ඔබ ඔබේ වැඩ තල්ලු නොකළේ නම් අවදානම්
රහිතයි

124

පහත දැක්වෙන විධානයන් දෙකෙන් ඔබට මෙය කළ හැකිය:

git reset --hard [previous Commit SHA id here]
git push origin [branch Name] -f

එය ඔබගේ පෙර Git බැඳීම ඉවත් කරයි.

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

git reset --soft [previous Commit SHA id here]

එවිට එය ඔබගේ වෙනස්කම් සුරකිනු ඇත.


2
මම මෙම ලිපියට පිළිතුරු දුසිම් 1/2 ක් උත්සාහ කළෙමි .. අනෙක් සියල්ලම, මගේ git වින්‍යාසය තල්ලු කිරීමට උත්සාහ කිරීමේදී මට දෝෂයක් ලබා දුන්නේය. මෙම පිළිතුර ක්‍රියාත්මක විය. ස්තූතියි!
ජීන් බෝ

මට එක් විස්තරයක් නම්, මට වෙනස්කම් නැති වී තිබීමයි .. එය ක්‍රියාත්මක නොවූ කැපවීම තුළ මා කළ දේ බැලීමට මට අවශ්‍ය විය. ඊළඟ වතාවේ මම මෙම යළි පිහිටුවීමේ විධානය නිකුත් කිරීමට පෙර එම දත්ත
ජීන් බෝ

1
නරක ඒකාබද්ධ කිරීමක් අවලංගු කිරීමට මට ඇති එකම ක්‍රමය මෙයයි, ආපසු හැරවීම එම අවස්ථාවේ දී ක්‍රියාත්මක නොවීය. ස්තූතියි!
ඩේව් කෝල්

හොඳම පිළිතුර. ස්තූතියි
ඉම්රාන් පොලොබ්

හොඳම පිළිතුර, ස්තූතියි.
user1394

114

Git හි දේශීය වෙනස්කම් ආපසු හැරවීමට මම බොහෝ ක්‍රම අත්හදා බැලුවෙමි, ඔබට නවතම කැපවීමේ තත්වයට ආපසු යාමට අවශ්‍ය නම් මෙය වඩාත් හොඳින් ක්‍රියාත්මක වන බව පෙනේ.

git add . && git checkout master -f

කෙටි විස්තරය:

  • එය කරන ආකාරයට කිසිදු කොමිස් එකක් නිර්මාණය git revertනොකරයි.
  • එය මෙන් ඔබේ හිස වෙන් නොකරනු ඇත git checkout <commithashcode>.
  • එය ඔබගේ සියලු දේශීය වෙනස්කම් අභිබවා යන අතර ශාඛාවේ අවසන් කැපවීමෙන් පසුව එකතු කළ සියලුම ගොනු මකා දමනු ඇත.
  • එය ක්‍රියාත්මක වන්නේ ශාඛා නම් සමඟ පමණි, එබැවින් ඔබට මේ ආකාරයෙන් ශාඛාවේ නවතම බැඳීම් වලට පමණක් ආපසු යා හැකිය.

ඉහත ප්‍රති results ල ලබා ගැනීම සඳහා වඩාත් පහසු සහ සරල ක්‍රමයක් මම සොයා ගතිමි:

git add . && git reset --hard HEAD

වර්තමාන ශාඛාවේ නවතම කැපවීම පිළිබඳව හෙඩ් පෙන්වා දෙයි.

එය boulder_ruby යෝජනා කළ කේත කේතයම වේ, නමුත් අවසාන කැපවීමෙන් පසුව නිර්මාණය කරන ලද සියලුම නව ලිපිගොනු මකා දැමීමට git add .පෙර මම එකතු කර ඇත්තෙමි git reset --hard HEAD.


83

හරි, Git හි පෙර කැපවීමකට ආපසු යාම තරමක් පහසුය ...

වෙනස්කම් තබා නොගෙන ආපසු යන්න :

git reset --hard <commit>

වෙනස්කම් තබාගෙන ආපසු යන්න :

git reset --soft <commit>

පැහැදිලි කිරීම: භාවිතා කිරීමෙන් git resetඔබට නිශ්චිත තත්වයකට යළි පිහිටුවිය හැකිය. ඔබ ඉහත දකින පරිදි එය කැපකිරීමේ හැෂ් සමඟ භාවිතා කිරීම සාමාන්‍ය දෙයකි.

නමුත් ඔබ දකින පරිදි වෙනස වන්නේ ධජ දෙක භාවිතා කිරීම --softසහ --hardපෙරනිමියෙන් ධජය git resetභාවිතා කිරීමයි --soft, නමුත් සෑම විටම ධජය භාවිතා කිරීම හොඳ පුරුද්දකි, මම සෑම ධජයක්ම පැහැදිලි කරමි:


--soft

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


--හාර්ඩ්

මෙම ධජය සමඟ ප්‍රවේශම් වන්න. එය වැඩ කරන ගස නැවත සකසන අතර ලුහුබැඳ ඇති ලිපිගොනු වල සියලු වෙනස්කම් සිදු වන අතර සියල්ල නැති වී යනු ඇත!


Git සමඟ වැඩ කරන සැබෑ ජීවිතයක සිදුවිය හැකි පහත රූපය මම නිර්මාණය කළෙමි:

බැඳීමකට යළි පිහිටුවන්න



70

ඔබ ස්වාමියා ගැන සහ එම ශාඛාව ගැන කතා කරයි යැයි සිතමු (එයින් කියැවෙන්නේ මෙය ඔබ සැලකිලිමත් වන ඕනෑම වැඩ කරන ශාඛාවක් විය හැකි ය):

# Reset local master branch to November 3rd commit ID
git reset --hard 0d1d7fc32e5a947fbd92ee598033d85bfc445a50

# Reset remote master branch to November 3rd commit ID
git push -f origin 0d1d7fc32e5a947fbd92ee598033d85bfc445a50:master

මම බ්ලොග් සටහනකින් පිළිතුර සොයාගත්තා (දැන් තවදුරටත් නොපවතී)

මෙය දුරස්ථයට යළි පිහිටුවීම සහ බල කිරීම බව සලකන්න, එවිට ඔබේ කණ්ඩායමේ අනෙක් අය දැනටමත් ගිටාරය ඇදගෙන ඇත්නම්, ඔබ ඔවුන්ට ගැටළු ඇති කරයි. ඔබ වෙනස් කිරීමේ ඉතිහාසය විනාශ කරමින් සිටී, එය මිනිසුන් මුලින්ම git භාවිතා කිරීමට වැදගත් හේතුවකි.

යළි පිහිටුවීමට වඩා ප්‍රතිවර්තනය භාවිතා කිරීම වඩා හොඳය (වෙනත් පිළිතුරු බලන්න). ඔබ එක් පුද්ගල කණ්ඩායමක් නම් එය බොහෝ විට වැදගත් නොවේ.


6
මෙම පිළිතුර අසංඛ්‍යාත ගණනකට වඩා වෙනස් වන්නේ කෙසේද?
මැට්ස්මාත්

එය අවාසනවන්තයි. මම බ්ලොගර්ට ඊමේල් කළෙමි - ඔහු සතුව තවමත් එය තිබේ යැයි සිතමි!
markreyes


2
මෙය නිවැරදි කරන්නේ කෙසේද යන්න පිළිබඳ වෙනත් බොහෝ යෝජනා වලින් තල්ලු සින්ටැක්ස් නොමැත. නියමයි.
jpa57

61

පෙළ ගොනුවක ඔබට පහත සඳහන් බැඳීම් ඇති බව පවසන්න ~/commits-to-revert.txt(මම git log --pretty=onelineඒවා ලබා ගැනීමට භාවිතා කළෙමි )

fe60adeba6436ed8f4cc5f5c0b20df7ac9d93219
0c27ecfdab3cbb08a448659aa61764ad80533a1b
f85007f35a23a7f29fa14b3b47c8b2ef3803d542
e9ec660ba9c06317888f901e3a5ad833d4963283
6a80768d44ccc2107ce410c4e28c7147b382cd8f
9cf6c21f5adfac3732c76c1194bbe6a330fb83e3
fff2336bf8690fbfb2b4890a96549dc58bf548a5
1f7082f3f52880cb49bc37c40531fc478823b4f5
e9b317d36a9d1db88bd34831a32de327244df36a
f6ea0e7208cf22fba17952fb162a01afb26de806
137a681351037a2204f088a8d8f0db6e1f9179ca

ඒ සෑම එකක්ම ආපසු හැරවීමට Bash shell ස්ක්‍රිප්ටයක් සාදන්න :

#!/bin/bash
cd /path/to/working/copy
for i in `cat ~/commits-to-revert.txt`
do
    git revert $i --no-commit
done

මෙය ලිපිගොනු සහ නාමාවලි නිර්මාණ, සහ මකාදැමීම් ඇතුළුව පෙර පැවති තත්වයට ආපසු හරවන අතර එය ඔබේ ශාඛාවට කැප කර ඔබ ඉතිහාසය රඳවා ගනී, නමුත් ඔබ එය නැවත එකම ගොනු ව්‍යුහයකට හරවා ඇත. Git ට නැති ඇයි git revert --to <hash>මට එහා.


41
git revert HEAD~3අවසාන කොමිස් 3 ඉවත් කිරීමට ඔබට කළ හැකිය
රොඩ්

25
Od රොඩ් - නෑ, ඒක හරි නැහැ. එම විධානය මඟින් හෙඩ් හි තුන්වන ආච්චිලා සීයලා වන කැපවීම ආපසු හරවනු ඇත (අවසාන කොමිස් තුන නොවේ).
kflorence

1
fkflorence හරි තොරතුරු වලට ස්තූතියි. කනගාටුයි git revert -n master~3..master~1වැඩ? ( Kernel.org/pub/software/scm/git/docs/git-revert.html වෙතින් පෙනෙන පරිදි )
රොඩ්

3
OdRod - ඒක හරි, හරියටම කැත වාක්‍ය ඛණ්ඩයක් බව විශ්වාසයි නේද? "ආපසු හැරවීමට" අවශ්‍ය කැපවීම පරීක්ෂා කර බලා වඩාත් බුද්ධිමත් ලෙස කටයුතු කිරීම මම නිතරම සොයාගෙන ඇත්තෙමි.
kflorence

7
එහි තියෙන්නේ වඩාත් පහසු මෙම, දැන් මේ වගේ තිර රචනය සමග වඩා හුදෙක් භාවිතා කරන්න ක්රමයක් git revert --no-commit <start>..<end>නිසා, git revertනව (හෝ සියලු?) Git වන සංස්කරණය වන පරාසයක සිදු පිළිගනියි. පරාසයේ ආරම්භය ආපසු හැරවීමට ඇතුළත් කර නැති බව සලකන්න.

58

ජෙෆ්රොමිගේ විසඳුම් සඳහා අමතර විකල්ප

ජෙෆ්රෝමිගේ විසඳුම් අනිවාර්යයෙන්ම හොඳම ඒවා වන අතර ඔබ ඒවා අනිවාර්යයෙන්ම භාවිතා කළ යුතුය. කෙසේ වෙතත්, සම්පූර්ණත්වය උදෙසා , බැඳීමක් ආපසු හැරවීමට ද භාවිතා කළ හැකි වෙනත් විකල්ප විසඳුම් පෙන්වීමට මට අවශ්‍ය විය (අර්ථයෙන් ගත් කල, ඔබ නව කැපවීමක් නිර්මාණය කරන්නේ පෙර කැපවීමේ වෙනස්කම් අහෝසි කරන ආකාරයට ය.git revert මෙන්).

පැහැදිලිව කිවහොත් , මෙම විකල්පයන් කොමිස් ආපසු හැරවීමට හොඳම ක්‍රමය නොවේ , ජෙෆ්රෝමිගේ විසඳුම් වේ , නමුත් මට පෙන්වා දීමට අවශ්‍ය වන්නේ ඔබට මෙම වෙනත් ක්‍රම භාවිතා කර එකම දේ සාක්ෂාත් කර ගත හැකි git revertබවයි.

විකල්ප 1: දෘඩ හා මෘදු යළි පිහිටුවීම

මෙය චාල්ස් බේලි විසින් Git හි SHA හෑෂ් විසින් කරන ලද බැඳීමකට ආපසු හැරවීමට විසඳුමේ තරමක් වෙනස් කළ අනුවාදයකි ? :

# Reset the index to the desired commit
git reset --hard <commit>

# Move the branch pointer back to the previous HEAD
git reset --soft HEAD@{1}

# Commit the changes
git commit -m "Revert to <commit>"

මෙය මූලික වශයෙන් ක්‍රියාත්මක වන්නේ මෘදු යළි පිහිටුවීම් මඟින් ඔබට කළ හැකි දර්ශකයේ / වේදිකාගත කිරීමේ ක්ෂේත්‍රයේ කලින් සිදු කළ කැපවීමේ තත්වය අතහැර දමනු ඇත.

විකල්ප 2: වත්මන් ගස මකා දමා නව එකක් සමඟ ප්‍රතිස්ථාපනය කරන්න

මෙම විසඳුම පැමිණෙන්නේ පැරණි කැපවීම පරීක්ෂා කිරීම සඳහා svick ගේ විසඳුමෙන් වන අතර එය නව බැඳීමක් බවට පත් කරන්න :

git rm -r .
git checkout <commit> .
git commit

විකල්ප # 1 ට සමානව, මෙය <commit>වර්තමාන වැඩ කරන පිටපතෙහි තත්වය ප්‍රතිනිෂ්පාදනය කරයි . git rmපළමුවෙන්ම එය කළ යුත්තේ git checkoutඑතැන් සිට එකතු කළ ගොනු ඉවත් නොකරන බැවිනි <commit>.


විකල්ප 1 ගැන, එක් ඉක්මන් ප්‍රශ්නයක්: එසේ කිරීමෙන් අපි හරි දේ අතර ලිහිල් නොවෙමු ද?
බොගාක්

2
Og බොගාක් - තිත් මඟින් ගොනු මාර්ගයක් දක්වයි, මේ අවස්ථාවේ දී වත්මන් නාමාවලිය, එබැවින් ඔබ එය ක්‍රියාත්මක කරන්නේ ඔබේ වැඩ කරන පිටපතෙහි මුල සිට යැයි උපකල්පනය කෙරේ.
ටොම්

අනතුරු ඇඟවීම කිහිප වතාවක්ම පිළිතුරෙහි පුනරාවර්තනය වේ, නමුත් මේවා හොඳම ක්‍රමය නොවන්නේ මන්දැයි යමෙකුට එකතු කළ හැකිද - සසඳන විට @ කැස්කබෙල්ගේ (@ ජෙෆ්රොමිගේ) සම්බන්ධිත විසඳුම වැනි දෙයකට . මම ගැටලුව දකින්නේ නැහැ. git revert HEAD~2..HEAD
ජෝෂුවා ගෝල්ඩ්බර්ග්

55

පෙර කැපවීමකට ආපසු යාමට වඩා සරල ක්‍රමයක් මෙන්න (සහ එය අසීමිත තත්වයක තබා ගන්න, ඔබ කැමති දෙයක් සමඟ එය කිරීමට):

git reset HEAD~1

ඉතින්, කැපවීමේ අයිඩී සහ වෙනත් දේ අවශ්‍ය නොවේ :)


වැඩ කළේ නැත, මෙම අස්වැන්නෙන් පසු git අදින්න: දෝෂය: පහත දැක්වෙන ලිපිගොනු වල ඔබගේ දේශීය වෙනස්කම් ඒකාබද්ධ කිරීමෙන් නැවත ලියනු ලැබේ:
malhal

1
@malhal එයට හේතුව ඔබ විසින් වෙනස් නොකළ වෙනස්කම් ඇති වීමයි. ඒවා නැවත සකස් කරන්න / නැවත සකසන්න, එවිට එය එම දෝෂයකින් තොරව ක්‍රියා කරයි.
පෝල් වල්ක්ස්ව්ස්කි

39

පරණ කොමිස් ආපසු හැරවීම සහ වේදිකා ගත කිරීම සඳහා විධානයක් ඇත (මූලික Git හි කොටසක් නොවේ, නමුත් එය git-extra පැකේජයේ ඇත):

git back

ඒක man පිටුව , එය ද එවැනි ලෙස භාවිතා කළ හැක:

# Remove the latest three commits
git back 3

39

හොඳම ක්‍රමය නම්:

git reset --hard <commidId> && git push --force

මෙය ශාඛාව නිශ්චිත බැඳීමකට යළි පිහිටුවනු ඇති අතර පසුව ඔබ දේශීයව ඇති ආකාරයටම දුරස්ථ සේවාදායකය උඩුගත කරනු ඇත (මෙය නිශ්චිත කැපවීමෙන් පසුව විධාන සම්පූර්ණයෙන්ම ඉවත් කරනු ඇත)

--forceධජය සමඟ ප්‍රවේශම් වන්න , තෝරාගත් බැඳීමෙන් පසු ඒවා නැවත අයකර ගැනීමට විකල්පයක් නොමැතිව ඉවත් කරනු ලැබේ.


3
චාම් වගේ වැඩ කළා!
ගෞරව් ගුප්තා

ඔබේ පිළිතුර දැනටමත් ලබා දී නොමැති නව තොරතුරු සපයන්නේ කෙසේදැයි බැලීමට අපොහොසත් වන නිසා මම පහත් කොට සලකමි . උදාහරණයක් ලෙස stackoverflow.com/a/37145089/1723886 , stackoverflow.com/a/27438379/1723886 හෝ stackoverflow.com/a/48756719/1723886 . ඇත්ත වශයෙන්ම බොහෝ කොමිස් වල දැනටමත් git reset --hard ගැන සඳහන් වන අතර තල්ලු කිරීම සඳහා --force හෝ -f භාවිතා කරමින් තවත් බොහෝ දේ සඳහන් වේ.
ඇලෙක්ස් ටෙලොන්

එය පැහැදිලි හා සරල එක් විධානයකින් පමණක් ක්‍රියා කරයි. ඔබ එයට අකමැති නම් මගේ පිළිතුර අවතක්සේරු කිරීමට ඔබට නිදහස තිබේ.
david.t_92

1
අනාගතය සඳහා සලකා බැලිය යුතු තවත් විකල්පයක් නම්, කලින් පිළිතුරක් සඳහා සංස්කරණයක් යෝජනා කිරීම හෝ උදාහරණයක් ලෙස && භාවිතා කිරීමෙන් 'මෙය එක් පේළියකින් කළ හැකිය' යනුවෙන් අදහස් දැක්වීමක් එකතු කිරීමයි. එමඟින් සෑම කෙනෙකුටම වැඩිදියුණු කළ පිළිතුර එක තැනකින් දැක ගත හැකිය.
ඇලෙක්ස් ටෙලොන්

36

සියලු වෙනස්කම් වලින් පසුව, ඔබ මෙම සියලු විධානයන් තල්ලු කරන විට, ඔබට භාවිතා කිරීමට සිදුවනු ඇත:

git push -f ...

එපමණක් නොව git push.


15
අනිවාර්ය අවවාදයයි: ඔබ ඔබේ ශාඛාව පැරණි කොමිස්වල පිටපත් ඇති වෙනත් පුද්ගලයින් සමඟ බෙදා ගන්නේ නම් මෙය නොකරන්න , මන්ද මේ ආකාරයේ බල තල්ලුවක් භාවිතා කිරීමෙන් ඔවුන්ගේ වැඩ නැවත සමමුහුර්ත කිරීමට සිදුවනු ඇත. බල තල්ලුවකින් වැඩ අහිමි නොවී ආරක්ෂාකාරීව ආපසු හරවා ගන්නේ කෙසේද යන්න විස්තරාත්මකව පැහැදිලි කරන විසඳුමක් සඳහා, මෙම පිළිතුර බලන්න .

3
සමහර විට ඔබට අවශ්‍ය දේ මෙයයි. උදාහරණය: කැපවීම සහ වැරදි ශාඛාවට (A ශාඛාව) තල්ලු කිරීම. B ශාඛාවට චෙරි තෝරාගැනීමෙන් පසුව, මෙම ශාඛා A ශාඛාවෙන් ඉවත් කිරීමට මට අවශ්‍යය. A සහ ​​B ශාඛා එකට ඒකාබද්ධ වූ විට ප්‍රතිවර්තනය පසුව අදාළ වේ. ශාඛා බී මම ඒවා ආරක්ෂා වන අතර ශාඛා සිට මේ අනාචාරයේ ඉවත් කළ බලයක් තල්ලුව විසින් අනුගමනය ශාඛාව සිහිකැඳවීමක් --hard <commitId> කරන්නේ මෙම ඉවත් ලබා ගත හැක මම වෙන කාටවත් ශාඛා ඒ මත වර්ධනය වේ දන්නා නිසා
ඩග් ආර්

ස්තූතියි! මගේ ප්‍රාදේශීය ශාඛාවට ගැලපෙන පරිදි දුරස්ථ ශාඛාව ලබා ගන්නේ කෙසේදැයි මට සිතාගත නොහැකි විය.
මිඩෝ

32

ඔබට මෙම ආරම්භක පියවර සියල්ලම ඔබ විසින්ම සම්පූර්ණ කර Git ගබඩාවට තල්ලු කළ හැකිය.

  1. git pull --allවිධානය භාවිතා කරමින් බිට්බකට් වෙතින් ඔබේ ගබඩාවේ නවතම අනුවාදය අදින්න .

  2. -n 4ඔබගේ පර්යන්තයෙන් Git ලොග් විධානය ක්‍රියාත්මක කරන්න. -nඔබගේ ප්‍රාදේශීය ඉතිහාසයේ නවතම කැපවීමෙන් ආරම්භ වන ලොගයේ ඇති කොමිස් ගණන තීරණය කිරීමෙන් පසුව ඇති අංකය තීරණය කරයි.

    $ git log -n 4
    
  3. ඔබේ ගබඩාවේ ඉතිහාසයේ ශීර්ෂය යළි පිහිටුවන්න, git reset --hard HEAD~Nඑහිදී N යනු ඔබට හිස ආපසු ගැනීමට අවශ්‍ය වන කොමිස් ගණනයි. පහත දැක්වෙන උදාහරණයේ දී, නිධිය ඉතිහාසයේ අවසාන කැපවීම දක්වා හිස එක් කැපවීමකට යොමු කරනු ඇත:

  4. වෙනස git push --forceතල්ලු කිරීමට බල කිරීම සඳහා වෙනස Git ගබඩාවට තල්ලු කරන්න.

ඔබට පෙර කැපවීමකට Git ගබඩාව අවශ්‍ය නම්:

git pull --all
git reset --hard HEAD~1
git push --force


28

ඔබට අවශ්‍ය බැඳීම තෝරාගෙන එය පරීක්ෂා කරන්න

git show HEAD
git show HEAD~1
git show HEAD~2 

ඔබට අවශ්‍ය කැපවීම ලැබෙන තුරු. ඒ සඳහා හෙඩ් පෙන්වා දීමට, කරන්න

git reset --hard HEAD~1

හෝ git reset --hard HEAD~2ඕනෑම දෙයක්.


7
අනිවාර්ය අවවාදයයි: ඔබ ඔබේ ශාඛාව පැරණි කොමිස් වල පිටපත් ඇති වෙනත් පුද්ගලයින් සමඟ බෙදා ගන්නේ නම් මෙය නොකරන්න , මන්ද මේ වගේ දෘ reset යළි පිහිටුවීම භාවිතා කිරීමෙන් ඔවුන්ට අලුතින් යළි පිහිටුවීමේ ශාඛාව සමඟ ඔවුන්ගේ වැඩ නැවත සමමුහුර්ත කිරීමට සිදුවනු ඇත. දෘ reset යළි පිහිටුවීමකින් වැඩ අහිමි නොවී ආරක්ෂිතව ආපසු හරවා ගන්නේ කෙසේද යන්න විස්තරාත්මකව පැහැදිලි කරන විසඳුමක් සඳහා, මෙම පිළිතුර බලන්න .

2
එසේම, පැහැදිලිව git show HEADකිවහොත් එය භාවිතා කිරීමට සමාන වේ git log HEAD -1.

25

තත්වය හදිසි එකක් නම් , ඔබේ ව්‍යාපෘතිය කඩිනම් හා අපිරිසිදු ආකාරයකින් කිරීමට අවශ්‍ය නම්, ඔබේ ව්‍යාපෘතිය නාමාවලියක් යටතේ ඇතැයි උපකල්පනය කර, උදාහරණයක් ලෙස, “මගේ ව්‍යාපෘතිය”:


ඉක්මන් හා අපිරිසිදු : තත්වයන් මත පදනම්ව, ඇත්ත ඉක්මන් හා අපිරිසිදු මැයි ඉතා හොඳ විය. මෙතනට මගේ විසඳුමක් වන්නේද නොවේ ගොනු සමඟ ඔබේ වැඩකරන බහලුම තුල ඔබ ගොනු වන ඇත, ඔබගේ .git / බෞද්ධ දේශයයි දක්ෂ හා හිතවතතෙකි බලවත් GIT විධාන භාවිතා බහලුම යටින් සැඟවී ඇති GIT ගබඩාව ගැඹුරු උපුටා ගන්නා / දක්වා ගොඩගන්නා ආපසු හැරවිය නොහැකි පරිද්දෙන් වෙනුවට බොහෝ. විනාශකාරී තත්වයක් ලෙස පෙනෙන්නට ඇති දේ නැවත ලබා ගැනීම සඳහා ඔබ ගැඹුරට මුහුදට නොයන අතර ප්‍රමාණවත් විශේෂ ise තාවයකින් තොරව එසේ කිරීමට උත්සාහ කිරීම මාරාන්තික විය හැකිය .


  1. සම්පූර්ණ නාමාවලියම පිටපත් කර "මගේ ව්‍යාපෘතිය - පිටපත" වැනි වෙනත් දෙයක් අමතන්න. ඔබගේ git repository ("repo") ලිපිගොනු "මගේ ව්‍යාපෘති" නාමාවලිය යටතේ ඇති බව උපකල්පනය කරන්න (ඒවා සඳහා සුපුරුදු ස්ථානය, ".git" නම් නාමාවලිය යටතේ), ඔබ දැන් ඔබගේ වැඩ ලිපිගොනු සහ ඔබේ repo ගොනු දෙකම පිටපත් කර ඇත.

  2. "මගේ ව්‍යාපෘතිය" නාමාවලියෙහි මෙය කරන්න:

    .../my project $ git reset --hard [first-4-letters&numbers-of-commit's-SHA]
    

මෙය "මගේ ව්‍යාපෘතිය" යටතේ ඇති රෙපෝ හි තත්වය ඔබ එම කැපවීම සිදු කළ අවස්ථාවේ සිට නැවත ලබා දෙනු ඇත ("බැඳීමක්" යනු ඔබේ වැඩ කරන ලිපිගොනු වල ඡායාරූපයක්). එතැන් සිට සිදු කරන ලද සියලු කොමිස් "මගේ ව්‍යාපෘතිය" යටතේ සදහටම නැති වී යනු ඇත, නමුත් ... ඔබ සියල්ලම පිටපත් කළ බැවින් ඒවා තවමත් "මගේ ව්‍යාපෘතිය - පිටපත" යටතේ ඇති ගබඩාවේ ඇත. එම ලිපිගොනු යටතේ ඉදිරිපත් කරනු ඇත. /.

එවිට ඔබට ඔබේ පද්ධතියේ අනුවාද දෙකක් තිබේ ... ඔබට පෙර ලිපිගොනු වලින් උනන්දුවක් දක්වන ලිපිගොනු පරීක්ෂා කිරීමට හෝ පිටපත් කිරීමට හෝ වෙනස් කිරීමට හැකිය. "මගේ ව්‍යාපෘතිය - පිටපත" යටතේ ඇති ලිපිගොනු ඔබට සම්පූර්ණයෙන්ම ඉවත දැමිය හැකිය, ප්‍රතිෂ් ored ාපනය කළ කැපවීම කොතැනකවත් සිදු නොවන බැවින් ඔබ නව කාර්යය තීරණය කර ඇත්නම් ...

මෙම ලබා ගත් කැපවීම නිසා නැවත වැඩ කටයුතු ඉවත දැමීමකින් තොරව ව්‍යාපෘතියේ තත්වය දිගටම කරගෙන යාමට ඔබට අවශ්‍ය නම් පැහැදිලිව පෙනෙන දෙය නම් ඔබේ නාමාවලිය නැවත නම් කිරීම ය: ලබා ගත් කැපවීම අඩංගු ව්‍යාපෘතිය මකන්න (හෝ එයට තාවකාලික නමක් දෙන්න) සහ ඔබේ නම වෙනස් කරන්න. මගේ ව්‍යාපෘතිය - “නාමාවලිය නැවත“ මගේ ව්‍යාපෘතියට ”පිටපත් කරන්න. සමහර විට මෙහි ඇති වෙනත් පිළිතුරු කිහිපයක් තේරුම් ගැනීමට උත්සාහ කරන්න, තවත් ඉක්මනින් තවත් කැපවීමක් කරන්න.

Git යනු අතිවිශිෂ්ට නිර්මාණයක් වන නමුත් කිසිවෙකුට එය "මැස්ස මතට ගෙනයාමට" හැකියාවක් නැත: එසේම එය බොහෝ විට පැහැදිලි කිරීමට උත්සාහ කරන පුද්ගලයින් ද වේ වෙනත් VCS [අනුවාද පාලන පද්ධති] පිළිබඳ පූර්ව දැනුම උපකල්පනය කර දුරට ගැඹුරින් සොයා බලයි ඉතා ඉක්මණින්, සහ "පරීක්ෂා කිරීම" සඳහා හුවමාරු කළ හැකි යෙදුම් භාවිතා කිරීම වැනි වෙනත් අපරාධ සිදු කරන්න - ආරම්භකයකු ව්‍යාකූල කිරීම සඳහා සමහර විට පාහේ ගණනය කර ඇති ආකාරයට.

බොහෝ ආතතියෙන් මිදීමට, මගේ කැළැල් වලින් ඉගෙන ගන්න. ඔබට Git පිළිබඳ පොතක් කියවිය යුතුය - මම නිර්දේශ කරන්නේ "Git සමඟ අනුවාද පාලනය" . පසුව නොව ඉක්මනින් එය කරන්න. ඔබ එසේ කරන්නේ නම්, Git හි සංකීර්ණතාවයෙන් වැඩි ප්‍රමාණයක් පැමිණෙන්නේ අතු බෙදීමෙන් හා නැවත ඉස්මතු වීමෙන් බව මතක තබා ගන්න: ඔබට ඕනෑම පොතක එම කොටස් මඟ හැරිය හැක. ඔබේ ප්‍රශ්නයෙන් මිනිසුන් විද්‍යාවෙන් ඔබව අන්ධ කිරීමට හේතුවක් නැත .

උදාහරණයක් ලෙස, මෙය මංමුලා සහගත තත්වයක් නම් සහ ඔබ Git සමඟ නවකයෙක් නම්!

PS: තවත් සිතුවිල්ලක්: වැඩකරන ලිපිගොනු හැර වෙනත් නාමාවලියක Git repo තබා ගැනීම (දැන්) ඇත්ත වශයෙන්ම ඉතා සරල ය. මෙයින් අදහස් කරන්නේ ඉහත ඉක්මන් හා අපිරිසිදු විසඳුම භාවිතයෙන් ඔබට සම්පූර්ණ Git ගබඩාව පිටපත් කිරීමට අවශ්‍ය නොවන බවයි. --separate-git-dir මෙහි භාවිතා කරමින් ෆ්‍රයර්ගේ පිළිතුර බලන්න . අවවාද කරන්න , නමුත්: ඔබ පිටපත් නොකරන "වෙනම-නාමාවලි" ගබඩාවක් තිබේ නම් සහ ඔබ දැඩි ලෙස යළි පිහිටුවීම සිදු කරන්නේ නම්, නැවත සැකසීමෙන් පසුව ඇති සියලුම අනුවාදයන් සදහටම නැති වී යනු ඇත. නිතිපතා ඔබේ ගබඩාව උපස්ථ කරන්න, වඩාත් සුදුසු වන්නේ වෙනත් ස්ථාන අතර වලාකුළට (උදා: ගූගල් ඩ්‍රයිව් ) ය.

" වලාකුළට උපස්ථ වීම" යන මාතෘකාව යටතේ, ඊළඟ පියවර වන්නේ GitHub හෝ (මගේ දෘෂ්ටියට වඩා හොඳ) GitLab සමඟ ගිණුමක් විවෘත කිරීමයි . git pushඔබගේ වලාකුළු නැවත යාවත්කාලීන කිරීම “නිසි ලෙස” කිරීමට ඔබට නිතිපතා විධානයක් කළ හැකිය . නමුත් නැවතත්, මේ ගැන කතා කිරීම ඉතා ඉක්මණින් විය හැකිය.


23

මෑත කාලීන බැඳීමකට සෘජුවම යළි පිහිටුවීමට මෙය තවත් එක් ක්‍රමයකි

git stash
git stash clear

අවසාන කැපවීමේ සිට ඔබ විසින් සිදුකරන ලද සියළු වෙනස්කම් එය කෙලින්ම ඉවත් කරයි.

PS: එයට පොඩි ප්‍රශ්නයක් තියෙනවා; එය ඔබ මෑතකදී ගබඩා කර ඇති සියල්ල වෙනස් කරයි. බොහෝ අවස්ථාවල මා අනුමාන කරන දේ වැදගත් නොවේ.


සටහන: දර්ශකයේ එකතු නොකළ නව ලිපිගොනු ගබඩා කර නොමැත. ඔබ ඒවා එකතු කිරීම හෝ අතින් මකා දැමීමද කර ඇත.
andreyro

ඇයි ඔහ් ඇයි තොගය ඉවත් කරන්නේ? විසඳුමක් නොවනවාට අමතරව, මෙය ඇත්ත වශයෙන්ම හානිකර ය. ප්‍රශ්නයේ මුල් වාක්‍යය කියවීමෙන් වහාම තොග විසඳුම අවලංගු වේ (එය අවසාන බැඳීම නැවත සැකසීමට පමණක් ප්‍රයෝජනවත් වේ).
රොමේන් වලරි

22

සමහර අහම්බෙන් සිදු වූ වෙනස්කම් වලින් කෝඩරයේ නාමාවලිය සම්පූර්ණයෙන්ම පිරිසිදු කිරීම සඳහා, අපි භාවිතා කළේ:

git add -A .
git reset --hard HEAD

යන්තම් git reset --hard HEADවෙනස් කිරීම් ඉවත් කරනු ඇත, නමුත් එය "නව" ගොනු ඉවත් නොවනු ඇත. ඔවුන් අහඹු ලෙස වැදගත් ෆෝල්ඩරයක් අහඹු තැනකට ඇදගෙන යනු ඇති අතර, එම ලිපිගොනු සියල්ලම Git විසින් අළුත් ඒවා ලෙස සලකනු ලැබේ, එබැවින් එය reset --hardනිවැරදි නොකළේය. git add -A .කලින් ධාවනය කිරීමෙන් , එය නැවත සැකසීමෙන් අතුගා දැමීමට, ඒවා සියල්ලම git සමඟ පැහැදිලිව නිරීක්ෂණය කළේය.


21

පෙර කැපවීමේ සිට HEAD දක්වා වූ වෙනස්කම් තබා ගැනීමට සහ පෙර කැපවීමට යාමට, කරන්න:

git reset <SHA>

HEAD සඳහා වූ පෙර කැපවීමෙන් වෙනස්කම් අවශ්‍ය නොවන්නේ නම් සහ සියලු වෙනස්කම් ඉවතලන්න, එසේ කරන්න:

git reset --hard <SHA>

20

සමහර අය තම ස්වාමියා තුළ සිදු කර ඇති වෙනස්කම් ආපසු හරවා ගන්නේ කෙසේදැයි දැන ගැනීමට මෙම ප්‍රශ්නයට පැමිණිය හැකි යැයි මම විශ්වාස කරමි - එනම් සියල්ල ඉවත දමා නැවත සම්භවය / ස්වාමියා වෙත යන්න, එවැනි අවස්ථාවක මෙය කරන්න:

git reset --hard origin/master

/superuser/273172/how-to-reset-master-to-origin-master


18

ප්‍රතිවර්තනය යනු කොමිස් පෙරළා දැමීමේ විධානයයි.

git revert <commit1> <commit2> 

නියැදිය:

git revert 2h3h23233

පහත දැක්වෙන පරිදි HEAD වෙතින් පරාසයක් ලබා ගැනීමේ හැකියාව එයට ඇත. මෙහි 1 පවසන්නේ "අවසන් කැපවීම ආපසු හරවන්න" යන්නයි.

git revert HEAD~1..HEAD

ඉන්පසු කරන්න git push


14

අපේක්ෂිත කැපවීමට නැවත සැකසීමට උත්සාහ කරන්න -

git reset <COMMIT_ID>

(COMMIT_ID භාවිතය පරීක්ෂා කිරීමට git log)

මෙය වෙනස් කළ සියලුම ගොනු එකතු නොකළ තත්වයට යලි සකසනු ඇත.

දැන් ඔබට checkoutඑකතු නොකළ ගොනු සියල්ලම කළ හැකිය

git checkout .

පරීක්ෂා කරන්න git logඔබේ වෙනස්කම් තහවුරු කිරීමට.

යාවත්කාලීන කරන්න

තිබේ නම්, ඔබ එකම ඔබගේ ණයකට දී සිදු, උත්සාහක දිනුමක්

git update-ref -d HEAD


13

ඔබගේ කොමිස් දුරස්ථව තල්ලු වන බැවින්, ඔබ ඒවා ඉවත් කළ යුතුය. ඔබේ ශාඛාව සංවර්ධනය වී ඇති බවත් එය සම්භවය ඉක්මවා යන බවත් උපකල්පනය කරමු .

ඔබ මුලින්ම සංවර්ධනය ආරම්භයේ සිට ඉවත් කළ යුතුය :

git push origin :develop (note the colon)

එවිට ඔබට අවශ්‍ය තත්වයට වර්ධනය විය යුතුය, කැපවීමේ හැෂ් EFGHIJK යැයි උපකල්පනය කරමු:

git reset --hard EFGHIJK

අවසාන වශයෙන්, තල්ලු කිරීම නැවත සංවර්ධනය කරන්න :

git push origin develop

13

අවවාදයයි! පරිශීලකයා වැරදි ලෙස වැරදියට තැබුවහොත් මෙම විධානය මඟින් බැඳීම් ඉතිහාසය නැති වීමට හේතු වේ. ඔබ යම් තරමක ආරක්‍ෂිත වූවාට වඩා, ඔබ යම් වැරැද්දක් කරන්නේ නම්, වෙනත් ඕනෑම තැනක ඔබේ උපස්ථයේ අමතර උපස්ථයක් තබා ගන්න. :)

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

මම එය කළ ආකාරය මෙයයි:

git reset --hard CommitId && git clean -f

මෙය දේශීය ගබඩාව වෙත ආපසු හරවනු ඇති අතර, මෙහි භාවිතා කිරීමෙන් පසු git push -fදුරස්ථ ගබඩාව යාවත්කාලීන වේ.

git push -f

13

දී GitKraken ඔබට මෙය කළ හැකි:

  1. ඔබ, නැවත සකස් තෝරා ගැනීමට අවශ්ය බව නසා මත දකුණු ක්ලික් කරන්න: මෙම සිදු / Hard යළි පිහිටුවන්න :

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

  2. නැවත බැඳීම මත දකුණු ක්ලික් කරන්න, තෝරන්න: වත්මන් ශාඛා නම / තල්ලු කරන්න :

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

  3. Force Push මත ක්ලික් කරන්න :

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

නිරීක්ෂණ. : ඔබ පරිස්සම් විය යුතුයි, මන්ද දෘ reset යළි පිහිටුවීමෙන් පසු සිදු වූ සියලු කැපවීම් ඉතිහාසය නැති වී ඇති අතර මෙම ක්‍රියාව ආපසු හැරවිය නොහැකි ය. ඔබ කරන්නේ කුමක්දැයි ඔබට සහතික විය යුතුය.


11

ඔබට අවසාන වරදෙහි යම් දෝෂයක් නිවැරදි කිරීමට අවශ්‍ය නම් හොඳ විකල්පයක් වනුයේ git commit --amend විධානය භාවිතා කිරීමයි. අන්තිම බැඳීම කිසියම් සඳහනකින් පෙන්වා නොමැති නම්, මෙය උපක්‍රමය කරනු ඇත, මන්ද එය අන්තිම බැඳීම හා සමාන දෙමව්පියන් සමඟ බැඳීමක් ඇති කරයි. අන්තිම බැඳීම ගැන සඳහනක් නොමැති නම්, එය හුදෙක් ඉවතලනු ඇති අතර මෙම බැඳීම අවසාන බැඳීම වේ. කොමිස් ආපසු හැරවීමකින් තොරව කොමිස් නිවැරදි කිරීමට මෙය හොඳ ක්‍රමයකි. කෙසේ වෙතත් එයට තමන්ගේම සීමාවන් ඇත.

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.