බහු git කොමිස් ආපසු හරවන්නේ කෙසේද?


1019

මට මේ ආකාරයට පෙනෙන git ගබඩාවක් ඇත:

A -> B -> C -> D -> HEAD

මට ශාඛාවේ හිස A වෙතට යොමු කිරීමට අවශ්‍යයි, එනම් මට B, C, D, සහ HEAD අතුරුදහන් වීමට අවශ්‍යයි. හිස A සමඟ සමපාත වීමට මට අවශ්‍යයි.

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


3
ඔබට දුරස්ථය නැවත සැකසීමට අවශ්‍ය නම්, ඔබට එය ඕනෑම දෙයක් සමඟ සම්බන්ධ කළ හැකිය! නමුත් අපි මීට පෙර සිව්වන කැපවීම භාවිතා කරමු: git push -f HEAD~4:master(දුරස්ථ ශාඛාව ප්‍රධාන යැයි උපකල්පනය කරන්න). ඔව්, ඔබට එවැනි ඕනෑම කැපවීමක් තල්ලු කළ හැකිය.
u0b34a0f6ae

21
මිනිසුන් ඇදගෙන ඇත්නම්, භාවිතයෙන් වෙනස්කම් ආපසු හරවන කැපවීමක් කළ git revertයුතුය.
ජකුබ් නාරබ්ස්කි



5
"ඇණවුම වැදගත් ද?" ඔව්, කොමිස් එකම ලිපිගොනු වල එකම රේඛාවලට බලපාන්නේ නම්. එවිට ඔබ නවතම කැපවීම ආපසු හැරවීමට පටන් ගත යුතු අතර, ඔබේ මාර්ගය නැවත ක්‍රියාත්මක කරන්න.
avandeursen

Answers:


1389

අදහස් දැක්වීමක මා ලියා ඇති දේ පුළුල් කිරීම

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

විසඳුම නිර්මාණය සඳහා, එසේ සිදු නව වන වෙනස්කම් එළඹීම ඔබ ඉවත් කිරීමට අවශ්ය බව. Git revert විධානය භාවිතයෙන් ඔබට මෙය කළ හැකිය .

ඔබට පහත තත්වය ඇත:

A <- B <- C <- D <- master <- HEAD

(මෙහි ඊතල මඟින් යොමුකරන්නාගේ දිශාවට යොමු වේ: කොමිස් සම්බන්ධයෙන් "මව්" යොමුව, ශාඛා ප්‍රධානියාගේ ඉහළම ශාඛාව (ශාඛා යොමු කිරීම) සහ හෙඩ් යොමු කිරීමේදී ශාඛාවේ නම).

ඔබ නිර්මාණය කළ යුතු දේ පහත දැක්වේ:

A <- B <- C <- D <- [(BCD) ^ - 1] <- මාස්ටර් <- HEAD

මෙහි "[(BCD) ^ - 1]" යන්නෙන් අදහස් කරන්නේ B, C, D වල වෙනස්වීම් ආපසු හරවන කැපවීමයි. ගණිතය අපට පවසන්නේ (BCD) ^ - 1 = D ^ -1 C ^ -1 B ^ -1, එබැවින් පහත දැක්වෙන විධානයන් භාවිතයෙන් ඔබට අවශ්‍ය තත්වය ලබා ගත හැකිය:

$ git revert --no-commit D
$ git revert --no-commit C
$ git revert --no-commit B
$ git commit -m "the commit message"

විකල්ප විසඳුමක් වනු ඇත ලොව පුරාවටම අන්තර්ගතයන් ඒ සිදු වන අතර, මෙම රාජ්ය සිදු:

$ git checkout -f A -- .
$ git commit -a

එවිට ඔබට පහත තත්වය ඇත:

A <- B <- C <- D <- A '<- master <- HEAD

බැඳීම A 'හි A හි අන්තර්ගතයට සමාන අන්තර්ගතයන් ඇත, නමුත් එය වෙනස් කැපවීමකි (පණිවිඩය, දෙමව්පියන්, කැපවීමේ දිනය).

මෙම චාල්ස් බේලි විසින් වෙනස් කරන ජෙෆ් Ferland විසින් විසඳුමක්, ඒ හා සමාන අදහස් මත, ඇල්ම, නමුත් භාවිතා GIT යළි පිහිටුවීමේ :

$ git reset --hard A
$ git reset --soft @{1}  # (or ORIG_HEAD), which is D
$ git commit

44
ඔබ බී, සී හෝ ඩී ලිපිගොනු එකතු කළහොත් git checkout -f A -- .මේවා මකා නොදමනු ඇත, ඔබට එය අතින් කළ යුතුය. මම දැන් මෙම උපක්‍රමය ක්‍රියාත්මක කළෙමි, ස්තූතියි ජකුබ්
ඕමා

18
එම විසඳුම් සමාන නොවේ. පළමුවැන්න අලුතින් සාදන ලද ගොනු මකා නොදමයි.
m33lky

10
Er ජෙරී: git checkout fooඅදහස් කරන්නේ පිටවීමේ ශාඛාව foo ( ශාඛාවට මාරුවීම) හෝ පිටවීමේ ගොනු foo (දර්ශකයෙන්). --ව්‍යාකූල කිරීමට භාවිතා කරයි, උදා: git checkout -- fooසෑම විටම ගොනුව ගැන ය.
ජකුබ් නාරබ්ස්කි

90
විශිෂ්ට පිළිතුරකට අමතරව. මෙම කෙටිමං මා වෙනුවෙන් වැඩ කරයිgit revert --no-commit D C B
welldan97

9
@ welldan97: අදහස් දැක්වීමකට ස්තූතියි. මෙම පිළිතුර ලිවීමේදී git revertබහු කොමිස් පිළිගත්තේ නැත; එය තරමක් නව එකතු කිරීමකි.
ජකුබ් නාරබ්ස්කි

287

මට ප්‍රයෝජනවත් වූ පිරිසිදු ක්‍රමය

git revert --no-commit HEAD~3..

මෙම විධානය අවසන් වර්‍ග 3 ආපසු හරවන්නේ එක් බැඳීමක් පමණි.

ඉතිහාසය නැවත ලියන්නේද නැත.


21
මෙය සරල හා හොඳම පිළිතුරයි
ජූලියන් ඩෙනියා

3
O ජෝන් ලිටල් එය වෙනස්කම් සිදු කරයි. git commitඑතැන් සිට ඇත්ත වශයෙන්ම කැපවීම කරනු ඇත.
x1a4

16
සමහර කොමිස් ඒකාබද්ධ කිරීමේ කොමිස් නම් මෙය ක්‍රියාත්මක නොවේ.
MegaManX

7
තිත් දෙක අවසානයේ කරන්නේ කුමක්ද?
එනසාල්

6
arcardamom ඒවා පරාසයක් නියම කරයි. HEAD~3..හා සමාන වේHEAD~3..HEAD
Toine එච්

242

එසේ කිරීම සඳහා ඔබට ආපසු හැරවීමේ විධානය භාවිතා කළ යුතුය.

ඔබේ උදාහරණය සැලකිල්ලට ගනිමින්, ඔබට මෙය කිරීමට සිදුවේ (ඔබ ශාඛාවේ 'මාස්ටර්' යැයි උපකල්පනය කරමින්):

git revert master~3..master

මෙය B, C සහ D වල ප්‍රතිලෝම කැපවීම සමඟ ඔබේ දේශීයව නව බැඳීමක් ඇති කරයි (මෙයින් අදහස් කරන්නේ මෙම කොමිස් විසින් හඳුන්වා දුන් වෙනස්කම් අහෝසි කරනු ඇති බවයි):

A <- B <- C <- D <- BCD' <- HEAD

131
git revert --no-commit HEAD~2..එය කිරීමට තරමක් වැඩි මුග්ධ ක්‍රමයකි. ඔබ ප්‍රධාන ශාඛාවේ සිටී නම්, නැවත මාස්ටර් නියම කිරීමට අවශ්‍ය නැත. --no-commitබහු revert commit ...පණිවුඩ සමඟ ඉතිහාසය පැටවීම වෙනුවට සියලු කොමිස් එකවරම ආපසු හැරවීමට උත්සාහ කිරීමට මෙම විකල්පය ඉඩ දෙයි (ඔබට අවශ්‍ය යැයි උපකල්පනය කරන්න).
කුබි

6
Ict වික්ටර් මම ඔබේ කැපවීමේ පරාසය සවි කළෙමි. පරාසයේ ආරම්භය සුවිශේෂී වේ, එයින් අදහස් වන්නේ එය ඇතුළත් කර නොමැති බවයි. එබැවින් ඔබට අවසාන කොමිස් 3 ආපසු හැරවීමට අවශ්‍ය නම්, ඔබ 3 වන බැඳීමේ මවුපියන්ගෙන් පරාසය ආරම්භ කළ යුතුය, එනම් master~3.

2
ubkubi එක කැපවීමක් භාවිතා කරමින් SHAs කැපවීමේ පණිවිඩයකට ඇතුළත් කිරීමේ ක්‍රමයක් නොමැත (ඔබේ ක්‍රමය නමුත් ආපසු හරවන ලද කොමිස් වලට අතින් ඇතුල් නොවී)?
ක්‍රිස් එස්

H ක්‍රිස් මගේ පළමු අදහස වනුයේ භාවිතා නොකිරීමයි --no-commit(එබැවින් ඔබට එක් එක් ආපසු හැරවීම සඳහා වෙනම කැපවීමක් ලැබෙනු ඇත), ඉන්පසු ඒවා සියල්ලම අන්තර්ක්‍රියාකාරී ප්‍රතිප්‍රහාරයකට ලක් කරන්න. ඒකාබද්ධ බැඳීම් පණිවිඩයේ සියලුම SHAs අඩංගු වන අතර, ඔබේ ප්‍රියතම බැඳීම් පණිවිඩ සංස්කාරකය භාවිතා කිරීමට ඔබ කැමති කෙසේ වෙතත් ඒවා පිළිවෙලට තැබිය හැකිය.
රේඩන් රොස්බරෝ

72

ජකූබ්ගේ පිළිතුරට සමානව, ආපසු හැරවීම සඳහා අඛණ්ඩ කොමිස් පහසුවෙන් තෝරා ගැනීමට මෙය ඔබට ඉඩ සලසයි.

# revert all commits from B to HEAD, inclusively
$ git revert --no-commit B..HEAD  
$ git commit -m 'message'

9
ඔබේ විසඳුම මට හොඳින් ක්‍රියාත්මක වූ නමුත් සුළු වෙනස් කිරීමකින්. අපට මෙම නඩුව Z -> A -> B -> C -> D -> HEAD තිබේ නම් සහ මට නැවත A තත්වයට යාමට අවශ්‍ය නම්, අමුතු ලෙස මට git revert --no-commit Z ක්‍රියාත්මක කිරීමට සිදුවේ. හෙඩ්
බොග්ඩාන්

3
Og බොග්ඩාන් සමඟ එකඟ වන්න, ප්‍රතිවර්තන පරාසය එබඳු ය: SHA_TO_REVERT_TO..HEAD
වඩිම් ටයිමිරොව්

11
පරාසය වැරදියි. එය විය යුතුය B^..HEAD, එසේ නොමැතිනම් B බැහැර කරනු ලැබේ.
ටෙසස්

3
Etessus සමඟ එකඟ වන්න, එබැවින් කළ යුතු නිවැරදි දෙය වනුයේ: git revert --no-commit B^..HEADහෝgit revert --no-commit A..HEAD
Yoho

64
git reset --hard a
git reset --mixed d
git commit

එය ඔවුන් සියල්ලන්ටම එකවර ආපසු හැරවීමක් ලෙස ක්‍රියා කරනු ඇත. හොඳ කැපවීමේ පණිවිඩයක් දෙන්න.


4
ඔහුට HEADපෙනුමට Aඅවශ්‍ය නම් දර්ශකය git reset --soft Dගැලපීමට ඔහුට අවශ්‍ය විය හැකි බැවින් එය වඩාත් සුදුසු වේ.
සීබී බේලි

2
- සොෆ්ට් නැවත සැකසීමෙන් දර්ශකය චලනය නොවේ, එබැවින් ඔහු එය සිදු කරන විට, කැපවීම කෙලින්ම පැමිණියේ ඩී වෙනුවට නොව බව පෙනේ. එමඟින් ශාඛාව බෙදී යයි. .
ජෙෆ් ෆර්ලන්ඩ්

5
ඔව්, මම හිතන්නේ git reset --keep යනු හරියටම මා ඉහත සඳහන් කළ දෙයයි. එය 2010 අප්‍රියෙල් මාසයේදී නිකුත් කරන ලද 1.7.1 අනුවාදයෙන් එළිදැක්වුණි, එබැවින් පිළිතුර ඒ වන විට නොතිබුණි.
ජෙෆ් ෆර්ලන්ඩ්

git checkout Aපසුව git commitඉහත මා වෙනුවෙන් වැඩ කටයුතු කළේ නැත, නමුත් මෙම පිළිතුර කළා.
SimplGy

git reset --mixed Dඅවශ්‍ය වන්නේ ඇයි ? විශේෂයෙන් ඇයි reset? ඩී වෙත නැවත සැකසීමෙන් තොරව, හෙඩ් ඒ වෙත යොමු වන අතර, බී, සී සහ ඩී “කරකැවෙන” සහ කසළ එකතු කරන - එය ඔහුට අවශ්‍ය දේ නොවේද? එහෙනම් ඇයි --mixed? ඔබ දැනටමත් පිළිතුරු දී ඇත්තේ " --softනැවත සැකසීමෙන් දර්ශකය චලනය නොවේ ..." එබැවින් දර්ශකය ගෙනයාමෙන් මෙයින් අදහස් වන්නේ දර්ශකයේ D හි වෙනස්කම් අඩංගු වන අතර වැඩ නාමාවලියෙහි A හි වෙනස්කම් අඩංගු වේ - මේ ආකාරයෙන් git statusහෝ git diff(දර්ශකය [D] සමඟ සංසන්දනය කරන වැඩ කරන නාමාවලිය [A]) ද්‍රව්‍යය පෙන්වනු ඇත; එම පරිශීලකයා D සිට A දක්වා ආපසු යනවාද?
රතු කව්පි

41

ඔබේ වැඩ කරන පිටපත වෙනස් කර නොමැති බවට පළමුව වග බලා ගන්න. ඉන්පසු:

git diff HEAD commit_sha_you_want_to_revert_to | git apply

ඉන්පසු කැප වන්න. ආපසු හැරවීමට හේතුව කුමක්දැයි ලේඛනගත කිරීමට අමතක නොකරන්න.


1
මා වෙනුවෙන් වැඩ කළා! සංවර්ධිත ශාඛාවේ (සමහර දෝෂ නිවැරදි කිරීම්) සිදු කරන ලද විශේෂාංග ශාඛා යල් පැන යාමේ ගැටලුවක් තිබේ නම්, එමඟින් විශේෂාංග ශාඛාවට සංවර්ධනයේ සිදු කරන ලද සියළු වෙනස්කම් නැවත ලිවීමට සිදු විය (සමහර ලිපිගොනු මකා දැමීම ඇතුළුව).
සයිලන්සර්

1
ද්විමය ලිපිගොනු සමඟ වැඩ නොකරනු ඇත:error: cannot apply binary patch to 'some/image.png' without full index line error: some/image.png: patch does not apply
GabLeRoux

2
මෙය පිළිගත් පිළිතුරට වඩා නම්‍යශීලී විසඳුමකි. ස්තූතියි!
බ්‍රයන් කුං

2
re: ද්විමය ලිපිගොනු --binary option: git diff --binary HEAD commit_sha_you_want_to_revert_to | git apply
weinerk

2
ඒකාබද්ධ කිරීමේ කොමිස් අඩංගු කොමිස් පරාසයක් ආපසු හැරවීමට ඔබට අවශ්‍ය වුවද මෙය ක්‍රියාත්මක වේ. භාවිතා කරන විට git revert A..Zඔබට ලැබෙනු ඇතerror: commit X is a merge but no -m option was given.
ජුලියස් ගොනෙරා

37

මෙම ප්‍රශ්නයට පිළිතුරු දිය නොහැකි තරමට මම කලකිරී සිටිමි. අනෙක් සෑම ප්‍රශ්නයක්ම නිවැරදිව ආපසු හරවා ඉතිහාසය ආරක්ෂා කරන්නේ කෙසේද යන්නට අදාළ වේ. මෙම ප්‍රශ්නය පවසන්නේ "මට ශාඛාවේ ප්‍රධානියා A වෙත යොමු කිරීමට අවශ්‍යයි, එනම් මට B, C, D, සහ HEAD අතුරුදහන් වීමට අවශ්‍යයි. හිස A සමඟ සමපාත වීමට මට අවශ්‍යයි."

git checkout <branch_name>
git reset --hard <commit Hash for A>
git push -f

මම ජකුබ්ගේ පෝස්ට් කියවීමට බොහෝ දේ ඉගෙන ගත්තෙමි, නමුත් සමාගමේ සමහර පුද්ගලයෙක් (පුල්-ඉල්ලීමකින් තොරව අපගේ "පරීක්ෂණ" ශාඛාවට තල්ලු කිරීමට ප්‍රවේශය ඇති) ඔහු කළ වැරදි 5 ක් මෙන් තල්ලු කර ඔහු කළ වැරැද්ද නිවැරදි කිරීමට සහ නිවැරදි කිරීමට උත්සාහ කරයි. එපමණක් නොව, අදින්න නරක ඉල්ලීම් එකක් හෝ දෙකක් පිළිගනු ලැබීය. එබැවින් එය අමතක කරන්න, මම අවසාන හොඳ කැපවීම (abc1234) සොයාගෙන මූලික පිටපත ධාවනය කළෙමි:

git checkout testing
git reset --hard abc1234
git push -f

මෙම repo හි සේවය කරන අනෙක් පුද්ගලයින් 5 දෙනාට මම කියා සිටියේ ඔවුන් පසුගිය පැය කිහිපය තුළ ඔවුන්ගේ වෙනස්කම් සටහන් කර ගැනීම සහ නවතම පරීක්ෂණයෙන් පිසදමන්න / නැවත ශාඛාව අතුගා දැමීමයි. කතාවේ අවසානය.


2
මම කොමිස් ප්‍රකාශයට පත් කර නොතිබූ නිසා මට අවශ්‍ය පිළිතුර මෙයයි. ස්තූතියි, u සුමරේ.
ටොම් බැරන්

මෙය කිරීමට වඩා හොඳ ක්‍රමය නම් git push --force-with-lease, ඉතිහාසය නැවත ලිවීම සිදු කරනුයේ වාෂ්පීකරණය සඳහා වන කොමිෂන් පරාසය තුළ හෝ ඉන් පසුව වෙනත් කිසිවෙකු ශාඛාවට බැඳී නොමැති නම් පමණි. වෙනත් පුද්ගලයින් ශාඛාව භාවිතා කර ඇත්නම්, එහි ඉතිහාසය කිසි විටෙකත් නැවත ලිවිය යුතු අතර, බැඳීම දෘශ්‍යමය වශයෙන් ආපසු හැරවිය යුතුය.
frandroid

1
"ෆ්රැන්ඩ්රොයිඩ්" ඉතිහාසය කිසි විටෙකත් නැවත ලිවිය යුතු නැත ", නිරපේක්ෂ ගනුදෙනුවක් පමණි. මෙම ත්‍රෙඩ් එකේ ප්‍රශ්නය සහ මගේ පිළිතුරේ කාරණය නම්, යම් නිශ්චිත සිද්ධියක් සඳහා, සියලු ඉතිහාසය අතුගා දැමිය යුතු බවයි.
Suamere

U සුමරේ ෂුවර්, ඒක තමයි ප්‍රශ්නය. නමුත් ඔබේ පිළිතුරේ ඔබට අනෙක් පිරිමි ළමයින්ට පැවසිය යුතු දේ ගැන සඳහන් වන බැවින් කරදර ඇතිවීමේ හැකියාවක් ඇත. පුද්ගලික අත්දැකීම් වලින්, ඔබ මකා දැමීමට උත්සාහ කළ දෙයින් පසුව වෙනත් පුද්ගලයින් කැපවී ඇත්නම්, තල්ලු -f මඟින් ඔබේ කේත පදනම අවුල් කළ හැකිය. --force-with-lease එකම ප්‍රති result ලය ලබා ගනී, ඔබ ඔබේ ගබඩාව අවුල් කිරීමට සූදානම් නම් එය ඔබේ බූරුවා බේරා ගනී. ඇයි අවස්ථාවක් ගන්නේ? --Fors-with-lease අසමත් වුවහොත්, කුමන කැපවීමක් සිදුවන්නේ දැයි ඔබට දැක ගත හැකිය, නිසි ලෙස තක්සේරු කරන්න, සකස් කරන්න, නැවත උත්සාහ කරන්න.
frandroid

1
U සුමරේ ස්තූතියි! ඉතිහාසය නැවත ලිවීමට අවශ්‍ය බව ප්‍රශ්නයේ පැහැදිලිව සඳහන් වන බව මම එකඟ වෙමි. මම ඔබ හා සමාන තත්වයක සිටිමි. මම අනුමාන කරන්නේ යමෙකු අවලස්සන ප්‍රතිවර්තනයන් හා අමුතු කොමිස් සහ ආපසු හැරවීම් අහම්බෙන් සිදු කළ බවය (මම නිවාඩුවේ සිටියදී) සහ රාජ්‍යය ආපසු හැරවිය යුතුය. ඕනෑම අවස්ථාවක හොඳ සෞඛ්‍ය සම්පන්න අනතුරු ඇඟවීමක් සමඟ මෙය පිළිගත් පිළිතුර විය යුතුය.
ලී රිචඩ්සන්

10

මෙය ජකුබ්ගේ පිළිතුරේ දක්වා ඇති එක් විසඳුමක ව්‍යාප්තියකි

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

පළමුව, ශාඛාවේ කෙළවරේ HEAD අතහැර යන විට ඉලක්කගත බැඳීම්වල අන්තර්ගතය පරීක්ෂා කරන්න:

$ git checkout -f <target-commit> -- .

(- - <target-commit>ගොනුවකට වඩා බැඳීමක් ලෙස අර්ථ නිරූපණය කර ඇති බව සහතික කරයි ; වර්තමාන නාමාවලියට යොමු වේ.)

පසුව, ආපසු හරවන ලද කොමිස් වල එකතු කරන ලද ලිපිගොනු මොනවාදැයි තීරණය කරන්න, එබැවින් මකා දැමිය යුතුය:

$ git diff --name-status --cached <target-commit>

එකතු කරන ලද ලිපිගොනු පේළියේ ආරම්භයේ දී "A" සමඟ පෙන්විය යුතු අතර වෙනත් වෙනස්කම් නොතිබිය යුතුය. දැන්, කිසියම් ලිපිගොනු ඉවත් කිරීමට අවශ්‍ය නම්, මෙම ගොනු ඉවත් කිරීම සඳහා වේදිකා ගත කරන්න:

$ git rm <filespec>[ <filespec> ...]

අවසාන වශයෙන්, ආපසු හැරවීම සිදු කරන්න:

$ git commit -m 'revert to <target-commit>'

අවශ්‍ය නම්, අප නැවත අපේක්ෂිත තත්වයට පැමිණ ඇති බවට වග බලා ගන්න:

$git diff <target-commit> <current-commit>

වෙනස්කම් තිබිය යුතු නැත.


ඔබට විශ්වාසද ඔබට gitශාඛාවේ තුඩෙන් හිස ගසා දැමිය හැකිද?
Suamere

2
මෙය මට වඩා හොඳ විසඳුමක් විය, මන්ද මගේ තුළ මට ඒකාබද්ධ කිරීමේ කොමිස් තිබුණි.
sovemp

3

හවුල් ගබඩාවක (මිනිසුන් භාවිතා කරන සහ ඔබට ඉතිහාසය සුරැකීමට අවශ්‍ය) කොමිස් සමූහයක් ආපසු හැරවීමට පහසුම ක්‍රමය වන්නේ git revertgit සමඟ භාවිතා කිරීමයි rev-list. දෙවැන්න ඔබට කොමිස් ලැයිස්තුවක් ලබා දෙනු ඇත, හිටපු තැනැත්තා ආපසු හැරවීමම කරයි.

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

for i in `git rev-list <first-commit-sha>^..<last-commit-sha>`; do git revert -n $i; done

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

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

for i in `git rev-list <first-commit-sha>^..<last-commit-sha>`; do git revert --no-edit -s $i; done

නිදසුනක් වශයෙන්, ඔබ වැනි කැපවීමේ ගසක් තිබේ නම්

 o---o---o---o---o---o--->    
fff eee ddd ccc bbb aaa

eee සිට bbb දක්වා වෙනස් කිරීමට , ධාවනය කරන්න

for i in `git rev-list eee^..bbb`; do git revert --no-edit -s $i; done

මෙය භාවිතා කළා. ස්තූතියි!
රන් බිරොන්

2

ඒ කිසිවක් මා වෙනුවෙන් වැඩ නොකළ නිසා ආපසු හැරවීමට මට කොමිස් තුනක් තිබුණි (අවසාන කොමිස් තුන), එබැවින් මම එසේ කළෙමි:

git revert HEAD
git revert HEAD~2
git revert HEAD~4
git rebase -i HEAD~3 # pick, squash, squash

චාම් එකක් වගේ වැඩ කළා :)


2
මෙය ශක්‍ය විකල්පයක් වන්නේ ඔබගේ වෙනස්කම් තවම තල්ලු කර නොමැති නම් පමණි.
kboom

1

මගේ මතය අනුව ඉතා පහසු හා පිරිසිදු ක්‍රමයක් විය හැකිය:

නැවත A වෙත යන්න

git checkout -f A

මාස්ටර්ගේ හිස වත්මන් තත්වයට යොමු කරන්න

git symbolic-ref HEAD refs/heads/master

සුරකින්න

git commit

1
පහත හෙලීමට හේතුව කරුණාකර ඔබට පැහැදිලි කළ හැකිද?
nulll

මෙය හොඳින් ක්‍රියාත්මක වේ. මෙම ප්‍රයෝජනවත් පිළිතුර සඳහා පහත් සටහනක් තැබීමේ තේරුම කුමක්ද? නැතහොත් හොඳම පුහුණුව කුමක්දැයි කිසිවෙකුට පැහැදිලි කළ හැකිද?
ලෙවෙන්ට් ඩිවිලියොග්ලු

එය සමාන ද git checkout master; git reset --hard A? එසේත් නැතිනම් මෙය කරන්නේ කුමක්ද යන්න ගැන තව ටිකක් පැහැදිලි කළ නොහැකිද?
එම්එම්

සංකේතාත්මක- ref HEAD "ආරක්ෂිත" විධානයක් නොවන බව පෙනේ
සර්ජියෝ

වැරදි මට මාස්ටර් සවි කිරීමට අවශ්‍ය නැත, මට ශාඛාවක් සවි කිරීමට අවශ්‍යයි
සර්ජියෝ

0

දෘ hard යළි පිහිටුවීම් වලක්වා ගැනීමට මට සැබවින්ම අවශ්‍ය විය, මෙය මා විසින් ඉදිරිපත් කරන ලද්දකි.

A -> B -> C -> D -> HEAD

A වෙත ආපසු යාමට (එය පියවර 4 ක් පසුපසට):

git pull                  # Get latest changes
git reset --soft HEAD~4   # Set back 4 steps
git stash                 # Stash the reset
git pull                  # Go back to head
git stash pop             # Pop the reset 
git commit -m "Revert"    # Commit the changes

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.