මට git commit එකක් මකා දැමිය හැකි නමුත් වෙනස්කම් තබා ගත හැකිද?


1115

මගේ එක් සංවර්ධන ශාඛාවක, මම මගේ කේත පදනමේ යම් යම් වෙනස්කම් සිදු කළෙමි. මා වැඩ කරමින් සිටි අංග සම්පූර්ණ කිරීමට පෙර, මගේ වර්තමාන ශාඛාව මාස්ටර් වෙත මාරුවීමට සිදුවිය. නමුත් "git checkout master" එකක් භාවිතා කිරීමෙන් මගේ සංවර්ධන ශාඛාවේ මා විසින් සිදු කරන ලද වෙනස්කම් ආරක්ෂා කර ඇති අතර එමඟින් මාස්ටර්ගේ සමහර ක්‍රියාකාරකම් බිඳ දමනු ලැබේ. ඉතින් මම කළේ මගේ සංවර්ධන ශාඛාවේ වෙනස්කම් "තාවකාලික කැපවීම" යන පණිවිඩය සමඟ කර පසුව නිරූපණය සඳහා චෙක්පට් මාස්ටර් ය.

දැන් මම නිරූපණය සමඟ කටයුතු කර නැවත මගේ සංවර්ධන ශාඛාවේ වැඩ කිරීමට පටන් ගෙන ඇති අතර, මා විසින් සිදු කරන ලද වෙනස්කම් ආරක්ෂා කරමින් සිටියදී මා විසින් සිදු කරන ලද "තාවකාලික කැපවීම" ඉවත් කිරීමට මම කැමැත්තෙමි. එය කළ හැකිද?


68
ඊළඟ වතාව:git stash
මැට් බෝල්

53
Att මැට්බෝල්, අවශ්‍ය නොවේ. අතර git stashහොඳ මෙවලමක් වන අතර, "ප්රගතිය වැඩ" විසි-ඉවතට අනාචාරයේ ද, ඉතා නීත්යානුකූල උපාංගය වේ.
kostix

3
මෙය ගිතුබ් වෙතින් ලැබුණු විශාල සම්පත් සමුද්‍ර සන්ධියකි: Git සමඟ ඕනෑම දෙයක් අහෝසි කරන්නේ කෙසේද
jasonleonhard

10
Att මැට්බෝල් ost කොස්ටික්ස් ඔව්, ස්ටෑෂ් විශේෂයෙන් දිගු කාලීනව ගබඩා කිරීම සඳහා නුසුදුසු ය. මට අවශ්‍ය වන්නේ ශාඛාවක වෙනස්කම් ඇති කර වෙනත් ශාඛා වෙත ගොස්, වෙනත් ඕනෑම දෙයක් කිරීමට, දින කිහිපයකට පසු නැවත පැමිණීමට ඉඩ නොදී මා git stashවෙනත් ශාඛාවක අන්තර්වාරයේදී භාවිතා කරනු ඇතැයි යන බියෙන්.
ඇලෙක්

5
සැලකිල්ලට ගත යුතු එක් දෙයක් stashනම්, එය සම්පුර්ණයෙන්ම දේශීය වන අතර නැවත මකාදැමීම හෝ විනෝදාස්වාදය හෝ දෘඩාංග අසමත්වීම හෝ නැතිවීම වැනි කේත නැතිවීමට ඉඩ ඇත. IMO, එය සැබවින්ම භාවිතා කළ යුත්තේ ඉතා කෙටි කාලීන WIP සඳහා පමණි. නිවාඩුවක් ගත කිරීමට පෙර WIP බැඳීමට ආදරය කරන්න: P .. එය මොළයේ ඩම්ප් බැඳීමක් ලෙස හඳුන්වන්න!
ϹοδεMεδιϲ

Answers:


1703

එය මේ තරම් සරල ය:

git reset HEAD^

සටහන: සමහර ෂෙල් වෙඩි ^විශේෂ චරිතයක් ලෙස සලකයි (නිදසුනක් ලෙස සමහර වින්ඩෝස් ෂෙල් හෝ ග්ලෝබින් සක්‍රීය කර ඇති ZSH ), එබැවින් ඔබට උපුටා දැක්වීමට සිදු විය හැකිය"HEAD^" එවැනි අවස්ථා වලදී සිදුවේ.

git resetනැතිව --hardහෝ --softඔබේ පෙලඹෙන්නේ HEADඕනෑම ගොනු වෙනස් නොකර, නිශ්චිත සිදු කිරීමට යොමු කිරීම.HEAD^ඔබගේ වර්තමාන කැපවීමේ (පළමු) දෙමව්පියන්ගේ බැඳීම යන්නෙන් අදහස් කෙරෙනුයේ, එය ඔබගේ නඩුවේ තාවකාලික බැඳීමට පෙර ඇති බැඳීමයි.

තවත් විකල්පයක් වන්නේ සාමාන්‍ය පරිදි ඉදිරියට යාමයි, ඉන්පසු ඊළඟ කැපවීමේ ස්ථානයේ ඒ වෙනුවට ධාවනය කරන්න:

git commit --amend [-m … etc]

එය වෙනුවට සංස්කරණය කරනු ඇත හා සමාන බලපෑමක් ඇති කරමින් නවතම කැපවීම කරනු ඇත.

ඔබ දැනටමත් වෙනත් අයෙකු එය ඇදගෙන ගොස් ඇති ස්ථානයකට නරක කැපවීම තල්ලු කර ඇත්නම් මෙය (සෑම git පිළිතුරකටම පාහේ) ගැටළු ඇති කළ හැකි බව සලකන්න. එය වළක්වා ගැනීමට උත්සාහ කරන්න


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

11
ic සිකොෆ්‍රෙනික්, මෙම අවස්ථාවේදී “ඩිමිස්ටිෆයිඩ් යළි පිහිටුවන්න” කියවීමේ අවස්ථාව අතපසු නොකරන්න .
kostix

35
මම මේක More?කළාට පස්සේ. එම විමසුමේදී මා ටයිප් කළ ඕනෑම දෙයක් මට ලබා දෙයිfatal: ambiguous argument 'HEADwhateverItypedIn': unknown revision or path not in the working tree.
DaAwesomeP

52
ADaAwesomeP ඔබ ^විශේෂ චරිතයක් ලෙස සලකන කවචයක් භාවිතා කරන බවක් පෙනේ . ඔබට යොමු කිරීම උපුටා දැක්විය හැකිය "HEAD^", නැතහොත් විකල්ප සින්ටැක්ස් භාවිතා HEAD~1නොකෙරේ
ගරෙත්

8
මා වෙනුවෙන් වැඩ කළත් චරිතයෙන් බේරීමට සිදු වියgit reset HEAD\^
සෙවාරිස්

198

මෙය හැසිරවීමේ ක්‍රම දෙකක් තිබේ. වඩා පහසු වන්නේ ඔබේ තත්වය මත ය

නැවත සකසන්න

ඔබට ඉවත් කිරීමට අවශ්‍ය කැපවීම අවසාන කැපවීම නම්, ඔබට සරලව භාවිතා කළ හැකි අමතර වැඩ කිසිවක් කර නොමැති නම් git-reset

git reset HEAD^

ඔබගේ වර්තමාන හෙඩ්ට පෙර ඔබේ ශාඛාව නැවත බැඳීමට ගෙන යයි. කෙසේ වෙතත්, එය ඇත්ත වශයෙන්ම ඔබගේ වැඩ කරන ගසෙහි ගොනු වෙනස් නොකරයි. එහි ප්‍රති As ලයක් වශයෙන්, එම කැපවීමෙහි සිදු වූ වෙනස්කම් නවීකරණය කරන ලද ඒවා ලෙස පෙනේ - එය 'අවිධිමත්' විධානයක් වැනි ය. ඇත්ත වශයෙන්ම, මට එය කිරීමට අන්වර්ථයක් ඇත.

git config --global alias.uncommit 'reset HEAD^'

එවිට ඔබට git uncommitඅනාගතයේදී එක් කැපවීමක් උපස්ථ කිරීමට භාවිතා කළ හැකිය .

ස්කොෂ් කිරීම

බැඳීමක් කොටු කිරීම යන්නෙන් අදහස් කරන්නේ දෙකක් හෝ වැඩි ගණනක් එකකට ඒකාබද්ධ කිරීමයි. මම මෙය බොහෝ විට කරන්නෙමි. ඔබගේ නඩුවේදී ඔබ අඩක් කළ අංගයක් කැප කර ඇති අතර, පසුව ඔබ එය අවසන් කර නිසි ස්ථිර කැපවීමේ පණිවිඩයක් සමඟ නැවත කැප වනු ඇත.

git rebase -i <ref>

මා ඉහත කියන්නේ මට පැහැදිලි කිරීමට අවශ්‍ය නිසා මෙය නැවත කළ හැකි ගණනක් විය හැකි බවයි. ධාවනය git logකර ඔබට ඉවත් කිරීමට අවශ්‍ය කැපවීම සොයා ගන්න, එහි SHA1 පිටපත් කර එය වෙනුවට භාවිතා කරන්න <ref>. Git ඔබව අන්තර්ක්‍රියාකාරී නැවත සැකසීමේ ක්‍රමයට ගෙන යනු ඇත. එය ඔබගේ වර්තමාන තත්වය සහ ඔබ වෙනුවට තබන ඕනෑම දෙයක් අතර ඇති සියලු බැඳීම් පෙන්වනු ඇත <ref>. කොමිස් <ref>10 කට පෙර නම්, එය ඔබට කොමිස් 10 ම පෙන්වනු ඇත.

එක් එක් බැඳීම ඉදිරිපිට, එය වචනය pickඇත. ඔබට ඉවත් කිරීමට අවශ්‍ය කැපවීම සොයාගෙන එය සිට හෝ දක්වා වෙනස් pickකරන්න . හුදෙක් පණිවිඩ ඉවත ලන ඉවතලීම් භාවිතා කිරීම සහ ලැයිස්තුවේ එහි පූර්වගාමියා සමඟ වෙනස්කම් ඒකාබද්ධ කිරීම. එමfixupsquashfixupsquash ඉඟි පද එකම දෙයක් කරනවා, නමුත් අලුතින් සිදු ඒකාබද්ධ කිරීමේ පණිවිඩය කැප වීමට ඔබට සංස්කරණය කිරීමට ඉඩ දෙයි.

ඔබ සංස්කාරකයෙන් ඉවත් වන විට එම ලැයිස්තුවේ පෙන්වන අනුපිළිවෙලට කොමිස් නැවත කැපවන බව සලකන්න. එබැවින් ඔබ තාවකාලික කැපවීමක් කර ඇත්නම්, එම ශාඛාවේම වෙනත් වැඩක් කර පසුව එම අංගය පසුකාලීනව සම්පූර්ණ කර ඇත්නම්, නැවත භාවිතා කිරීම මඟින් කොමිස් නැවත වර්ග කර ස්කොෂ් කිරීමට ඔබට ඉඩ ලැබේ.

අවවාදයයි:

නැවත වෙනස් කිරීම ඉතිහාසය වෙනස් කරයි - ඔබ දැනටමත් වෙනත් සංවර්ධකයින් සමඟ බෙදාගෙන ඇති ඕනෑම කැපවීමකට මෙය නොකරන්න.

ගබඩා කිරීම

අනාගතයේදී, මෙම ගැටළුව වළක්වා ගැනීම git stashසඳහා, තාවකාලිකව අනුමත නොකළ වැඩ ගබඩා කිරීම සඳහා සලකා බලන්න .

git stash save 'some message'

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

ඔබට ඔබේ තොග ලැයිස්තුව පිරික්සීමට හැකිය ...

git stash list

මෙය ඔබගේ සියලු තොග, ඒවා කුමන ශාඛා මත සිදු කර ඇත්ද යන්න සහ පණිවුඩය සහ එක් එක් පේළියේ ආරම්භයේ දී පෙන්වනු ඇති අතර, මේ ආකාරයට පෙනෙන එම තොගය සඳහා හඳුනාගැනීමේ stash@{#}යන්ත්‍රය # මෙහි ස්ථානගත කර ඇති ස්ථානය # වේ.

තොගයක් යථා තත්වයට පත් කිරීම සඳහා (ඕනෑම ශාඛාවක කළ හැකි අතර, එම ස්ථානය මුලින් නිර්මාණය කළ ස්ථානය කුමක් වුවත්) ඔබ දුවන්නේ ...

git stash apply stash@{#}

නැවතත්, stashes සමූහයේ පිහිටීම # ඇත. ඔබට යථා තත්වයට පත් කිරීමට අවශ්‍ය 0තොගය එම ස්ථානයේ තිබේ නම් - එනම්, එය නවතම ගබඩාව නම්. එවිට ඔබට ස්ටෑෂ් පිහිටීම සඳහන් නොකර විධානය ක්‍රියාත්මක කළ හැකිය, ඔබ අන්තිම එක අදහස් කරන බව git උපකල්පනය කරයි:git stash apply .

උදාහරණයක් ලෙස, මම වැරදි ශාඛාවක වැඩ කරන බවක් පෙනේ නම් - මට පහත දැක්වෙන විධානයන් ක්‍රියාත්මක කළ හැකිය.

git stash
git checkout <correct_branch>
git stash apply

ඔබේ නඩුවේදී ඔබ තව ටිකක් අතු වටා ගමන් කළ නමුත් එම අදහසම තවමත් අදාළ වේ.

මෙය උපකාරී වේ යැයි සිතමි.


6
git config --global alias.uncommit reset HEAD^නැවත සැකසීමට අන්වර්ථ නාමයන් එකඟ නොවේ. ඒ වෙනුවට, කරන්නgit config --global alias.uncommit 'reset HEAD^'
mernst

3
වින්ඩෝස් විධාන විමසුමේ භාවිතා කරන්නේ නම් ^^ වෙනුවට use වෙනුවට use භාවිතා කිරීමට සිදුවන බව සලකන්න.
ප්‍රමෝද් බීආර්

113

මම හිතන්නේ ඔබ මේ ගැන සොයනවා

git reset --soft HEAD~1

වේදිකාගත කිරීම සඳහා වන එම කැපවීමෙහි වෙනසක් සිදු කරන අතරම එය නවතම කැපවීම අහෝසි කරයි.


7
ස්තූතියි. මෙය මට වැඩ කළා. ඇමතුම් git reset HEAD^Windows මත පමණක් "තවත්?" විමසනු - එහි තේරුම කුමක් වුවත්
ටිරෝන්

12
Yt ටයිරොන් ^යනු ඩොස් හි පැන යාමේ චරිතයකි. නව රේඛාවක් සමඟ යුගලනය කළ විට, එය පෙර විධානය සඳහා අඛණ්ඩ විමසුමක් ලෙස සේවය කරයි. ටයිප් git reset HEAD^^කිරීම වින්ඩෝස් මත වැඩ කළ යුතුය.
trk

41

ඔව්, වෙනස්කම් මකා නොදමමින් ඔබගේ බැඳීම මකා දැමිය හැකිය: git reset @ ~


9
මෙය සැබවින්ම මට අවශ්‍ය දෙය වන අතර එය මගේ මතය අනුව පිළිගත් පිළිතුර වනු ඇත, ස්තූතියි!
කාලෝස් ලියු

2
සිත්ගන්නාසුළු, සංයුක්ත වාක්‍ය ඛණ්ඩය, මම මීට පෙර එය දැක නැත. කොහොමද වෙනස් බව git reset --softහෝ git reset --keep?
user776686

එය මා සමඟ වැඩ කළේ නැත: git reset @ ~ commit_hash බැඳීම පවතින ආකාරයටම පවතින අතර කිසි විටෙකත් මකා
නොදමා

22

ඔබ සොයන්නේ එක්කෝ git reset HEAD^ --softහෝ git reset HEAD^ --mixed.

ලේඛයේ සඳහන් පරිදි යළි පිහිටුවීමේ විධානයට ක්‍රම 3 ක් ඇත :

git reset HEAD^ --soft

අහෝසි කරන්න git commit. වැඩ කරන ගසෙහි (ව්‍යාපෘති ෆෝල්ඩරය) + දර්ශකය (- හැඹිලි) තුළ තවමත් වෙනස්කම් පවතී

git reset HEAD^ --mixed

අහෝසි කරන්න git commit+ git add. වැඩ කරන ගසෙහි වෙනස්කම් තවමත් පවතී

git reset HEAD^ --hard

ඔබ කිසි විටෙකත් කේත පදනමට මෙම වෙනස්කම් සිදු නොකළේය. වැඩ කරන ගසෙන් වෙනස්කම් නැති වී යයි.


9

Zsh භාවිතා කරන්නන් සඳහා, ඔබට පහත සඳහන් දෑ භාවිතා කිරීමට සිදුවේ:

git reset --soft HEAD\^

මෙහි පැහැදිලි කර ඇත: https://github.com/robbyrussell/oh-my-zsh/issues/449

URL මිය ගියහොත් වැදගත් කොටස:

ඔබගේ විධානයෙන් පැන යන්න

ඔබට විකල්පයක් ලෙස HEAD use භාවිතා කළ හැකිය, එවිට ඔබට සෑම අවස්ථාවකදීම එයින් ගැලවීමට අවශ්‍ය නොවේ.


15
මට මෙම විධානය කිසි විටෙකත් මතක තබා ගත නොහැකි අතර මෙය ගූගල් කර මගේම පිළිතුරක් සොයාගත යුතුය හහාහා
ග්‍රෙග් හිල්ස්ටන්

3
git reset HEAD^මා වෙනුවෙන් zsh හි වැඩ කරමින් සිටී, සවි කර තිබිය හැක.
බෙන් කෝල්යා මෑන්ස්ලි

EnBenKolyaMansley ඔබ ධාවනය කරන්නේ zsh හි කුමන අනුවාදයද?
ග්‍රෙග් හිල්ස්ටන්

මම පාවිච්චි කරනවාzsh 5.3 (x86_64-apple-darwin18.0)
බෙන් කෝල්යා මෑන්ස්ලි

8

මගේ නඩුවේදී, මම දැනටමත් repo වෙත තල්ලු කර ඇත. අපොයි!

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

git revert -n <sha>

මේ ආකාරයෙන් මට අවශ්‍ය වෙනස්කම් තබා ගැනීමටත් ඒ වන විටත් තල්ලු කර තිබූ බැඳීමක් ඉවත් කිරීමටත් මට හැකි විය.


2
මගේ නඩුවේදී, මම දැනටමත් දුරස්ථ ගබඩාවට තල්ලු කළ දෙයක් ආපසු හැරවීමට අවශ්‍ය විය. ඊටත් වඩා අවු! හොඳම ක්‍රමය වූයේ git revert bad-commit-shaඑතැන් git revert -n revert-commit-just-created-shaසිට අලුත්වැඩියා කිරීමයි. ඔයා මාව බාගෙට අරගෙන. ස්තූතියි!
TinkerTenorSoftwareGuy

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

එබැවින් -nආපසු හැරවීම වේදිකාගත කළ නමුත් සිදු නොවූ වෙනස්කම් වලින් ඉවත් වන විකල්පය. එවිට ඔබට තබා ගත යුතු හෝ ඉවත දැමිය යුතු කුමන ආපසු හැරවීමේ වෙනස්කම් තෝරාගෙන තෝරා ගත හැකිය
තරුණයා

3

Git 2.9 භාවිතා කිරීම (හරියටම 2.9.2.windows.1) git reset HEAD^වැඩි යමක් ඉල්ලා සිටී; මෙහි අපේක්ෂිත ආදානය කුමක්දැයි විශ්වාස නැත. කරුණාකර පහත රූපරාමුව බලන්න

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

වෙනත් විසඳුමක් සොයා ගත්තා git reset HEAD~#numberOfCommitsඔබගේ වෙනස්වීම් නොවෙනස්ව තබා ගැනීමෙන් ඔබට නැවත සැකසීමට අවශ්‍ය දේශීය කොමිස් ගණනක් තෝරා ගැනීමට අපට තෝරා ගත හැකි ගන්නා ලදි. එබැවින්, සියලු දේශීය කොමිස් මෙන්ම සීමිත දේශීය කොමිස් ප්‍රමාණයක් ඉවත දැමීමට අපට අවස්ථාවක් ලැබේ.

git reset HEAD~1ක්‍රියාවෙහි දැක්වෙන තිරපිටපත් පහත බලන්න : රූප විස්තරය මෙහි ඇතුළත් කරන්න

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


ඔබට බොහෝ විට ^ අක්ෂරයෙන් ගැලවීමට අවශ්‍යය - git reset "HEAD ^" හෝ git reset HEAD ^ ^ උත්සාහ කරන්න
Mark Fisher

මෙයට අමතරව, හෙඩ් a නැවත සකස් කිරීම තනි ලෙස ක්‍රියා කරයි a නව රේඛාවක් ලෙස සලකනු ලැබේ.
ජෝන්

2

එය කිරීමට තවත් එක් ක්‍රමයක්.

තාවකාලික කැපවීමට ඉහළින් බැඳීම් එකතු කර ඉන්පසු කරන්න:

git rebase -i

කොමිස් දෙකක් එකකට ඒකාබද්ධ කිරීම සඳහා (විධානය මඟින් පැහැදිලි උපදෙස් සහිත පෙළ ගොනුව විවෘත කරනු ඇත, එය සංස්කරණය කරන්න).


2
තාක්‍ෂණිකව නිවැරදි නමුත් සරලවම කරන තරම් අලංකාර තැනක් නැත git reset HEAD^. Git rebase හි දෝෂ සඳහා බොහෝ ඉඩ තිබේ.
TheBuzzSaw

2

2020 සරල ක්‍රමය:

git reset <commit_hash>

(ඔබට තබා ගැනීමට අවශ්‍ය අන්තිම බැඳීමේ කැපවීමේ හැෂ්).

කැපවීම තල්ලු කළේ නම්, ඔබට එසේ කළ හැකිය:

git push -f

ඔබ දැන් වෙනස් නොකළ වෙනස්කම් දේශීයව තබා ගනී


0

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

මෙම අවස්ථාවේ දී, මම කරන්නේ පහත දැක්වේ:

git checkout HEAD~1 <path_to_file_to_put_in_different_commit>
git add -u
git commit --amend --no-edit
git checkout HEAD@{1} <path_to_file_to_put_in_different_commit>
git commit -m "This is the new commit"

ඇත්ත වශයෙන්ම, rebase -iබෙදීමට ඇති කැපවීම පිළිබඳ සංස්කරණ විකල්පයක් සහිත මැද පවා මෙය හොඳින් ක්‍රියාත්මක වේ .

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.