බොහෝ පෙර පිළිතුරු භයානක ලෙස වැරදියි!
මෙය නොකරන්න:
git branch -t newbranch
git reset --hard HEAD~3
git checkout newbranch
ඊළඟ වතාවේ ඔබ දුවන විට git rebase
(හෝ git pull --rebase
) එම කොමිස් 3 නිහ ly ව බැහැර කරනු ලැබේ newbranch
! (පහත පැහැදිලි කිරීම බලන්න)
ඒ වෙනුවට මෙය කරන්න:
git reset --keep HEAD~3
git checkout -t -b newbranch
git cherry-pick ..HEAD@{2}
- පළමුවෙන්ම එය නවතම කොමිස් 3 බැහැර කරයි (
--keep
සමාන --hard
නොවූ නමුත් ඉවතලෑමට වඩා අසමත් වනවා සේම ආරක්ෂිතයි).
- එවිට එය ඉවත්
newbranch
වේ.
- ඉන්පසු එය චෙරි-පික් 3 එම නැවත සිදු
newbranch
කරයි. ඔවුන් තවදුරටත් ශාඛා නමෙන්ම කරන්නේ බැවින්, එය GIT ගේ භාවිතා කරන්නේ reflog : HEAD@{2}
බව සිදු කරයි HEAD
එනම් මෙහෙයුම් 2 කට පෙර විස්තර කරනු පිණිස භාවිත, පෙර අප 1. ක් පරීක්ෂා newbranch
සහ 2. භාවිතා git reset
කරන අනාචාරයේ 3 අවලංගුකිරීමට.
අවවාදයයි: පෙරනිමියෙන් reflog සක්රීය කර ඇත, නමුත් ඔබ එය අතින් අක්රීය කර ඇත්නම් (උදා: "හිස්" git ගබඩාවක් භාවිතා කිරීමෙන්), ධාවනය කිරීමෙන් පසු ඔබට කොමිස් 3 ආපසු ලබා ගත නොහැක git reset --keep HEAD~3
.
පරාවර්තනය මත රඳා නොපවතින විකල්පයක් නම්:
# newbranch will omit the 3 most recent commits.
git checkout -b newbranch HEAD~3
git branch --set-upstream-to=oldbranch
# Cherry-picks the extra commits from oldbranch.
git cherry-pick ..oldbranch
# Discards the 3 most recent commits from oldbranch.
git branch --force oldbranch oldbranch~3
(ඔබ කැමති නම් ඔබට ලිවිය හැකිය @{-1}
- කලින් පරීක්ෂා කළ ශාඛාව - වෙනුවට oldbranch
).
තාක්ෂණික පැහැදිලි කිරීම
git rebase
පළමු උදාහරණයෙන් පසුව කොමිස් 3 බැහැර කරන්නේ ඇයි ? එයට හේතුව git rebase
කිසිදු තර්කයකින් තොරව --fork-point
පෙරනිමියෙන් විකල්පය සක්රීය කිරීමයි , එමඟින් උඩුගං ශාඛාව බලහත්කාරයෙන් තල්ලු කිරීමට එරෙහිව ශක්තිමත් වීමට උත්සාහ කිරීම සඳහා දේශීය reflog භාවිතා කරයි.
M1, M2, M3 යන කොමිස් අඩංගු වූ විට ඔබ සම්භවය / මාස්ටර් අතු බෙදුවා යැයි සිතමු.
M1--M2--M3 <-- origin/master
\
T1--T2--T3 <-- topic
නමුත් පසුව යමෙකු M2 ඉවත් කිරීමට බලහත්කාරයෙන් තල්ලු කිරීමේ සම්භවය / ස්වාමියා විසින් ඉතිහාසය නැවත ලියයි:
M1--M3' <-- origin/master
\
M2--M3--T1--T2--T3 <-- topic
ඔබේ දේශීය පරාවර්තනය භාවිතා කිරීමෙන්, ඔබ git rebase
සම්භවය / ප්රධාන ශාඛාවේ පෙර අවතාරයකින් ඉවත් වූ බවත්, එබැවින් M2 සහ M3 කොමිස් ඇත්ත වශයෙන්ම ඔබේ මාතෘකා ශාඛාවේ කොටසක් නොවන බවත් දැක ගත හැකිය. එබැවින් M2 උඩු මහලේ ශාඛාවෙන් ඉවත් කර ඇති බැවින්, මාතෘකා ශාඛාව නැවත ප්රතිස්ථාපනය කිරීමෙන් පසු ඔබේ මාතෘකා ශාඛාවට එය තවදුරටත් අවශ්ය නොවන බව සාධාරණ ලෙස උපකල්පනය කරයි:
M1--M3' <-- origin/master
\
T1'--T2'--T3' <-- topic (rebased)
මෙම හැසිරීම අර්ථවත් වන අතර සාමාන්යයෙන් ප්රතිනිර්මාණය කිරීමේදී කළ යුතු නිවැරදි දෙය මෙයයි.
එබැවින් පහත දැක්වෙන විධානයන් අසමත් වීමට හේතුව:
git branch -t newbranch
git reset --hard HEAD~3
git checkout newbranch
එයට හේතුව ඔවුන් පරාවර්තනය වැරදි තත්වයට පත් කිරීමයි. කොමිස් newbranch
3 ඇතුළත් වන සංශෝධනයකදී උඩුමහලේ ශාඛාවෙන් ඉවත් වී ඇති බව Git දකින අතර, එම කොමිස් ඉවත් කිරීම සඳහා reset --hard
උඩුමහලේ ඉතිහාසය නැවත ලියයි, එබැවින් ඊළඟ වතාවේ ඔබ git rebase
එය ක්රියාත්මක කරන විට උඩුගං බලා ඉවත් කර ඇති වෙනත් ඕනෑම කැපවීමක් මෙන් ඒවා බැහැර කරයි .
නමුත් මෙම විශේෂ අවස්ථාවෙහිදී අපට අවශ්ය වන්නේ එම කාරණා 3 මාතෘකා ශාඛාවේ කොටසක් ලෙස සැලකීමයි. එය සාක්ෂාත් කර ගැනීම සඳහා, කොමිෂන් 3 ඇතුළත් නොවන පෙර සංශෝධනයේදී අපි උඩුමහලට බැස යා යුතුය. මා යෝජනා කළ විසඳුම් එයයි, එබැවින් ඔවුන් දෙදෙනාම ප්රත්යාවර්තකය නිවැරදි තත්වයේ තබයි.
වැඩි විස්තර සඳහා, git rebase සහ git merge-base docs --fork-point
හි අර්ථ දැක්වීම බලන්න .