“Git commit --amend” අහෝසි කරන්නේ කෙසේද?


1325

මම අහම්බෙන් මගේ කලින් කැපවීම සංශෝධනය කළා. කිසියම් ගොනුවකට මා විසින් සිදු කරන ලද වෙනස්කම් වල ඉතිහාසය තබා ගැනීම සඳහා කැපවීම වෙනම විය යුතුය.

එම අන්තිම කැපවීම අහෝසි කිරීමට ක්‍රමයක් තිබේද? මම එවැනි දෙයක් කරන්නේ නම් git reset --hard HEAD^, පළමු කැපවීම ද අහෝසි වේ.

(මම තවම දුරස්ථ නාමාවලි වෙත තල්ලු කර නැත)

Answers:


2354

ඔබ කළ යුත්තේ වර්තමාන HEADබැඳීම හා සමාන විස්තර සහිත නව බැඳීමක් නිර්මාණය කිරීමයි , නමුත් පෙර අනුවාදය මෙන් මවුපියන් සමඟ HEAD. git reset --softශාඛා දර්ශකය චලනය කරනු ඇති අතර එමඟින් ඊළඟ ශාඛාව වත්මන් ශාඛා ප්‍රධානියා සිටින ස්ථානයට වඩා වෙනස් බැඳීමක් මත සිදු වේ.

# Move the current head so that it's pointing at the old commit
# Leave the index intact for redoing the commit.
# HEAD@{1} gives you "the commit that HEAD pointed at before 
# it was moved to where it currently points at". Note that this is
# different from HEAD~1, which gives you "the commit that is the
# parent node of the commit that HEAD is currently pointing to."
git reset --soft HEAD@{1}

# commit the current tree using the commit details of the previous
# HEAD commit. (Note that HEAD@{1} is pointing somewhere different from the
# previous command. It's now pointing at the erroneously amended commit.)
git commit -C HEAD@{1}

36
ඉතා සිසිල්, +1. git reflogනිවැරදි අංකය සොයා ගැනීම සඳහා දෙවන අවසාන සංශෝධන දැක්ම සමඟ පවා මම එය කළෙමි {2}.
ජේජේ

184
පැහැදිලිව කිවහොත්, පළමු විධානය සත්‍ය "අහෝසි කිරීම" වේ. එය පෙර HEAD, වැඩ කරන නාමාවලිය (නොවෙනස්ව) සහ දර්ශක තත්වය නිපදවයි git commit --amend. දෙවැන්න නව කැපවීමකට "නැවත කිරීම" ය. මේවා ක්‍රියාත්මක වන්නේ git commitහුදෙක් ඕනෑම කෙනෙකුට නොවේ --amend.
cdunn2001

61
එබැවින් ඔබ ගැළවිය යුතු නව කැපවීමේ පණිවිඩයක් සමඟ සංශෝධනය නොකළේ නම්, දෙවන කොටස නිත්‍ය විය git commitහැකිය.
මැට් මොන්ටාග්

18
කිසියම් හේතුවක් නිසා, ධාවනය කිරීමේදී මට දෝෂයක් ඇතිවිය git reset --soft HEAD@{1}: fatal: ambiguous argument 'HEAD@1': unknown revision or path not in the working tree. Use '--' to separate paths from revisions. මම වෙනුවට විට HEAD@{1}පෙන්වා එහි පූරක සිදු වූ සමාන, git reflog(ස්තුති JJD!), මේ පිළිතුර පුදුම වැඩ!
ටිම් කේම්බර්

21
ImTimArnold ඔබේ කවචය මත පදනම්ව, ඔබට තනි හෝ ද්විත්ව උපුටා දැක්වීම් කිරීමට අවශ්‍ය විය හැකිය HEAD@{1}. උදාහරණයක් ලෙස මම echo HEAD@{1}tcsh වලින් ධාවනය කරන්නේ නම් , ප්‍රතිදානය වන්නේ HEAD@1වරහන් tcsh මගින් අර්ථ නිරූපණය කළ බැවිනි. මම තනි උපුටා දැක්වීම් භාවිතා කරන්නේ නම්, වරහන් ආරක්ෂා වේ.
කෙල්වින්

136

ref-log භාවිතා කරන්න :

git branch fixing-things HEAD@{1}
git reset fixing-things

ඔබ කලින් සංශෝධිත සියළු වෙනස්කම් ඔබගේ වැඩ කරන පිටපතෙහි පමණක් තිබිය යුතු අතර නැවත කළ හැකිය

පෙර දර්ශක වර්ගයේ සම්පූර්ණ ලැයිස්තුවක් බැලීමට git reflog


7
මෙය දර්ශකය ද පිස දමයි - තවමත් ප්‍රයෝජනවත් නමුත් සරල "අහෝසි කිරීම" ඉක්මවා යයි.
cdunn2001

3
HEAD@{1}සහ අතර වෙනසක් HEAD~1තිබේද?
neaumusic

16
a නියුමුසික්: ඔව්! වර්තමාන කැපවීමේ මවුපියන්HEAD~1 හරියටම සමාන වන HEAD^අතර හඳුනා ගනී . අනෙක් අතට, මෙයට පෙර හෙඩ් විසින් පෙන්වා දුන් කැපවීම, එනම් ඔබ වෙනත් ශාඛාවක් පරීක්ෂා කර බැලීමේදී හෝ බැඳීමක් සංශෝධනය කරන විට එයින් අදහස් කරන්නේ වෙනස් කැපවීම් ය. HEAD@{1}
knittl

nknittl අහ් මම මීට පෙර මෙය කළ හැකි යැයි නොසිතීම පුදුමයක් නොවේ, නැවතත් ස්තූතියි, හොඳ තොරතුරු
neaumusic

9
හස්තයේ පියවර අතිරික්තය. සරලයි git reset HEAD@{1}.
වාසය කරන්න

84

ඔබගේ සංශෝධිත කොමිස් සොයා ගන්න:

git log --reflog

සටහන: --patchපැහැදිලිකිරීම සඳහා කොමිස් වල සිරුර බැලීමට ඔබට එකතු කළ හැකිය. ඒ හා සමානයි git reflog.

ඔබගේ හෙඩ් එක පෙර පැවති ඕනෑම කැපවීමකට නැවත සකසන්න.

git reset SHA1 --hard

සටහන: SHA1 ඔබේ සැබෑ කැපවීමේ හැෂ් සමඟ ප්‍රතිස්ථාපනය කරන්න . මෙම විධානයට කිසියම් වෙනස් කළ නොහැකි වෙනස්කම් නැති වන බව සලකන්න , එවිට ඔබට ඒවා කලින් තැබිය හැකිය. විකල්පයක් ලෙස, භාවිතා --softනවතම වෙනස්කම් රඳවා ගැනීමට ඒ වෙනුවට හා ඉන් පසු ඔවුන්ව නසාගන්නවා.

ඉන්පසු ඔබට අවශ්‍ය අනෙක් කැපවීම චෙරි-තෝරන්න:

git cherry-pick SHA1

26
ඔබ එසේ කරන්නේ නම් git reset SHA1 --soft, ඔබට නවතම වෙනස්කම් රඳවා තබා ඒවා සිදු කළ හැකිය.
pravj

24

ඔබට සෑම විටම අත්පොතෙන් බැඳීමක් බෙදිය හැකිය

  • Git rebase -i commit with සමඟ අන්තර්ක්‍රියාකාරී ප්‍රතිමූර්තියක් ආරම්භ කරන්න, එහිදී කැපවීම යනු ඔබට බෙදීමට අවශ්‍ය කැපවීමයි. ඇත්ත වශයෙන්ම, ඕනෑම කැපවීමේ පරාසයක් එම බැඳීම අඩංගු වන තාක් කල් කරනු ඇත.
  • "සංස්කරණය" ක්‍රියාව සමඟ ඔබට බෙදීමට අවශ්‍ය කැපවීම සලකුණු කරන්න.
  • එම කැපවීම සංස්කරණය කිරීමේදී, git reset HEAD exec ක්‍රියාත්මක කරන්න. මෙහි ප්‍රති is ලය වන්නේ HEAD එකකින් නැවත යථා තත්ත්වයට පත් වන අතර දර්ශකය ද අනුගමනය කරයි. කෙසේ වෙතත්, වැඩ කරන ගස එලෙසම පවතී.
  • දැන් පළමු කැපවීමේදී ඔබට අවශ්‍ය දර්ශකයට වෙනස්කම් එක් කරන්න. ඒ සඳහා ඔබට git add (සමහර විට අන්තර්ක්‍රියාකාරී) හෝ git-gui (හෝ දෙකම) භාවිතා කළ හැකිය.
  • දැන් සුදුසු ඕනෑම පණිවිඩයක් සමඟ දැන් පවතින දර්ශකය කැප කරන්න.
  • ඔබේ වැඩ කරන ගස පිරිසිදු වන තුරු අවසාන පියවර දෙක නැවත කරන්න.
  • Git rebase සමඟ දිගටම කරගෙන යාම - දිගටම කරගෙන යන්න.

26
මාර්ගය ඉතා සංකීර්ණයි. git reflogඔබට අවශ්‍ය සියල්ල
knittl

2
පියවර ගොඩක් ඔව්, නමුත් සෑම පියවරක්ම සංකීර්ණ නොවන අතර එය කිරීමට පහසුය. මෙය මා වෙනුවෙන් වැඩ කළ අතර මගේ ඡන්දය ලබා ගනී.
ඕස්බන්ඩිට්

5
මීට අමතරව, මෙම පිළිතුර මඟින් ඔබ අහම්බෙන් 'සංශෝධනය කළ' වෙනස්කම් තෝරා ගැනීමට ඉඩ සලසයි, එමඟින් git යළි පිහිටුවීම සඳහා අමතර වටිනාකමක් ලබා දෙනු ඇත --soft HEAD {{1} ප්‍රවේශය (එය මගේ ගැටළුව
විසඳූ

2
ඔබට reflog ක්‍රමය සමඟ තෝරා බේරා තෝරා ගත හැකිය. ඒ git resetවෙනුවට කරන්න git reset --soft, ඉන්පසු කරන්න git add --patch.
geekofalltrades

1
මෙය තවමත් ඉතිහාසය නැවත ලියන අතර බල තල්ලුවක් අවශ්‍ය වේ. ගැටලුවක් විය හැකි හෝ නොවිය හැකි ඔබගේ තත්වය අනුව.
පජ්න්

21

කැපවීමේ පණිවිඩය සමඟ ඔබ තවමත් ඔබේ සංස්කාරකයේ සිටී නම්, ඔබට බැඳීම් පණිවිඩය මකා දැමිය හැකි අතර එය git commit --amendවිධානය අහෝසි කරනු ඇති බව සඳහන් කිරීම වටී .


මෙය එකකි.
localhoost

මගේ නමුත් ^^
ඉංජිනේරු

14

සමහර විට git reflogසංශෝධනය කිරීමට පෙර සහ සංශෝධනය කිරීමෙන් පසුව බැඳීම් දෙකක් ලබා ගැනීමට භාවිතා කළ හැකිය.

ඉන්පසු git diff before_commit_id after_commit_id > d.diffසංශෝධනය කිරීමට පෙර සහ සංශෝධනය කිරීමෙන් පසු වෙනස ලබා ගැනීමට භාවිතා කරන්න.

git checkout before_commit_idකැපවීමට පෙර ආපසු යාමට ඊළඟ භාවිතය

ඔබ git apply d.diffකළ සැබෑ වෙනස අදාළ කර ගැනීමට අවසන් වරට භාවිතා කරන්න.

ඒකෙන් මගේ ප්‍රශ්නය විසඳෙනවා.


14

ඔබ කැපවීම දුරස්ථ කිරීමට තල්ලු කර ඇති අතර එම වැරැද්දෙහි වැරදි ලෙස සංශෝධනය කර ඇත්නම් මෙය ඔබගේ ගැටළුව විසඳනු ඇත. git logකැපවීමට පෙර SHA සොයා ගැනීමට නිකුත් කරන්න . (මෙය දුරස්ථ මූලාරම්භය ලෙස උපකල්පනය කරයි). දැන් එම විධානය එම SHA භාවිතයෙන් නිකුත් කරන්න.

git reset --soft <SHA BEFORE THE AMMEND>
#you now see all the changes in the commit and the amend undone

#save ALL the changes to the stash
git stash

git pull origin <your-branch> --ff-only
#if you issue git log you can see that you have the commit you didn't want to amend

git stash pop
#git status reveals only the changes you incorrectly amended

#now you can create your new unamended commit

3
මෙය වඩාත් පොදු ප්‍රශ්නයේ විශේෂ අවස්ථාවකි, නමුත් එය මගේ ක්ෂණික අවශ්‍යතාවය හරියටම ආවරණය කරයි.
dmckee --- හිටපු උපපරිපාලක පූස් පැටවා

8

ඔබගේ අහෝසි කිරීමට ඔබට පහත කළ හැකිය git commit —amend

  1. git reset --soft HEAD^
  2. git checkout files_from_old_commit_on_branch
  3. git pull origin your_branch_name

=================================

දැන් ඔබගේ වෙනස්කම් පෙර පරිදි වේ. ඒ නිසා ඔබ අවසන් කර ඇත්තේ අහෝසි කිරීමෙනිgit commit —amend

දැන් ඔබට කළ හැකිය git push origin <your_branch_name>, ශාඛාවට තල්ලු කිරීම.


4

මීට වසර 9 කට ආසන්න කාලයක් ප්‍රමාද වී ඇති නමුත් මෙම විචලනය එකම දෙයක් ඉටු කර ඇති බවක් නොපෙනුණි (එය ඉහළ පිළිතුරට සමාන මේවායින් කිහිපයක එකතුවකි ( https://stackoverflow.com/a/1459264/4642530 ) .

වෙන්වූ සියලුම හිස් අත්තෙහි සොයන්න

git reflog show origin/BRANCH_NAME --date=relative

ඉන්පසු SHA1 හෑෂ් සොයා ගන්න

පැරණි SHA1 වෙත නැවත සකසන්න

git reset --hard SHA1

ඉන්පසු එය නැවත ඉහළට තල්ලු කරන්න.

git push origin BRANCH_NAME

සිදු විය.

මෙය ඔබව සම්පූර්ණයෙන්ම පැරණි බැඳීම වෙත ආපසු හරවනු ඇත.

(පෙර නැවත ලියන ලද වෙන් කළ කැපවීමේ ප්‍රධානියාගේ දිනය ඇතුළුව)


ඔව්, නමුත් මට සාමාන්‍යයෙන් අවශ්‍ය වන්නේ --softමගේ වෙනස්කම් තබා ගැනීම සඳහා නැවත සැකසීමටයි . මට එය වෙනමම
ජුවාන් මෙන්ඩිස්

2
  1. අන්තිම බැඳීම සමඟ තාවකාලික ශාඛාවට පිවිසීම

    git branch temp HEAD@{1}

  2. අවසාන කැපවීම නැවත සකසන්න

    git reset temp

  3. දැන්, ඔබ විසින් සිදු කරන ලද සියලුම ලිපිගොනු මෙන්ම පෙර බැඳීම්ද ඇත. සියලුම ලිපිගොනු වල තත්වය පරීක්ෂා කරන්න.

    git status

  4. ඔබගේ බැඳීම් ගොනු git අවධියේ සිට නැවත සකසන්න.

    git reset myfile1.js (එසේ ය)

  5. මෙම බැඳීම නැවත සම්බන්ධ කරන්න

    git commit -C HEAD@{1}

  6. ඔබගේ ලිපිගොනු නව කැපවීමකට එකතු කරන්න.

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.