මගේ අන්තිම X එක Git භාවිතා කරමින් එක කැපවීමකට සම්බන්ධ කරන්නේ කෙසේද?
මගේ අන්තිම X එක Git භාවිතා කරමින් එක කැපවීමකට සම්බන්ධ කරන්නේ කෙසේද?
Answers:
අත්පොතේgit rebase -i <after-this-commit>
විස්තර කර ඇති පරිදි දෙවන හා පසුව සිදුකරන "ස්කොෂ්" හෝ "සවි කිරීම" සමඟ "පික්" භාවිතා කර ප්රතිස්ථාපනය කරන්න .
මෙම උදාහරණයේ දී, <after-this-commit>
SHA1 හැෂ් හෝ වත්මන් ශාඛාවේ HEAD වෙතින් සාපේක්ෂ පිහිටීම වේ. උදාහරණයක් ලෙස, අතීතයේ දී වර්තමාන HEAD වෙතින් කොමිට් 5 ක් බැලීමට පරිශීලකයා කැමති නම්, විධානය වේ git rebase -i HEAD~5
.
<after-this-commit>
කුමක්ද?
<after-this-commit>
X + 1 කැපවීම, එනම් ඔබට ස්කොෂ් කිරීමට අවශ්ය පැරණිතම කැපවීමේ මාපිය.
rebase -i
ප්රවේශය සහ reset --soft
ඇත, rebase -i
, මට සිදු කතෘ රඳවා ගැනීමට ඉඩ ඇති අතර reset --soft
කැපවිය මට ඉඩ දෙයි. සමහර විට කර්තෘගේ තොරතුරු නඩත්තු කරමින් අදින්න ඉල්ලීම් ස්කොෂ් කිරීමට මට අවශ්යය. සමහර විට මට මගේම කොමිස් මත මෘදු ලෙස නැවත සකස් කිරීමට අවශ්ය වේ. කෙසේ වෙතත් විශිෂ්ට පිළිතුරු දෙකටම ඉහළට.
ඔබට මෙය නොමැතිව git rebase
හෝ පහසුවෙන් කළ හැකිය git merge --squash
. මෙම උදාහරණයේ දී, අපි අවසාන කොමිස් 3 ස්කොෂ් කරමු.
ඔබට මුල සිටම නව බැඳීම් පණිවිඩය ලිවීමට අවශ්ය නම්, මෙය ප්රමාණවත් වේ:
git reset --soft HEAD~3 &&
git commit
පවත්නා බැඳීම් පණිවිඩ සමඟ සංක්ෂිප්තව නව බැඳීම් පණිවිඩය සංස්කරණය කිරීම ආරම්භ කිරීමට ඔබට අවශ්ය නම් (එනම් පික් / ස්කොෂ් / ස්කොෂ් /… / ස්කොෂ් git rebase -i
උපදෙස් ලැයිස්තුවෙන් ඔබ ආරම්භ කරන දෙයට සමාන වේ ), එවිට ඔබට එම පණිවිඩ උපුටා ගෙන සමත් විය යුතුය. ඔවුන් වෙත git commit
:
git reset --soft HEAD~3 &&
git commit --edit -m"$(git log --format=%B --reverse HEAD..HEAD@{1})"
මෙම ක්රම දෙකම අන්තිම බැඳීම් තුනම එකම ආකාරයකින් නව අළුත් බැඳීමක් බවට පත් කරයි. මෘදු යළි පිහිටුවීම ඔබට ස්කොෂ් කිරීමට අවශ්ය නැති අවසාන කැපවීමට HEAD යලි යොමු කරයි. මෘදු යළි පිහිටුවීම මඟින් දර්ශකය හෝ වැඩ කරන ගස ස්පර්ශ නොකෙරෙන අතර, ඔබගේ නව කැපවීම සඳහා දර්ශකය අපේක්ෂිත තත්වයේ තබයි (එනම්, ඔබ දැනටමත් "ඉවත දැමීමට" යන කොමිස් වලින් සියලු වෙනස්කම් දැනටමත් ඇත).
git rebase --squash-recent
, හෝ git commit --amend-many
.
branch@{upstream}
(හෝ @{upstream}
වර්තමාන ශාඛාව සඳහා පමණි; අවස්ථා දෙකේදීම, අවසාන කොටස කෙටියෙන් දැක්විය හැකිය @{u}
; gitrevisions බලන්න ). මෙය ඔබගේ “අන්තිම තල්ලු කළ කැපවීම” ට වඩා වෙනස් විය හැකිය (උදා: ඔබේ නවතම තල්ලුව මත ගොඩනඟන ලද යමක් වෙනත් අයෙකු තල්ලු කර ඔබ එය ලබා ගත්තේ නම්), නමුත් එය ඔබට අවශ්ය දේට සමීප විය හැකි බව පෙනේ.
push -f
නමුත් වෙනත් ආකාරයකින් එය සුන්දර විය, ස්තූතියි.
git push --force
පසුව එය භාවිතා කිරීමට අවශ්ය වන අතර ඒ සඳහා කැපවීම අවශ්ය වේ
ඔබට git merge --squash
මේ සඳහා භාවිතා කළ හැකිය , එය වඩා තරමක් අලංකාරයි git rebase -i
. ඔබ ස්වාමියා යැයි සිතමු, ඔබට අවසාන කොමිස් 12 එකකට දැමිය යුතුය.
අවවාදයයි: පළමුව ඔබ ඔබේ කාර්යය ඉටු කරන බවට වග බලා ගන්න git status
clean පිරිසිදු බව පරීක්ෂා කරන්න ( git reset --hard
වේදිකාගත කර ඇති සහ වේදිකාගත නොවූ වෙනස්කම් ඉවත දමනු ඇත)
ඉන්පසු:
# Reset the current branch to the commit just before the last 12:
git reset --hard HEAD~12
# HEAD@{1} is where the branch was just before the previous command.
# This command sets the state of the index to be as it would just
# after a merge from that commit:
git merge --squash HEAD@{1}
# Commit those squashed changes. The commit message will be helpfully
# prepopulated with the commit messages of all the squashed commits:
git commit
මෙම සඳහා ලේඛගතකිරීමgit merge
විස්තර කරන --squash
වඩාත් විස්තර විකල්පය.
යාවත්කාලීන කිරීම:git reset --soft HEAD~12 && git commit
ක්රිස් ජොන්සන් විසින් ඔහුගේ පිළිතුරෙන් යෝජනා කර ඇති සරල ක්රමයට වඩා මෙම ක්රමයේ ඇති එකම සැබෑ වාසිය නම්, ඔබ කොටු කරන සෑම කැපවීමේ පණිවිඩයක් සමඟම සූදානම් කළ බැඳීම් පණිවිඩය ඔබට ලැබීමයි.
git rebase -i
, නමුත් ඔබ එයට හේතුවක් නොදක්වයි. මෙය තාවකාලිකව -1 කිරීම ඇත්ත වශයෙන්ම ප්රතිවිරුද්ධ දෙය සත්යයක් බවත් මෙය අනවසරයෙන් සිදුවන බවත් මට පෙනේ. විශේෂයෙන් නිර්මාණය කර ඇති git merge
එක් දෙයක් කිරීමට බල කිරීම සඳහා ඔබ අවශ්ය ප්රමාණයට වඩා විධාන ක්රියාත්මක කරන්නේ git rebase
නැද්ද?
git merge --squash
ද තිර රචනය භාවිතා කිරීමට පහසු වේ. අත්යවශ්යයෙන්ම, තර්කය වූයේ මේ සඳහා ඔබට "අන්තර් ක්රියාකාරිත්වය" කිසිසේත් අවශ්ය නොවන git rebase -i
බවයි.
git merge --squash
නම්, නැවත ප්රතිස්ථාපනය කිරීමට සාපේක්ෂව චලනයන් / මකාදැමීම් / නම් කිරීම් හමුවේ ඒකාබද්ධ කිරීමේ ගැටුම් ඇතිවීමට ඇති ඉඩකඩ අඩුය, විශේෂයෙන් ඔබ ප්රාදේශීය ශාඛාවකින් ඒකාබද්ධ වන්නේ නම්. (වියාචනය: එක් අත්දැකීමක් මත පදනම්ව, සාමාන්ය
HEAD@{1}
git reset
හැකි සෑම විටම වළක්වා ගැනීමට මම නිර්දේශ කරමි - විශේෂයෙන් Git-novices සඳහා. කොමිස් ගණනාවක් මත පදනම්ව ක්රියාවලියක් ස්වයංක්රීය කිරීමට ඔබට අවශ්ය නොවන්නේ නම්, අඩු විදේශීය ක්රමයක් ඇත ...
git merge --squash (working branch name)
git commit
බැඳීම් පණිවිඩය ස්කොෂ් මත පදනම්ව සකස් කරනු ලැබේ.
gitk
කරන්නේ ඔබ ස්කොෂ් කරන කේත රේඛාව ලේබල් කිරීමට GUI අතුරුමුහුණත භාවිතා කිරීම සහ ස්කොෂ් කළ යුතු පදනම ලේබල් කිරීමයි. සාමාන්ය අවස්ථාවේ දී, මෙම ලේබල දෙකම දැනටමත් පවතිනු ඇත, එබැවින් පියවර (1) මඟ හැරිය හැක.
git branch your-feature && git reset --hard HEAD~N
වඩාත් පහසුම ක්රමය සොයාගෙන ඇත. කෙසේ වෙතත්, එයට නැවත git reset ඇතුළත් වේ, මෙම පිළිතුර වළක්වා ගැනීමට උත්සාහ කළේය.
ක්රිස් ජොන්සන්ගේ පිළිතුර මත පදනම්ව ,
බාෂ් වෙතින් ගෝලීය "ස්කොෂ්" අන්වර්ථයක් එක් කරන්න: (හෝ වින්ඩෝස් හි Git Bash)
git config --global alias.squash '!f(){ git reset --soft HEAD~${1} && git commit --edit -m"$(git log --format=%B --reverse HEAD..HEAD@{1})"; };f'
... හෝ වින්ඩෝස් විධාන විමසුම භාවිතා කිරීම:
git config --global alias.squash "!f(){ git reset --soft HEAD~${1} && git commit --edit -m\"$(git log --format=%B --reverse HEAD..HEAD@{1})\"; };f"
ඔබ ~/.gitconfig
දැන් මෙම අන්වර්ථය අඩංගු විය යුතුය:
[alias]
squash = "!f(){ git reset --soft HEAD~${1} && git commit --edit -m\"$(git log --format=%B --reverse HEAD..HEAD@{1})\"; };f"
භාවිතය:
git squash N
... ස්වයංක්රීයව අන්තිමයන් එකට එකතු කරයි N
ඇතුලත්, කරයි.
සටහන: ප්රති result ල වශයෙන් බැඳීමේ පණිවිඩය අනුපිළිවෙලින් සියලු වර්ගීකරණය කරන ලද කොමිස් වල එකතුවකි. ඔබ ඒ ගැන නොසතුටින් සිටී නම්, ඔබට එය සැමවිටම git commit --amend
අතින් වෙනස් කළ හැකිය . (නැතහොත්, ඔබේ රුචිකත්වයට ගැලපෙන ලෙස අන්වර්ථය සංස්කරණය කරන්න.)
git squash -m "New summary."
කර N
නොගත් කොමිස් ගණන ලෙස ස්වයංක්රීයව තීරණය කරමි.
git commit --amend
පණිවිඩය තවදුරටත් වෙනස් කිරීමට භාවිතා කළ හැකිය , නමුත් මෙම අන්වර්ථය මඟින් කැපවීමේ පණිවිඩයේ තිබිය යුතු දේ පිළිබඳව හොඳ ආරම්භයක් ලබා ගැනීමට ඔබට ඉඩ සලසයි.
මෙම හුරුබුහුටි බ්ලොග් සටහනට ස්තූතියි, ඔබට මෙම විධානය භාවිතා කර අවසාන කොමිස් 3 ස්කොෂ් කිරීමට හැකි බව මට පෙනී ගියේය:
git rebase -i HEAD~3
ඔබ ලුහුබැඳීමේ තොරතුරු / දුරස්ථ ගබඩාවක් නොමැති ප්රාදේශීය ශාඛාවක සිටියදී පවා මෙය ක්රියාත්මක වන බැවින් මෙය පහසුය.
විධානය මඟින් අන්තර්ක්රියාකාරී නැවත සැකසුම් සංස්කාරකය විවෘත කරනු ඇති අතර එමඟින් සාමාන්ය පරිදි නැවත සකස් කිරීමට, ස්කොෂ් කිරීමට, නැවත සැකසීමට ඉඩ දේ.
අන්තර්ක්රියාකාරී නැවත සැකසුම් සංස්කාරකය භාවිතා කිරීම:
අන්තර්ක්රියාකාරී ප්රතිස්ථාපන සංස්කාරකය අවසාන කොමිස් තුන පෙන්වයි. මෙම සීමාව තීරණය කරනු HEAD~3
ලැබුවේ විධානය ක්රියාත්මක කිරීමේදී ය git rebase -i HEAD~3
.
නවතම කැපවීම, HEAD
පළමුවන පේළියේ දර්ශනය වේ. A #
වලින් ආරම්භ වන රේඛා අදහස් / ලේඛන වේ.
පෙන්වන ලියකියවිලි ඉතා පැහැදිලිය. ඕනෑම රේඛාවක ඔබට pick
විධානය ඔබේ අභිමතය පරිදි වෙනස් කළ හැකිය .
මම විධානය භාවිතා කිරීමට කැමතියි fixup
ඉහත රේඛාවෙහි ඇති බැඳීමෙහි කැපවීම වෙනස් කරන අතර බැඳීමේ පණිවිඩය බැහැර කරන බැවින් කිරීමට කැමැත්තෙමි.
1 වන පේළියේ ඇති බැඳීම ලෙස HEAD
, බොහෝ අවස්ථාවන්හිදී ඔබ මෙය අත්හරිනු ඇත pick
. ඔබට භාවිතා කළ නොහැක squash
හෝ fixup
වෙනත් බැඳීමක් නොමැති නිසා.
ඔබට කොමිස් අනුපිළිවෙලද වෙනස් කළ හැකිය. මෙය කාලානුක්රමිකව යාබද නොවන ස්කොෂ් හෝ සවි කිරීම් සිදු කිරීමට ඔබට ඉඩ සලසයි.
ප්රායෝගික එදිනෙදා උදාහරණයක්
මම මෑතකදී නව අංගයක් කර ඇත. එතැන් සිට, මම දෝෂ නිවැරදි කිරීම් දෙකක් කර ඇත. නමුත් දැන් මම කළ නව අංගයේ දෝෂයක් (හෝ අක්ෂර වින්යාස දෝෂයක්) සොයාගෙන ඇත. කෙතරම් කරදරකාරීද! මගේ කැපවීමේ ඉතිහාසය දූෂණය කරන නව බැඳීමක් මට අවශ්ය නැත!
මම කරන පළමු දෙය නම් වැරැද්ද නිවැරදි කර අදහස් දැක්වීම සමඟ නව බැඳීමක් ඇති කිරීමයි squash this into my new feature!
.
මම පසුව ධාවනය කර git log
හෝ gitk
නව අංගයේ SHA ලබා ගනිමි (මේ අවස්ථාවේ දී 1ff9460
).
ඊළඟට, මම සමඟ අන්තර්ක්රියාකාරී නැවත සැකසුම් සංස්කාරකය ගෙන එන්නෙමි git rebase -i 1ff9460~
. මෙම ~
එම සිදු ෂා පසුව සංස්කාරකයේ සිදු ඇතුළත් කිරීමට කර්තෘ කියයි.
ඊළඟට, මම දෝෂ නිවැරදි අඩංගු (සිදු චලනය fe7f1e0
) සිදු විශේෂාංගය යට, සහ වෙනස් කිරීම pick
සඳහාfixup
.
සංස්කාරකය වසා දමන විට, නිවැරදි කිරීම විශේෂාංගයේ කැපවීම හා මගේ කැපවීමේ ඉතිහාසය ලස්සන හා පිරිසිදු ලෙස පෙනෙනු ඇත!
සියලුම කොමිස් දේශීය වූ විට මෙය හොඳින් ක්රියාත්මක වේ, නමුත් ඔබ දැනටමත් දුරස්ථයට තල්ලු කර ඇති ඕනෑම කොමිස් වෙනස් කිරීමට උත්සාහ කරන්නේ නම්, එකම ශාඛාව පරීක්ෂා කර ඇති අනෙකුත් ඩෙව්වරුන්ට ඔබට සැබවින්ම ගැටළු ඇති කළ හැකිය!
pick
1 වන පේළියේ තබන්න . ඔබ තෝරා ගන්නේ නම් squash
හෝ fixup
1 වන පේළියේ බැඳීම සඳහා නම්, git මඟින් "දෝෂයක්: පෙර කැපවීමකින් තොරව 'නිවැරදි කළ නොහැක' 'යනුවෙන් පණිවිඩයක් පෙන්වනු ඇත. එවිට එය නිවැරදි කිරීමට ඔබට විකල්පයක් ලබා දෙනු ඇත: "ඔබට මෙය 'git rebase --edit-todo' සමඟ සවි කර 'git rebase --continue' ධාවනය කළ හැකිය." නැතහොත් ඔබට ගබ්සා කර නැවත ආරම්භ කළ හැකිය: "නැතහොත් ඔබට 'git rebase --abort' සමඟ නැවත ගෙවීම නතර කළ හැකිය."
ඔබ TortoiseGit භාවිතා කරන්නේ නම්, ඔබට ශ්රිතය කළ හැකිය Combine to one commit
:
Show Log
Combine to one commit
සන්දර්භය මෙනුවෙන් තෝරන්නමෙම ශ්රිතය අවශ්ය සියලුම තනි පියවර පියවර ස්වයංක්රීයව ක්රියාත්මක කරයි. අවාසනාවට වින්ඩෝස් සඳහා පමණි.
මෙය සිදු කිරීම සඳහා ඔබට පහත දැක්වෙන git විධානය භාවිතා කළ හැකිය.
git rebase -i HEAD~n
n (= 4 මෙහි) යනු අවසාන කැපවීමේ සංඛ්යාවයි. එවිට ඔබට පහත විකල්ප ඇත,
pick 01d1124 Message....
pick 6340aaa Message....
pick ebfd367 Message....
pick 30e0ccb Message....
pick
එක් කැපවීමකට පහළින් සහ squash
අනෙක් ඒවා නවතම ඒවාට යාවත්කාලීන කරන්න ,
p 01d1124 Message....
s 6340aaa Message....
s ebfd367 Message....
s 30e0ccb Message....
වැඩි විස්තර සඳහා සබැඳිය ක්ලික් කරන්න
මෙම ලිපිය මත පදනම්ව මෙම ක්රමය මගේ භාවිතයට පහසු බව මට පෙනී ගියේය.
මගේ 'දේව්' ශාඛාව කොමිට් 96 කින් 'සම්භවය / දේව්' ට වඩා ඉදිරියෙන් සිටියි (එබැවින් මෙම කොමිස් තවමත් දුරස්ථයට තල්ලු කර නැත).
වෙනස තල්ලු කිරීමට පෙර මෙම බැඳීම් එකකට බෙදීමට මට අවශ්ය විය. ශාඛාව 'සම්භවය / දේව්' තත්වයට යලි පිහිටුවීමට මම කැමැත්තෙමි (මෙය 96 කමිටු 96 හි සියලු වෙනස්කම් අස්ථිර වනු ඇත) ඉන්පසු වෙනස්කම් එකවර සිදු කරයි:
git reset origin/dev
git add --all
git commit -m 'my commit message'
ශාඛාව තුළ ඔබ කොමිස් ඒකාබද්ධ කිරීමට කැමති, ධාවනය කරන්න:
git rebase -i HEAD~(n number of commits back to review)
උදාහරණයක්:
git rebase -i HEAD~1
මෙය පෙළ සංස්කාරකය විවෘත කරනු ඇති අතර, මෙම බැඳීම් එකට ඒකාබද්ධ කිරීමට ඔබ කැමති නම්, ඔබ එක් එක් බැඳීම ඉදිරිපිට 'ස්කොෂ්' සමඟ 'පික්' මාරු කළ යුතුය. ප්රලේඛනයෙන්:
නිදසුනක් ලෙස, ඔබ සියලු කොමිස් එකකට ඒකාබද්ධ කිරීමට බලාපොරොත්තු වන්නේ නම්, 'පික්' යනු ඔබ කළ පළමු කැපවීම වන අතර අනාගත සියලු දේ (පළමුවැන්නාට පහළින් තබා) 'ස්කොෂ්' ලෙස සැකසිය යුතුය. Vim භාවිතා කරන්නේ නම්, භාවිතා කරන්න : x සංස්කාරකය සුරැකීමට සහ පිටවීමට ඇතුළු කිරීමේ ප්රකාරයේදී කරන්න.
ප්රතිප්රහාරය දිගටම කරගෙන යාමට:
git rebase --continue
මේ පිළිබඳ වැඩි විස්තර සහ ඔබගේ බැඳීම් ඉතිහාසය නැවත ලිවීමට වෙනත් ක්රම සඳහා මෙම ප්රයෝජනවත් ලිපිය බලන්න
--continue
සහ vim :x
කරන්නේ කුමක්ද යන්න පැහැදිලි කරන්න .
Anomies පිළිතුර හොඳයි, නමුත් මට මේ ගැන අනාරක්ෂිත බවක් දැනුණා, ඒ නිසා මම තිරපිටපත් කිහිපයක් එකතු කිරීමට තීරණය කළා.
ඔබ සිටින්නේ කොහේදැයි බලන්න git log
. වැදගත්ම දෙය නම්, ඔබට ස්කොෂ් කිරීමට අවශ්ය නැති පළමු කැපවීමේ හෑෂ් සොයා ගන්න . එබැවින්:
git rebase -i [your hash]
මගේ නඩුවේ ක්රියාත්මක කරන්න :
$ git rebase -i 2d23ea524936e612fae1ac63c95b705db44d937d
මගේ නඩුවේදී, මට අවශ්ය වන්නේ පළමු වරට කළ කැපවීම මත සියල්ල ස්කොෂ් කිරීමට ය. ඇණවුම මුල සිට අග දක්වා වේ, එබැවින් හරියටම අනෙක් ආකාරයට git log
. මගේ නඩුවේ, මට අවශ්යයි:
ඔබ එක් කැපවීමක් පමණක් තෝරාගෙන ඉතිරි කොටස කොටු කර ඇත්නම්, ඔබට එක් කැපවීමේ පණිවිඩයක් සකස් කළ හැකිය:
ඒක තමයි. ඔබ මෙය ( :wq
) සුරකින ලද පසු , ඔබ අවසන්. ඒ දෙස බලන්න git log
.
git log
1) කැපවූ කෙටි හැෂ් හඳුනා ගන්න
# git log --pretty=oneline --abbrev-commit
abcd1234 Update to Fix for issue B
cdababcd Fix issue B
deab3412 Fix issue A
....
මෙතන පවා git log --oneline
ද කෙටි හැෂ් ලබා ගැනීමට භාවිතා කළ හැක.
2) ඔබට ස්කොෂ් කිරීමට අවශ්ය නම් (ඒකාබද්ධ කිරීම) අවසාන කැපවීම දෙක
# git rebase -i deab3412
3) මෙය nano
ඒකාබද්ධ කිරීම සඳහා සංස්කාරකයක් විවෘත කරයි . එය පහතින් පෙනේ
....
pick cdababcd Fix issue B
pick abcd1234 Update to Fix for issue B
....
4) පෙර ඇති වචනය pick
නැවත squash
නම් කරන්න abcd1234
. නැවත නම් කිරීමෙන් පසු එය පහත පරිදි විය යුතුය.
....
pick cdababcd Fix issue B
squash abcd1234 Update to Fix for issue B
....
5) දැන් nano
සංස්කාරකය සුරකින්න සහ වසා දමන්න. මාධ්ය ctrl + o
හා මුද්රිත මාධ්ය Enter
බේරා ගැනීමට. ඉන්පසු ctrl + x
සංස්කාරකයෙන් පිටවීමට ඔබන්න .
6) පසුව nano
අදහස් යාවත්කාලීන කිරීම සඳහා සංස්කාරකය නැවත විවෘත කරයි, අවශ්ය නම් එය යාවත්කාලීන කරන්න.
7) දැන් එය සාර්ථකව කොටු වී ඇත, ඔබට ලොග් පරීක්ෂා කිරීමෙන් එය සත්යාපනය කළ හැකිය.
# git log --pretty=oneline --abbrev-commit
1122abcd Fix issue B
deab3412 Fix issue A
....
8) දැන් repo වෙත තල්ලු කරන්න. +
ශාඛා නාමයට පෙර ලකුණක් එක් කිරීමට සටහන . මෙයින් අදහස් කරන්නේ බලෙන් තල්ලු කිරීමයි.
# git push origin +master
සටහන: මෙය පදනම් වී ඇත්තේ ubuntu
ෂෙල් මත git භාවිතා කිරීම මත ය . ඔබ විවිධ os ( Windows
හෝ Mac
) භාවිතා කරන්නේ නම් ඉහත විධානයන් සංස්කාරකය හැර සමාන වේ. ඔබට වෙනස් සංස්කාරකයක් ලැබෙනු ඇත.
git add <files>
--fixup
විකල්පය භාවිතා කරමින් කැපවීම සහ මෙම OLDCOMMIT
බැඳීම ඒකාබද්ධ කිරීමට (ස්කොෂ්) අවශ්ය විය යුතුය.git commit --fixup=OLDCOMMIT
දැන් මෙය HEAD සමඟ නව බැඳීමක් ඇති කරයි fixup1 <OLDCOMMIT_MSG>
.
OLDCOMMIT
.git rebase --interactive --autosquash OLDCOMMIT^
මෙහි ^
අර්ථය වන්නේ පෙර කළ කැපවීමයි OLDCOMMIT
. මෙම rebase
විධානය සංස්කාරකයක (vim හෝ නැනෝ) අන්තර්ක්රියාකාරී කවුළුවක් විවෘත කරයි, අපට කිසිවක් කිරීමට අවශ්ය නොවන අතර ඉතිරි කිරීම සහ පිටවීම ප්රමාණවත් වේ. මක්නිසාද යත්, මේ සඳහා ලබා දී ඇති විකල්පය ස්වයංක්රීයව නවතම බැඳීම පැරණි බැඳීමට යාබදව ගෙන යන අතර ක්රියාකාරිත්වය වෙනස් කරයිfixup
(ස්කොෂ් වලට සමාන) . ඉන්පසු නැවත ගෙවීම දිගටම කරගෙන යයි.
--amend
භාවිතා කළ හැකිය git-commit
. # git log --pretty=oneline --abbrev-commit
cdababcd Fix issue B
deab3412 Fix issue A
....
# git add <files> # New changes
# git commit --amend
# git log --pretty=oneline --abbrev-commit
1d4ab2e1 Fix issue B
deab3412 Fix issue A
....
මෙන්න --amend
නව වෙනස්කම් අන්තිම බැඳීමට ඒකාබද්ධ කර නව බැඳීම් cdababcd
හැඳුනුම්පතක් ජනනය කරයි1d4ab2e1
අන්තිම කොමිස් 10 තනි කැපවීමකට බෙදීමට:
git reset --soft HEAD~10 && git commit -m "squashed commit"
ඔබට දුරස්ථ ශාඛාව ස්කොෂ් කැපවීම සමඟ යාවත්කාලීන කිරීමට අවශ්ය නම්:
git push -f
ඔබ feature-branch
රන් ගබඩාවක ( golden_repo_name
) ක්ලෝන කරන ලද දුරස්ථ ශාඛාවක (කැඳවනු ලැබේ ) නම්, එවිට ඔබගේ කැපවීම් එකකට බෙදීමේ තාක්ෂණය මෙන්න:
රන් ගබඩාව පරීක්ෂා කරන්න
git checkout golden_repo_name
එයින් නව ශාඛාවක් සාදන්න (ගෝල්ඩන් රෙපෝ) පහත පරිදි වේ
git checkout -b dev-branch
ස්කොෂ් ඔබ දැනටමත් ඇති ඔබේ ප්රාදේශීය ශාඛාව සමඟ ඒකාබද්ධ කරන්න
git merge --squash feature-branch
ඔබගේ වෙනස්කම් සිදු කරන්න (dev ශාඛාවේ ඇති එකම කැපවීම මෙය වනු ඇත)
git commit -m "My feature complete"
ඔබේ දේශීය ගබඩාවට ශාඛාව තල්ලු කරන්න
git push origin dev-branch
සැබවින්ම පහසු විය හැකි දේ:
ඔබට ඉහළින් ස්කොෂ් කිරීමට අවශ්ය කැපවීමේ හැෂ් සොයා ගන්න, කියන්න d43e15
.
දැන් භාවිතා කරන්න
git reset d43e15
git commit -am 'new commit name'
මෙය සුපිරි ඩුපර් ක්ලඩ්ජි, නමුත් එක්තරා ආකාරයක සිසිල් ආකාරයකින්, එබැවින් මම එය වළල්ලට විසි කරන්නෙමි:
GIT_EDITOR='f() { if [ "$(basename $1)" = "git-rebase-todo" ]; then sed -i "2,\$s/pick/squash/" $1; else vim $1; fi }; f' git rebase -i foo~5 foo
පරිවර්තනය: git සඳහා නව "සංස්කාරකයක්" ලබා දෙන්න, එය සංස්කරණය කළ යුතු ගොනු නාමය නම් git-rebase-todo
(අන්තර්ක්රියාකාරී ප්රතිස්ථාපන විමසුම) පළමු "තේරීම" හැර "ස්කොෂ්" ලෙස සියල්ල වෙනස් කරයි, එසේ නොමැතිනම් විම් හට ගනී - එවිට ඔබෙන් විමසනු ඇත ස්කොෂ් කළ කැපවීමේ පණිවිඩය සංස්කරණය කිරීමට, ඔබට විකාරයක් ලැබේ. .
මාක් ලොන්ගෙයාර් යෝජනා කළ දේ මම බොහෝ විට කරන්නෙමි .
සෑම කැපවීමක්ම තනි කැපවීමකට ලක් කිරීමට ඔබට අවශ්ය නම් (උදා: පළමු වරට ව්යාපෘතියක් ප්රසිද්ධියේ නිකුත් කරන විට), උත්සාහ කරන්න:
git checkout --orphan <new-branch>
git commit
මා සිතන්නේ මෙය කිරීමට ඇති පහසුම ක්රමය වන්නේ මාස්ටර් මත පදනම්ව නව ශාඛාවක් සෑදීම සහ merge --squash
විශේෂාංග ශාඛාවෙන් එකක් කිරීමයි.
git checkout master
git checkout -b feature_branch_squashed
git merge --squash feature_branch
එවිට ඔබට සියලු වෙනස්කම් කිරීමට සූදානම්.
උදාහරණයක් ලෙස ඔබට ශාඛාවක (දුරස්ථ නිධිය) තනි කැපවීමකට අවසන් කැපීම් 3 ක් ස්කොෂ් කිරීමට අවශ්ය නම්: https://bitbucket.org
මම කළේ එයයි
git reset --soft Head~3
git commit
git push origin <branch_name> --force
සෑම විටම ක්රියාත්මක වන සරල එක්-ලයිනර්, ඔබ දැනට ස්කොෂ් කිරීමට අවශ්ය ශාඛාවේ සිටින නිසා, ස්වාමියා එය ආරම්භ කළ ශාඛාව වන අතර, නවතම කැපවීම තුළ ඔබ භාවිතා කිරීමට කැමති කැපවීමේ පණිවිඩය සහ කතුවරයා ඇතුළත් වේ:
git reset --soft $(git merge-base HEAD master) && git commit --reuse-message=HEAD@{1}
(MASTER)
Fleetwood Mac Fritz
║ ║
Add Danny Lindsey Stevie
Kirwan Buckingham Nicks
║ ╚═══╦══════╝
Add Christine ║
Perfect Buckingham
║ Nicks
LA1974══════════╝
║
║
Bill <══════ YOU ARE EDITING HERE
Clinton (CHECKED OUT, CURRENT WORKING DIRECTORY)
Https://github.com/fleetwood-mac/band-history ගබඩාවේ මෙම ඉතා සංක්ෂිප්ත ඉතිහාසය තුළ, බිල් ක්ලින්ටන් මුල් ( MASTER
) ෆ්ලීට්වුඩ් මැක් බැඳීමට බැඳී ඇති බිල් ක්ලින්ටන් සමඟ ඒකාබද්ධ කිරීම සඳහා ඔබ ඉල්ලීමක් විවෘත කර තිබේ .
ඔබ අදින්න ඉල්ලීමක් විවෘත කළ අතර GitHub හි මෙය ඔබට පෙනේ:
කොමිස් හතරක්:
සම්පුර්ණ නිධිය ඉතිහාසය කියවීමට කිසිවෙකු උනන්දු නොවනු ඇතැයි සිතීම. (ඇත්ත වශයෙන්ම ගබඩාවක් තිබේ, ඉහත සබැඳිය ක්ලික් කරන්න!) ඔබ මෙම කොමිස් ස්කොෂ් කිරීමට තීරණය කරයි. ඉතින් ඔයා ගිහින් දුවන්න git reset --soft HEAD~4 && git commit
. git push --force
ඔබේ PR පිරිසිදු කිරීම සඳහා ඔබ එය GitHub වෙත යොමු කරයි.
මොකද වෙන්නේ? ඔබ ෆ්රිට්ස් සිට බිල් ක්ලින්ටන් දක්වා තනි කැපවීමක් කළා. ඊයේ ඔබ මෙම ව්යාපෘතියේ බකිංහැම් නික්ස් අනුවාදයේ වැඩ කරමින් සිටි බව ඔබට අමතක වූ බැවිනි. හා git log
ඔබ GitHub දකින දේ හා නොගැලපේ.
git checkout
ඔවුන්git reset --soft
බවgit commit
වෙතින් සෘජු warps බව සිට වෙත කිරීමටgit rebase -i HEAD^^
මෙහි s හි ගණන X වේ
(මේ අවස්ථාවේ දී, අවසන් කොමිස් දෙක ස්කොෂ් කරන්න)
වෙනත් විශිෂ් answer පිළිතුරු වලට අමතරව git rebase -i
, කැපවීමේ අනුපිළිවෙල සමඟ මා නිතරම ව්යාකූල වන්නේ කෙසේද යන්න එක් කිරීමට මම කැමතියි - අලුත් ඒවාට වඩා පැරණි හෝ අනෙක් අතට? ඉතින් මෙය මගේ කාර්ය ප්රවාහයයි:
git rebase -i HEAD~[N]
, ෙමහිදී N මම, බැඳීමට අවශ්ය අනාචාරයේ සංඛ්යාව වේ වඩාත් ම මෑත එක් සිට බලපැවැත්වෙන . ඒ නිසාgit rebase -i HEAD~5
"අන්තිම කොමිස් 5 නව එකක් බවට ස්කොෂ් කරන්න";මේ වගේ වැඩ ප්රවාහයකට අදාළ ප්රශ්නයට පිළිතුරක් ගැන කුමක් කිව හැකිද?
merge --squash
PR ට පසුව සංවර්ධකයාට පහසු වනු ඇත , නමුත් කණ්ඩායම සිතුවේ එය ක්රියාවලිය මන්දගාමී වනු ඇති බවයි.)මම මේ පිටුවේ ඒ වගේ වැඩ ප්රවාහයක් දැකලා නැහැ. (එය මගේ ඇස් විය හැකිය.) මම rebase
නිවැරදිව තේරුම් ගන්නේ නම් , බහුවිධ ඒකාබද්ධ කිරීම් සඳහා ගැටුම් නිරාකරණ අවශ්ය වේ . මට ඒ ගැන හිතන්නවත් අවශ්ය නැහැ!
ඉතින්, මෙය අපට වැඩ කරන බව පෙනේ.
git pull master
git checkout -b new-branch
git checkout -b new-branch-temp
git checkout new-branch
git merge --squash new-branch-temp
// සියලු වෙනස්කම් වේදිකාවේ තබයිgit commit 'one message to rule them all'
git push
මට වඩා සාමාන්ය විසඳුමක් වන්නේ 'එන්' කොමිස් නියම කිරීම නොව, ඔබට ඉහළින් ස්කොෂ් කිරීමට අවශ්ය ශාඛාව / කැපවීමේ හැඳුනුම්පතයි. නිශ්චිත බැඳීමක් දක්වා වූ ගණන් කිරීමකට වඩා මෙය අඩු දෝෂ සහිත වේ the ටැගය කෙලින්ම සඳහන් කරන්න, නැතහොත් ඔබට ඇත්තටම ගණන් කිරීමට අවශ්ය නම් ඔබට HEAD ~ N නියම කළ හැකිය.
මගේ කාර්ය ප්රවාහයේ දී, මම ශාඛාවක් ආරම්භ කරන අතර, එම ශාඛාව පිළිබඳ මගේ පළමු කැපවීම ඉලක්කය සාරාංශ කරයි (එනම් සාමාන්යයෙන් එය පොදු නිධිය වෙත විශේෂාංගය සඳහා වන 'අවසාන' පණිවිඩය ලෙස මම තල්ලු කරමි.) එබැවින් මම අවසන් වූ විට, සියල්ල මට කරන්න ඕන git squash master
පළමු පණිවිඩය වෙත ආපසු යාම සහ පසුව මම තල්ලු කිරීමට සූදානම්.
මම අන්වර්ථය භාවිතා කරමි:
squash = !EDITOR="\"_() { sed -n 's/^pick //p' \"\\$1\"; sed -i .tmp '2,\\$s/^pick/f/' \"\\$1\"; }; _\"" git rebase -i
මෙය ඉතිහාසය පෙරළා දැමීමට පෙර ඉවත දමනු ඇත - මෙය ඔබට ආපසු හැරවීමට අවශ්ය නම් පැරණි බැඳීම් හැඳුනුම්පතක් කොන්සෝලය වෙතින් උදුරා ගැනීමෙන් ඔබට යථා තත්වයට පත්වීමට අවස්ථාවක් ලබා දෙයි. (සොලාරිස් පරිශීලකයින් එය GNU sed -i
විකල්පය භාවිතා කරන බව සලකයි , මැක් සහ ලිනක්ස් භාවිතා කරන්නන් මේ සමඟ හොඳින් සිටිය යුතුය.)
git squash master
දාසයා පරීක්ෂා කරන විට භාවිතා කරමු. එය කුමක් සිදුවේද? අපි ගැටුම සඟවන්නද?
ප්රශ්නය එය "අන්තිම" යන්නෙන් අදහස් කරන්නේ කුමක්ද යන්න අපැහැදිලි විය හැකිය.
උදාහරණයක් ලෙස git log --graph
පහත සඳහන් ප්රතිදානයන් (සරල කරන ලද):
* commit H0
|
* merge
|\
| * commit B0
| |
| * commit B1
| |
* | commit H1
| |
* | commit H2
|/
|
කාලය අනුව අවසන් වරට සිදු කරනුයේ H0, ඒකාබද්ධ කිරීම, B0 ය. ඒවා ස්කොෂ් කිරීම සඳහා ඔබ ඒකාබද්ධ කළ ශාඛාව H1 මත නැවත ප්රතිස්ථාපනය කිරීමට සිදුවේ.
ගැටළුව වන්නේ H0 හි H1 සහ H2 අඩංගු වීමයි (සහ සාමාන්යයෙන් ඒකාබද්ධ වීමට පෙර සහ අතු බෙදීමෙන් පසුව වැඩි වැඩියෙන්) B0 නොමැති අතර. එබැවින් ඔබ අවම වශයෙන් H0, ඒකාබද්ධ කිරීම, H1, H2, B0 වෙතින් වෙනස්කම් කළමනාකරණය කළ යුතුය.
නැවත භාවිතා කිරීම භාවිතා කළ හැකි නමුත් වෙනස් ආකාරයකින් අනෙක් අය පිළිතුරු සඳහන් කර ඇත:
rebase -i HEAD~2
මෙය ඔබට තේරීම් විකල්ප පෙන්වනු ඇත (වෙනත් පිළිතුරු වල සඳහන් පරිදි):
pick B1
pick B0
pick H0
H0 වෙත තෝරා ගැනීම වෙනුවට ස්කොෂ් දමන්න:
pick B1
pick B0
s H0
සුරැකීම සහ පිටවීම නැවත ලබා දීමෙන් පසු H1 ට පසුව කොමිස් අදාළ වේ. එයින් අදහස් වන්නේ නැවත ගැටුම් නිරාකරණය කිරීමට එය ඔබෙන් අසනු ඇති බවයි (එහිදී මුලින් HEAD H1 වනු ඇති අතර ඒවා අදාළ වන විට ඒවා රැස් කරයි).
නැවත සකස් කිරීම අවසන් වූ පසු ඔබට ස්කොෂ් කළ H0 සහ B0 සඳහා පණිවිඩයක් තෝරා ගත හැකිය:
* commit squashed H0 and B0
|
* commit B1
|
* commit H1
|
* commit H2
|
PS ඔබ BO වෙත යම්කිසි යළි පිහිටුවීමක් කළහොත්: (නිදසුනක් ලෙස, එය භාවිතා reset --mixed
කිරීම වඩාත් විස්තරාත්මකව මෙහි විස්තර කර ඇත https://stackoverflow.com/a/18690845/2405850 ):
git reset --mixed hash_of_commit_B0
git add .
git commit -m 'some commit message'
ඉන්පසු ඔබ H0, H1, H2 හි B0 වෙනස්කම් වලට ස්කොෂ් කරයි (අතු බෙදීමෙන් පසුව හා ඒකාබද්ධ වීමට පෙර වෙනස්කම් සඳහා සම්පූර්ණයෙන්ම අහිමි වේ.