ස්කොෂ් මගේ අන්තිම X එකට Git භාවිතා කරයි


3602

මගේ අන්තිම X එක Git භාවිතා කරමින් එක කැපවීමකට සම්බන්ධ කරන්නේ කෙසේද?


12
සමාන ප්‍රශ්නය: stackoverflow.com/questions/7275508/…
koppor


2
@matt TortoiseGit ඔබේ මෙවලමයි. එය "එක් බැඳීමකට ඒකාබද්ධ කරන්න" යන තනි ශ්‍රිතයක් සපයන අතර එමඟින් පසුබිමේ සියලුම පියවර ස්වයංක්‍රීයව කැඳවනු ඇත. අවාසනාවට වින්ඩෝස් සඳහා පමණි. මගේ පිළිතුර පහතින් බලන්න.
මතියස් එම්

1
පළමු කැපවීම දක්වා ස්කොෂ්
goelakash

1
පෝස්ට් ස්කොෂ් එකක් කිරීමට බල කිරීම pushoverflow.com/questions/10298291/…
වික්‍රම්වි

Answers:


2097

අත්පොතේgit rebase -i <after-this-commit> විස්තර කර ඇති පරිදි දෙවන හා පසුව සිදුකරන "ස්කොෂ්" හෝ "සවි කිරීම" සමඟ "පික්" භාවිතා කර ප්‍රතිස්ථාපනය කරන්න .

මෙම උදාහරණයේ දී, <after-this-commit>SHA1 හැෂ් හෝ වත්මන් ශාඛාවේ HEAD වෙතින් සාපේක්ෂ පිහිටීම වේ. උදාහරණයක් ලෙස, අතීතයේ දී වර්තමාන HEAD වෙතින් කොමිට් 5 ක් බැලීමට පරිශීලකයා කැමති නම්, විධානය වේ git rebase -i HEAD~5.


260
මෙය, මෙම ප්‍රශ්නයට මඳක් හොඳ පිළිතුරක් සපයයි stackoverflow.com/a/5201642/295797
රෝයි ට

92
එයින් අදහස් කරන්නේ <after-this-commit>කුමක්ද?
2540625

43
<after-this-commit>X + 1 කැපවීම, එනම් ඔබට ස්කොෂ් කිරීමට අවශ්‍ය පැරණිතම කැපවීමේ මාපිය.
joozek

343
මෙම පිළිතුර නිසැකවම තේරුම් ගැනීමට අපහසු බව මට පෙනී ගියේය. උදාහරණයක් උපකාරවත් වන්නට ඇත.
ඉයන් ඔල්මන්

54
මෙම අතර වෙනස rebase -iප්රවේශය සහ reset --softඇත, rebase -i, මට සිදු කතෘ රඳවා ගැනීමට ඉඩ ඇති අතර reset --softකැපවිය මට ඉඩ දෙයි. සමහර විට කර්තෘගේ තොරතුරු නඩත්තු කරමින් අදින්න ඉල්ලීම් ස්කොෂ් කිරීමට මට අවශ්‍යය. සමහර විට මට මගේම කොමිස් මත මෘදු ලෙස නැවත සකස් කිරීමට අවශ්‍ය වේ. කෙසේ වෙතත් විශිෂ්ට පිළිතුරු දෙකටම ඉහළට.
zionyx

3842

ඔබට මෙය නොමැතිව 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 යලි යොමු කරයි. මෘදු යළි පිහිටුවීම මඟින් දර්ශකය හෝ වැඩ කරන ගස ස්පර්ශ නොකෙරෙන අතර, ඔබගේ නව කැපවීම සඳහා දර්ශකය අපේක්ෂිත තත්වයේ තබයි (එනම්, ඔබ දැනටමත් "ඉවත දැමීමට" යන කොමිස් වලින් සියලු වෙනස්කම් දැනටමත් ඇත).


165
හා! මම මේ ක්‍රමයට කැමතියි. එය ගැටලුවේ ආත්මයට සමීප වේ. එය එතරම්ම වොඩූ අවශ්‍ය වීම කණගාටුවට කරුණකි. මෙවැනි දෙයක් මූලික විධානයකට එක් කළ යුතුය. සමහරවිට git rebase --squash-recent, හෝ git commit --amend-many.
ඒඩ්‍රියන් රත්නපාල

13
BABB: ඔබේ ශාඛාවට “උඩුමහලේ” කට්ටලයක් තිබේ නම්, ඔබට භාවිතා කිරීමට හැකිය branch@{upstream}(හෝ @{upstream}වර්තමාන ශාඛාව සඳහා පමණි; අවස්ථා දෙකේදීම, අවසාන කොටස කෙටියෙන් දැක්විය හැකිය @{u}; gitrevisions බලන්න ). මෙය ඔබගේ “අන්තිම තල්ලු කළ කැපවීම” ට වඩා වෙනස් විය හැකිය (උදා: ඔබේ නවතම තල්ලුව මත ගොඩනඟන ලද යමක් වෙනත් අයෙකු තල්ලු කර ඔබ එය ලබා ගත්තේ නම්), නමුත් එය ඔබට අවශ්‍ය දේට සමීප විය හැකි බව පෙනේ.
ක්‍රිස් ජොන්සන්

104
මේ කාරුණික ක්‍රියාව මට අවශ්‍ය වූ push -fනමුත් වෙනත් ආකාරයකින් එය සුන්දර විය, ස්තූතියි.
2rs2ts

39
Rs 2rs2ts git push -f ශබ්දය භයානකයි. ස්කොෂ් දේශීය කොමිස් පමණක් ගැන සැලකිලිමත් වන්න. තල්ලු කළ කොමිස් ස්පර්ශ නොකරන්න!
මතියස් එම්

20
මට git push --forceපසුව එය භාවිතා කිරීමට අවශ්‍ය වන අතර ඒ සඳහා කැපවීම අවශ්‍ය වේ
Zach Saucier

740

ඔබට git merge --squashමේ සඳහා භාවිතා කළ හැකිය , එය වඩා තරමක් අලංකාරයි git rebase -i. ඔබ ස්වාමියා යැයි සිතමු, ඔබට අවසාන කොමිස් 12 එකකට දැමිය යුතුය.

අවවාදයයි: පළමුව ඔබ ඔබේ කාර්යය ඉටු කරන බවට වග බලා ගන්න git statusclean පිරිසිදු බව පරීක්ෂා කරන්න ( 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 ක්‍රිස් ජොන්සන් විසින් ඔහුගේ පිළිතුරෙන් යෝජනා කර ඇති සරල ක්‍රමයට වඩා මෙම ක්‍රමයේ ඇති එකම සැබෑ වාසිය නම්, ඔබ කොටු කරන සෑම කැපවීමේ පණිවිඩයක් සමඟම සූදානම් කළ බැඳීම් පණිවිඩය ඔබට ලැබීමයි.


16
ඔබ කියන්නේ මෙය වඩා අලංකාරයි කියා git rebase -i, නමුත් ඔබ එයට හේතුවක් නොදක්වයි. මෙය තාවකාලිකව -1 කිරීම ඇත්ත වශයෙන්ම ප්‍රතිවිරුද්ධ දෙය සත්‍යයක් බවත් මෙය අනවසරයෙන් සිදුවන බවත් මට පෙනේ. විශේෂයෙන් නිර්මාණය කර ඇති git mergeඑක් දෙයක් කිරීමට බල කිරීම සඳහා ඔබ අවශ්‍ය ප්‍රමාණයට වඩා විධාන ක්‍රියාත්මක කරන්නේ git rebaseනැද්ද?
මාර්ක් අමරි

78
Ark මාක් අමරි: මෙය වඩාත් අලංකාර යැයි මා පැවසීමට විවිධ හේතු තිබේ. නිදසුනක් ලෙස, එය අනවශ්‍ය ලෙස සංස්කාරකයක් බිහි කිරීම හා "කළ යුතු" ගොනුවේ නූලක් සෙවීම සහ ප්‍රතිස්ථාපනය කිරීම ඇතුළත් නොවේ. භාවිතා git merge --squashද තිර රචනය භාවිතා කිරීමට පහසු වේ. අත්යවශ්යයෙන්ම, තර්කය වූයේ මේ සඳහා ඔබට "අන්තර් ක්රියාකාරිත්වය" කිසිසේත් අවශ්ය නොවන git rebase -iබවයි.
මාර්ක් ලෝන්ගෙයාර්

12
තවත් වාසියක් git merge --squashනම්, නැවත ප්‍රතිස්ථාපනය කිරීමට සාපේක්ෂව චලනයන් / මකාදැමීම් / නම් කිරීම් හමුවේ ඒකාබද්ධ කිරීමේ ගැටුම් ඇතිවීමට ඇති ඉඩකඩ අඩුය, විශේෂයෙන් ඔබ ප්‍රාදේශීය ශාඛාවකින් ඒකාබද්ධ වන්නේ නම්. (වියාචනය: එක් අත්දැකීමක් මත පදනම්ව, සාමාන්‍ය
කාරණයේදී


8
@BT: ඔබේ කැපවීම විනාශ කළාද? :( ඔබ එයින් අදහස් කරන්නේ කුමක්දැයි මට විශ්වාස නැත.ඔබ කළ ඕනෑම දෙයක් ඔබට පහසුවෙන් git හි ප්‍රත්‍යාවර්තයෙන් ආපසු යා හැකිය.ඔබට අවිධිමත් වැඩක් තිබුනද ලිපිගොනු වේදිකා ගත කර ඇත්නම්, ඔබට තවමත් ලබා ගත හැකි විය යුතුය ඒවායේ අන්තර්ගතය නැවත වැඩ කළ හැකි වුවද , එය ඔබගේ වැඩ කටයුතු පවා වේදිකා ගත නොකළේ නම්, කළ හැකි දේ අල්පයක් ඇතැයි මම බිය වෙමි. ඒ නිසා පිළිතුර ඉදිරියෙන් කියනුයේ “Git තත්ත්වය පිරිසිදු දැයි පළමුව පරීක්ෂා කරන්න (GIT යළි පිහිටුවීමේ --hard නිරත හා unstaged වෙනස්කම් විසි සිට ඇත) ".
මාක් Longair

218

git resetහැකි සෑම විටම වළක්වා ගැනීමට මම නිර්දේශ කරමි - විශේෂයෙන් Git-novices සඳහා. කොමිස් ගණනාවක් මත පදනම්ව ක්‍රියාවලියක් ස්වයංක්‍රීය කිරීමට ඔබට අවශ්‍ය නොවන්නේ නම්, අඩු විදේශීය ක්‍රමයක් ඇත ...

  1. වැඩ කළ යුතු ශාඛාවක් මත කළ යුතු දේ කරන්න (ඒවා දැනටමත් නොමැති නම්) - මේ සඳහා gitk භාවිතා කරන්න
  2. ඉලක්ක ශාඛාව පරීක්ෂා කරන්න (උදා: 'මාස්ටර්')
  3. git merge --squash (working branch name)
  4. git commit

බැඳීම් පණිවිඩය ස්කොෂ් මත පදනම්ව සකස් කරනු ලැබේ.


4
මෙය ආරක්ෂිතම ක්‍රමයයි: මෘදු / දෘඩ (!!) යළි පිහිටුවීම හෝ භාවිතා නොකිරීම!
TeChn4K

14
ඔබ (1) මත පුළුල් කළහොත් එය ඉතා හොඳ වේ.
ආදම්

2
D ඇඩම්: මූලික වශයෙන්, මෙයින් අදහස් gitkකරන්නේ ඔබ ස්කොෂ් කරන කේත රේඛාව ලේබල් කිරීමට GUI අතුරුමුහුණත භාවිතා කිරීම සහ ස්කොෂ් කළ යුතු පදනම ලේබල් කිරීමයි. සාමාන්‍ය අවස්ථාවේ දී, මෙම ලේබල දෙකම දැනටමත් පවතිනු ඇත, එබැවින් පියවර (1) මඟ හැරිය හැක.
nobar

3
මෙම ක්‍රමය මඟින් වැඩකරන ශාඛාව සම්පුර්ණයෙන්ම ඒකාබද්ධ වී ඇති බව සලකුණු නොකරන බැවින් එය ඉවත් කිරීමට බල කිරීම අවශ්‍ය වේ. :(
කිර්ස්ටෙලයින්

2
(1) සඳහා, මම git branch your-feature && git reset --hard HEAD~Nවඩාත් පහසුම ක්‍රමය සොයාගෙන ඇත. කෙසේ වෙතත්, එයට නැවත git reset ඇතුළත් වේ, මෙම පිළිතුර වළක්වා ගැනීමට උත්සාහ කළේය.
eis

135

ක්‍රිස් ජොන්සන්ගේ පිළිතුර මත පදනම්ව ,

බාෂ් වෙතින් ගෝලීය "ස්කොෂ්" අන්වර්ථයක් එක් කරන්න: (හෝ වින්ඩෝස් හි 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අතින් වෙනස් කළ හැකිය . (නැතහොත්, ඔබේ රුචිකත්වයට ගැලපෙන ලෙස අන්වර්ථය සංස්කරණය කරන්න.)


6
සිත්ගන්නා සුළුය, නමුත් මා විසින් ස්වයංක්‍රීයව ඇතුලත් කර ඇතිවාට වඩා, මගේ බහුවිධ කොමිෂන් සභා වල විස්තරාත්මක සාරාංශයක් ලෙස ස්කොෂ් කරන ලද පණිවිඩ පණිවිඩය මා විසින්ම ටයිප් කිරීමට කැමැත්තෙමි. ඒ නිසා මම නිශ්චිතවම සඳහන් git squash -m "New summary."කර Nනොගත් කොමිස් ගණන ලෙස ස්වයංක්‍රීයව තීරණය කරමි.
Acumenus

1
@ ඒබී, මෙය වෙනම ප්‍රශ්නයක් සේ පෙනේ. (එය OP ඉල්ලා සිටියේ හරියටම යැයි මම නොසිතමි; මගේ git ස්කොෂ් වැඩ ප්‍රවාහයේ කිසි විටෙකත් එහි අවශ්‍යතාවයක් මට දැනුනේ නැත.)
EthanB

3
මේක හරිම මිහිරි. පුද්ගලිකව මම කැමතියි පළමු වරට එකට එකතු වූ බැඳීම් පණිවිඩය භාවිතා කරන අනුවාදයකට. වයිට්ස්පේස් tweaks වැනි දේ සඳහා හොඳ වනු ඇත.
funroll

unfunroll එකඟ විය. අන්තිම බැඳීම අතහැර දැමීම මට පොදු අවශ්‍යතාවකි. අපට එය සැලසුම් කළ හැකි විය යුතුයි ...
ස්ටීව් ක්ලේ

2
BABB ඔබට git commit --amendපණිවිඩය තවදුරටත් වෙනස් කිරීමට භාවිතා කළ හැකිය , නමුත් මෙම අන්වර්ථය මඟින් කැපවීමේ පණිවිඩයේ තිබිය යුතු දේ පිළිබඳව හොඳ ආරම්භයක් ලබා ගැනීමට ඔබට ඉඩ සලසයි.
dashesy

131

මෙම හුරුබුහුටි බ්ලොග් සටහනට ස්තූතියි, ඔබට මෙම විධානය භාවිතා කර අවසාන කොමිස් 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 .

සංස්කාරකය වසා දමන විට, නිවැරදි කිරීම විශේෂාංගයේ කැපවීම හා මගේ කැපවීමේ ඉතිහාසය ලස්සන හා පිරිසිදු ලෙස පෙනෙනු ඇත!

සියලුම කොමිස් දේශීය වූ විට මෙය හොඳින් ක්‍රියාත්මක වේ, නමුත් ඔබ දැනටමත් දුරස්ථයට තල්ලු කර ඇති ඕනෑම කොමිස් වෙනස් කිරීමට උත්සාහ කරන්නේ නම්, එකම ශාඛාව පරීක්ෂා කර ඇති අනෙකුත් ඩෙව්වරුන්ට ඔබට සැබවින්ම ගැටළු ඇති කළ හැකිය!

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


5
ඔබට ඉහළම එක තෝරාගෙන ඉතිරි කොටස ස්කොෂ් කළ යුතුද? අන්තර්ක්‍රියාකාරී නැවත ප්‍රතිස්ථාපන සංස්කාරකය වඩාත් විස්තරාත්මකව භාවිතා කරන්නේ කෙසේද යන්න පැහැදිලි කිරීම සඳහා ඔබ ඔබේ පිළිතුර සංස්කරණය කළ යුතුය
කොලොබ් කැනියොන්

2
ඔව්, pick1 වන පේළියේ තබන්න . ඔබ තෝරා ගන්නේ නම් squashහෝ fixup1 වන පේළියේ බැඳීම සඳහා නම්, git මඟින් "දෝෂයක්: පෙර කැපවීමකින් තොරව 'නිවැරදි කළ නොහැක' 'යනුවෙන් පණිවිඩයක් පෙන්වනු ඇත. එවිට එය නිවැරදි කිරීමට ඔබට විකල්පයක් ලබා දෙනු ඇත: "ඔබට මෙය 'git rebase --edit-todo' සමඟ සවි කර 'git rebase --continue' ධාවනය කළ හැකිය." නැතහොත් ඔබට ගබ්සා කර නැවත ආරම්භ කළ හැකිය: "නැතහොත් ඔබට 'git rebase --abort' සමඟ නැවත ගෙවීම නතර කළ හැකිය."
br3nt

56

ඔබ TortoiseGit භාවිතා කරන්නේ නම්, ඔබට ශ්‍රිතය කළ හැකිය Combine to one commit:

  1. TortoiseGit සන්දර්භය මෙනුව විවෘත කරන්න
  2. තෝරන්න Show Log
  3. ලොග් දර්ශනයේ අදාළ කොමිස් සලකුණු කරන්න
  4. Combine to one commitසන්දර්භය මෙනුවෙන් තෝරන්න

ඒකාබද්ධ කරන්න

මෙම ශ්‍රිතය අවශ්‍ය සියලුම තනි පියවර පියවර ස්වයංක්‍රීයව ක්‍රියාත්මක කරයි. අවාසනාවට වින්ඩෝස් සඳහා පමණි.


මා දන්නා පරිදි, ඒකාබද්ධ කිරීමේ කොමිස් සඳහා මෙය ක්‍රියා නොකරනු ඇත.
තෝර්කිල් හෝල්ම්-ජේකොබ්සන්

1
එය වෙනත් කිසිවෙකු විසින් අදහස් දක්වා නොමැති වුවද, මෙය HEAD හි නොමැති කොමිස් සඳහා පවා ක්‍රියා කරයි. නිදසුනක් වශයෙන්, මගේ අවශ්‍යතාවය වූයේ තල්ලු කිරීමට පෙර වඩාත් පැහැදිලි විස්තරයක් සහිතව මා කළ WIP කොමිස් කිහිපයක් ස්කොෂ් කිරීමයි. ලස්සනට වැඩ කළා. ඇත්ත වශයෙන්ම, විධාන මගින් එය කරන්නේ කෙසේදැයි මට ඉගෙන ගත හැකි යැයි මම තවමත් බලාපොරොත්තු වෙමි.
චාල්ස් රොබර්ටෝ කැනටෝ

55

මෙය සිදු කිරීම සඳහා ඔබට පහත දැක්වෙන 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....

වැඩි විස්තර සඳහා සබැඳිය ක්ලික් කරන්න


48

මෙම ලිපිය මත පදනම්ව මෙම ක්‍රමය මගේ භාවිතයට පහසු බව මට පෙනී ගියේය.

මගේ 'දේව්' ශාඛාව කොමිට් 96 කින් 'සම්භවය / දේව්' ට වඩා ඉදිරියෙන් සිටියි (එබැවින් මෙම කොමිස් තවමත් දුරස්ථයට තල්ලු කර නැත).

වෙනස තල්ලු කිරීමට පෙර මෙම බැඳීම් එකකට බෙදීමට මට අවශ්‍ය විය. ශාඛාව 'සම්භවය / දේව්' තත්වයට යලි පිහිටුවීමට මම කැමැත්තෙමි (මෙය 96 කමිටු 96 හි සියලු වෙනස්කම් අස්ථිර වනු ඇත) ඉන්පසු වෙනස්කම් එකවර සිදු කරයි:

git reset origin/dev
git add --all
git commit -m 'my commit message'

1
මට අවශ්‍ය දේ. ස්කොෂ් ඩවුන් මගේ විශේෂාංග ශාඛාවෙන් කොමිස්, පසුව මම මගේ ස්වාමියා වෙත චෙරි පික් ලබා දෙමි.
ඩේවිඩ් වික්ටර්

1
මෙය පෙර කළ ක්‍රියාවන් ස්කොෂ් නොකරයි!
ඉගෝර්ගනාපොල්ස්කි

ඔබට තව ටිකක් විස්තර කළ හැකිද @igorGanapolsky?
trudolf

3
rtrudolf මෙය සැබවින්ම ස්කොෂ් කිරීමක් නොවේ (ස්කොෂ් සඳහා තනි තනිව තෝරා ගැනීම). මෙය ඔබගේ සියලු වෙනස්කම් එකවර සිදුකිරීමට වඩා වැඩි ය.
ඉගෝර්ගනාපොල්ස්කි

15
ඔව්, එම නිසා එය ඔබගේ සියලු කැපවීම් එකකට දමයි. සුභ පැතුම්!
trudolf

45

ශාඛාව තුළ ඔබ කොමිස් ඒකාබද්ධ කිරීමට කැමති, ධාවනය කරන්න:

git rebase -i HEAD~(n number of commits back to review)

උදාහරණයක්:

git rebase -i HEAD~1

මෙය පෙළ සංස්කාරකය විවෘත කරනු ඇති අතර, මෙම බැඳීම් එකට ඒකාබද්ධ කිරීමට ඔබ කැමති නම්, ඔබ එක් එක් බැඳීම ඉදිරිපිට 'ස්කොෂ්' සමඟ 'පික්' මාරු කළ යුතුය. ප්‍රලේඛනයෙන්:

p, pick = use commit

s, squash = use commit, නමුත් පෙර කැපවීමට ඒකාබද්ධ කරන්න

නිදසුනක් ලෙස, ඔබ සියලු කොමිස් එකකට ඒකාබද්ධ කිරීමට බලාපොරොත්තු වන්නේ නම්, 'පික්' යනු ඔබ කළ පළමු කැපවීම වන අතර අනාගත සියලු දේ (පළමුවැන්නාට පහළින් තබා) 'ස්කොෂ්' ලෙස සැකසිය යුතුය. Vim භාවිතා කරන්නේ නම්, භාවිතා කරන්න : x සංස්කාරකය සුරැකීමට සහ පිටවීමට ඇතුළු කිරීමේ ප්‍රකාරයේදී කරන්න.

ප්‍රතිප්‍රහාරය දිගටම කරගෙන යාමට:

git rebase --continue

මේ පිළිබඳ වැඩි විස්තර සහ ඔබගේ බැඳීම් ඉතිහාසය නැවත ලිවීමට වෙනත් ක්‍රම සඳහා මෙම ප්‍රයෝජනවත් ලිපිය බලන්න


2
කරුණාකර --continueසහ vim :xකරන්නේ කුමක්ද යන්න පැහැදිලි කරන්න .
not2qubit

ඔබේ ශාඛාවේ ඇති කොමිස් හරහා ගමන් කරන විට ප්‍රතිප්‍රහාරය බ්ලොක් වලින් සිදුවනු ඇත, git addඔබේ ලිපිගොනු වල නිවැරදි වින්‍යාසය ඔබ git rebase --continueඊළඟ බැඳීමට ගොස් ඒකාබද්ධ කිරීමට පටන් ගනී. :xvim භාවිතා කරන විට ගොනුවේ වෙනස්කම් සුරකින එක් විධානයකි මෙය
aabiro

32

Anomies පිළිතුර හොඳයි, නමුත් මට මේ ගැන අනාරක්ෂිත බවක් දැනුණා, ඒ නිසා මම තිරපිටපත් කිහිපයක් එකතු කිරීමට තීරණය කළා.

පියවර 0: git log

ඔබ සිටින්නේ කොහේදැයි බලන්න git log. වැදගත්ම දෙය නම්, ඔබට ස්කොෂ් කිරීමට අවශ්‍ය නැති පළමු කැපවීමේ හෑෂ් සොයා ගන්න . එබැවින්:

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

පියවර 1: git rebase

git rebase -i [your hash]මගේ නඩුවේ ක්‍රියාත්මක කරන්න :

$ git rebase -i 2d23ea524936e612fae1ac63c95b705db44d937d

පියවර 2: ඔබට අවශ්‍ය දේ තෝරන්න / ස්කොෂ් කරන්න

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

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

පියවර 3: පණිවිඩය (ය) සකසන්න

ඔබ එක් කැපවීමක් පමණක් තෝරාගෙන ඉතිරි කොටස කොටු කර ඇත්නම්, ඔබට එක් කැපවීමේ පණිවිඩයක් සකස් කළ හැකිය:

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

ඒක තමයි. ඔබ මෙය ( :wq) සුරකින ලද පසු , ඔබ අවසන්. ඒ දෙස බලන්න git log.



2
නැ ස්තුතියි. මගේ කැපවීම් අයෝස්ට් කරන්නේ මෙයයි.
ඇක්සලික්ස්

X ඇක්සලික්ස් ඔබ ඔබේ සියලු රේඛා ඉවත් කළාද? ඔබේ කැපවීම් ඔබට අහිමි වන්නේ එලෙසිනි.
a3y3

32

ක්රියා පටිපාටිය 1

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) භාවිතා කරන්නේ නම් ඉහත විධානයන් සංස්කාරකය හැර සමාන වේ. ඔබට වෙනස් සංස්කාරකයක් ලැබෙනු ඇත.

ක්රියා පටිපාටිය 2

  1. කැපවීම සඳහා අවශ්‍ය ගොනු පළමුව එක් කරන්න
git add <files>
  1. ඉන්පසු --fixupවිකල්පය භාවිතා කරමින් කැපවීම සහ මෙම OLDCOMMITබැඳීම ඒකාබද්ධ කිරීමට (ස්කොෂ්) අවශ්‍ය විය යුතුය.
git commit --fixup=OLDCOMMIT

දැන් මෙය HEAD සමඟ නව බැඳීමක් ඇති කරයි fixup1 <OLDCOMMIT_MSG>.

  1. ඉන්පසු පහත දැක්වෙන විධානය ක්‍රියාත්මක කිරීම සඳහා ඒකාබද්ධ කිරීම (ස්කොෂ්) OLDCOMMIT.
git rebase --interactive --autosquash OLDCOMMIT^

මෙහි ^අර්ථය වන්නේ පෙර කළ කැපවීමයි OLDCOMMIT. මෙම rebaseවිධානය සංස්කාරකයක (vim හෝ නැනෝ) අන්තර්ක්‍රියාකාරී කවුළුවක් විවෘත කරයි, අපට කිසිවක් කිරීමට අවශ්‍ය නොවන අතර ඉතිරි කිරීම සහ පිටවීම ප්‍රමාණවත් වේ. මක්නිසාද යත්, මේ සඳහා ලබා දී ඇති විකල්පය ස්වයංක්‍රීයව නවතම බැඳීම පැරණි බැඳීමට යාබදව ගෙන යන අතර ක්‍රියාකාරිත්වය වෙනස් කරයිfixup (ස්කොෂ් වලට සමාන) . ඉන්පසු නැවත ගෙවීම දිගටම කරගෙන යයි.

ක්රියා පටිපාටිය 3

  1. අන්තිම කැපවීමේ ක්‍රමයට නව වෙනස්කම් එක් කිරීමට අවශ්‍ය නම් --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

නිගමනය

  • 1 වන ක්‍රියා පටිපාටියේ වාසිය නම් බහු කොමිස් ස්කොෂ් කිරීම සහ නැවත සකස් කිරීමයි. නමුත් ඉතා පැරණි බැඳීමකට විසඳුමක් ඒකාබද්ධ කිරීමට අවශ්‍ය නම් මෙම ක්‍රියා පටිපාටිය දුෂ්කර වනු ඇත.
  • එබැවින් 2 වන ක්‍රියා පටිපාටිය ඉතා පැරණි බැඳීමකට ඇති බැඳීම පහසුවෙන් ඒකාබද්ධ කිරීමට උපකාරී වේ.
  • අවසාන ක්‍රියාමාර්ගය සඳහා නව වෙනස්කම් ස්කොෂ් කිරීමට 3 වන ක්‍රියා පටිපාටිය ප්‍රයෝජනවත් වේ.

එය යාවත්කාලීන කරන්නේ අන්තිම බැඳීම් දෙක පමණි, මම 6 වන අන්තිම
කාලෝස් ලියු

ඔබට පවා බැඳීම් අනුපිළිවෙල නැවත සකස් කළ හැකිය. එය හොඳින් ක්‍රියාත්මක වේ.
rashok

29

අන්තිම කොමිස් 10 තනි කැපවීමකට බෙදීමට:

git reset --soft HEAD~10 && git commit -m "squashed commit"

ඔබට දුරස්ථ ශාඛාව ස්කොෂ් කැපවීම සමඟ යාවත්කාලීන කිරීමට අවශ්‍ය නම්:

git push -f

ඔබගේ ප්‍රාදේශීය පිටපත සමඟ දුරස්ථව අන්ධ ලෙස යාවත්කාලීන වන බැවින් හවුල් ශාඛාවක බහු පුද්ගලයින් වැඩ කරන විට --force භයානක වේ. --force-with-lease වඩා හොඳ වීමට ඉඩ තිබුනේ ඔබ අවසන් වරට එය ලබාගත් දා සිට දුරස්ථව වෙනත් අයගෙන් කිසිදු දායකත්වයක් නොමැති බව සහතික කරමිනි.
භාරත්

28

ඔබ feature-branchරන් ගබඩාවක ( golden_repo_name) ක්ලෝන කරන ලද දුරස්ථ ශාඛාවක (කැඳවනු ලැබේ ) නම්, එවිට ඔබගේ කැපවීම් එකකට බෙදීමේ තාක්ෂණය මෙන්න:

  1. රන් ගබඩාව පරීක්ෂා කරන්න

    git checkout golden_repo_name
    
  2. එයින් නව ශාඛාවක් සාදන්න (ගෝල්ඩන් රෙපෝ) පහත පරිදි වේ

    git checkout -b dev-branch
    
  3. ස්කොෂ් ඔබ දැනටමත් ඇති ඔබේ ප්‍රාදේශීය ශාඛාව සමඟ ඒකාබද්ධ කරන්න

    git merge --squash feature-branch
    
  4. ඔබගේ වෙනස්කම් සිදු කරන්න (dev ශාඛාවේ ඇති එකම කැපවීම මෙය වනු ඇත)

    git commit -m "My feature complete"
    
  5. ඔබේ දේශීය ගබඩාවට ශාඛාව තල්ලු කරන්න

    git push origin dev-branch
    

මම කොමිස් 100 ක් කොල්ලකමින් සිටි නිසා (svn ශාඛා git-svn හරහා සමමුහුර්ත කිරීම සඳහා), මෙය අන්තර්ක්‍රියාකාරී ලෙස ප්‍රතිස්ථාපනය කිරීමට වඩා වේගවත්ය!
අග්ගිස්

1
කියවන විට, මම දකිමි @ ක්‍රිස්ගේ ප්‍රකාශය, එය මා කළ දෙයයි (ප්‍රතිස්ථාපනය - සොෆ්ට් ...) - ස්ටැකෝවර් ප්‍රවාහය තවදුරටත් සියගණනක් ඉහළට පිළිතුරු නොදෙන තරමට නරකයි ...
අග්ගිස්

1
ඔබ සමඟ එකඟ වන්න age සේජ්, අනාගතයේදී ඔවුන් එය කරනු ඇතැයි බලාපොරොත්තු වෙමු
සන්දේශ් කුමාර්

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

20

සැබවින්ම පහසු විය හැකි දේ:
ඔබට ඉහළින් ස්කොෂ් කිරීමට අවශ්‍ය කැපවීමේ හැෂ් සොයා ගන්න, කියන්න d43e15.

දැන් භාවිතා කරන්න

git reset d43e15
git commit -am 'new commit name'

2
මෙය. වැඩි පිරිසක් මෙය භාවිතා නොකරන්නේ ඇයි? තනි කොමිස් ප්‍රතික්ෂේප කිරීම හා කොල්ලකෑමට වඩා එය වේගවත් ය.
a3y3

18

2020 නැවත සකස් කිරීමකින් තොරව සරල විසඳුම:

git reset --soft HEAD~2

git commit -m "new commit message"

git push --force

2 යන්නෙන් අදහස් කරන්නේ අවසාන කොමිස් දෙක කොටු කරනු ඇති බවයි. ඔබට එය ඕනෑම අංකයකින් ප්‍රතිස්ථාපනය කළ හැකිය


17

මෙය සුපිරි ඩුපර් ක්ලඩ්ජි, නමුත් එක්තරා ආකාරයක සිසිල් ආකාරයකින්, එබැවින් මම එය වළල්ලට විසි කරන්නෙමි:

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(අන්තර්ක්‍රියාකාරී ප්‍රතිස්ථාපන විමසුම) පළමු "තේරීම" හැර "ස්කොෂ්" ලෙස සියල්ල වෙනස් කරයි, එසේ නොමැතිනම් විම් හට ගනී - එවිට ඔබෙන් විමසනු ඇත ස්කොෂ් කළ කැපවීමේ පණිවිඩය සංස්කරණය කිරීමට, ඔබට විකාරයක් ලැබේ. .

මාක් ලොන්ගෙයාර් යෝජනා කළ දේ මම බොහෝ විට කරන්නෙමි .


7
+1: එය විනෝදජනක සහ උපදේශාත්මක ය, GIT_EDITOR පරිසර විචල්‍යයේ වැඩසටහනක නමට වඩා සංකීර්ණ කිසිවක් ඔබට තැබිය හැකි බව මට කිසිසේත්ම පැහැදිලි නැත.
මාර්ක් ලොන්ගෙයාර්

16

සෑම කැපවීමක්ම තනි කැපවීමකට ලක් කිරීමට ඔබට අවශ්‍ය නම් (උදා: පළමු වරට ව්‍යාපෘතියක් ප්‍රසිද්ධියේ නිකුත් කරන විට), උත්සාහ කරන්න:

git checkout --orphan <new-branch>
git commit

15

මා සිතන්නේ මෙය කිරීමට ඇති පහසුම ක්‍රමය වන්නේ මාස්ටර් මත පදනම්ව නව ශාඛාවක් සෑදීම සහ merge --squashවිශේෂාංග ශාඛාවෙන් එකක් කිරීමයි.

git checkout master
git checkout -b feature_branch_squashed
git merge --squash feature_branch

එවිට ඔබට සියලු වෙනස්කම් කිරීමට සූදානම්.


14

උදාහරණයක් ලෙස ඔබට ශාඛාවක (දුරස්ථ නිධිය) තනි කැපවීමකට අවසන් කැපීම් 3 ක් ස්කොෂ් කිරීමට අවශ්‍ය නම්: https://bitbucket.org

මම කළේ එයයි

  1. git reset --soft Head~3
  2. git commit
  3. git push origin <branch_name> --force

3
ප්‍රවේශම් වන්න, ඔබ බලය පාවිච්චි කරන්නේ නම්, ඔබ එය ඉවත් කළ දා සිට පෙර කළ මුදල් ආපසු ලබා ගැනීමට ක්‍රමයක් නොමැති බැවින්
ඇල්බට් රුලන්

12

සෑම විටම ක්‍රියාත්මක වන සරල එක්-ලයිනර්, ඔබ දැනට ස්කොෂ් කිරීමට අවශ්‍ය ශාඛාවේ සිටින නිසා, ස්වාමියා එය ආරම්භ කළ ශාඛාව වන අතර, නවතම කැපවීම තුළ ඔබ භාවිතා කිරීමට කැමති කැපවීමේ පණිවිඩය සහ කතුවරයා ඇතුළත් වේ:

git reset --soft $(git merge-base HEAD master) && git commit --reuse-message=HEAD@{1}

4
ස්කොෂ් කිරීම පිළිබඳ කලකිරීමෙන් හා එය කෙතරම් මෝඩ ලෙස සංකීර්ණද යන්න ගැන මම අතිශයින්ම කලකිරී සිටිමි - අවසාන පණිවිඩය භාවිතා කරමින් ඒවා සියල්ලම එක කැපවීමකට යොදවන්න! ඇයි ඒක අමාරු ???? මේ එක් ලයිනර් මා වෙනුවෙන් එය කරයි. මගේ කෝපාවිෂ්ට හදවතේ පහළ සිට ස්තූතියි.
ලොකේන්

12

AR අවවාදයයි: "මගේ අන්තිම X කොමිස්" අපැහැදිලි විය හැකිය.

  (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 හි මෙය ඔබට පෙනේ:

කොමිස් හතරක්:

  • ඩැනී කිර්වන් එක් කරන්න
  • ක්‍රිස්ටීන් පරිපූර්ණ එකතු කරන්න
  • LA1974
  • බිල් ක්ලින්ටන්

සම්පුර්ණ නිධිය ඉතිහාසය කියවීමට කිසිවෙකු උනන්දු නොවනු ඇතැයි සිතීම. (ඇත්ත වශයෙන්ම ගබඩාවක් තිබේ, ඉහත සබැඳිය ක්ලික් කරන්න!) ඔබ මෙම කොමිස් ස්කොෂ් කිරීමට තීරණය කරයි. ඉතින් ඔයා ගිහින් දුවන්න git reset --soft HEAD~4 && git commit. git push --forceඔබේ PR පිරිසිදු කිරීම සඳහා ඔබ එය GitHub වෙත යොමු කරයි.

මොකද වෙන්නේ? ඔබ ෆ්‍රිට්ස් සිට බිල් ක්ලින්ටන් දක්වා තනි කැපවීමක් කළා. ඊයේ ඔබ මෙම ව්‍යාපෘතියේ බකිංහැම් නික්ස් අනුවාදයේ වැඩ කරමින් සිටි බව ඔබට අමතක වූ බැවිනි. හා git logඔබ GitHub දකින දේ හා නොගැලපේ.

OR කතන්දරයේ සදාචාරය

  1. ඔබ ලබා ගැනීමට අවශ්ය වූ නිශ්චිත ගොනු සොයා ගැනීමට , සහ git checkoutඔවුන්
  2. නිශ්චිත පෙර ඔබ ඉතිහාසයේ තබා ගැනීමට අවශ්ය සිදු, සහ සොයා git reset --softබව
  3. පවතින බවට git commitවෙතින් සෘජු warps බව සිට වෙත කිරීමට

1
මෙය 100% පහසුම ක්‍රමයයි. ඔබේ වත්මන් හිස නම් වේ ඔබට අවශ්ය නිවැරදි රාජ්ය, ඔබ # 1 මඟ හැරිය හැක.
ස්ටැන්

පළමු කැපවීමේ ඉතිහාසය නැවත ලිවීමට ඉඩ සලසන එකම ක්‍රමය මෙයයි.
Vadorequest

9

අතර ඇති බැඳීම් පණිවිඩ ගැන ඔබ තැකීමක් නොකරන්නේ නම්, ඔබට භාවිතා කළ හැකිය

git reset --mixed <commit-hash-into-which-you-want-to-squash>
git commit -a --amend

7

ඔබ GitLab සමඟ වැඩ කරන්නේ නම්, පහත දැක්වෙන පරිදි ඒකාබද්ධ කිරීමේ ඉල්ලීමෙහි ඇති ස්කොෂ් විකල්පය ක්ලික් කළ හැකිය. බැඳීමේ පණිවිඩය ඒකාබද්ධ කිරීමේ ඉල්ලීමේ මාතෘකාව වනු ඇත.

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


සමඟ GitLab Enterprise Edition 12.8.6-ee අහඹු ලෙස කොටු වූ කැපවීම සඳහා කැපවීමේ පණිවිඩයක් ලබා ගත්තේය ...
වුල්ෆ්සන්

6
git rebase -i HEAD^^

මෙහි s හි ගණන X වේ

(මේ අවස්ථාවේ දී, අවසන් කොමිස් දෙක ස්කොෂ් කරන්න)


6

වෙනත් විශිෂ් answer පිළිතුරු වලට අමතරව git rebase -i, කැපවීමේ අනුපිළිවෙල සමඟ මා නිතරම ව්‍යාකූල වන්නේ කෙසේද යන්න එක් කිරීමට මම කැමතියි - අලුත් ඒවාට වඩා පැරණි හෝ අනෙක් අතට? ඉතින් මෙය මගේ කාර්ය ප්‍රවාහයයි:

  1. git rebase -i HEAD~[N], ෙමහිදී N මම, බැඳීමට අවශ්ය අනාචාරයේ සංඛ්යාව වේ වඩාත් ම මෑත එක් සිට බලපැවැත්වෙන . ඒ නිසාgit rebase -i HEAD~5 "අන්තිම කොමිස් 5 නව එකක් බවට ස්කොෂ් කරන්න";
  2. මට ඒකාබද්ධ කිරීමට අවශ්‍ය කොමිස් ලැයිස්තුව පෙන්වමින් සංස්කාරකය මතු වේ. දැන් ඒවා ප්‍රතිලෝම අනුපිළිවෙලින් දර්ශනය වේ : පැරණි බැඳීම ඉහළින් තිබේ. පළමු / පැරණි එක හැර එහි ඇති සියලුම කොමිස් "ස්කොෂ්" හෝ "එස්" ලෙස සලකුණු කරන්න : එය ආරම්භක ස්ථානයක් ලෙස භාවිතා කරනු ඇත. සංස්කාරකය සුරකින්න සහ වසා දමන්න;
  3. සංස්කාරකය නව කැපවීම සඳහා පෙරනිමි පණිවිඩයක් සමඟ නැවත මතු වේ: එය ඔබගේ අවශ්‍යතාවන්ට වෙනස් කරන්න, සුරකින්න සහ වසා දමන්න. ස්කොෂ් සම්පූර්ණයි!

ප්‍රභවයන් සහ අමතර කියවීම්: # 1 , # 2 .


6

මේ වගේ වැඩ ප්‍රවාහයකට අදාළ ප්‍රශ්නයට පිළිතුරක් ගැන කුමක් කිව හැකිද?

  1. බොහෝ දේශීය කොමිස්, මාස්ටර් වෙතින් බහු ඒකාබද්ධ කිරීම් සමඟ මිශ්‍ර වී ඇත ,
  2. අවසානයේ දුරස්ථයට තල්ලු කිරීම,
  3. PR සහ සමාලෝචකයා විසින් මාස්ටර් ඒකාබද්ධ කරන්න . (ඔව්, merge --squashPR ට පසුව සංවර්ධකයාට පහසු වනු ඇත , නමුත් කණ්ඩායම සිතුවේ එය ක්‍රියාවලිය මන්දගාමී වනු ඇති බවයි.)

මම මේ පිටුවේ ඒ වගේ වැඩ ප්‍රවාහයක් දැකලා නැහැ. (එය මගේ ඇස් විය හැකිය.) මම rebaseනිවැරදිව තේරුම් ගන්නේ නම් , බහුවිධ ඒකාබද්ධ කිරීම් සඳහා ගැටුම් නිරාකරණ අවශ්‍ය වේ . මට ඒ ගැන හිතන්නවත් අවශ්‍ය නැහැ!

ඉතින්, මෙය අපට වැඩ කරන බව පෙනේ.

  1. git pull master
  2. git checkout -b new-branch
  3. git checkout -b new-branch-temp
  4. දේශීයව බොහෝ දේ සංස්කරණය කර කැප කරන්න, නිතිපතා ස්වාමියා ඒකාබද්ධ කරන්න
  5. git checkout new-branch
  6. git merge --squash new-branch-temp // සියලු වෙනස්කම් වේදිකාවේ තබයි
  7. git commit 'one message to rule them all'
  8. git push
  9. විචාරකයා PR කරන අතර මාස්ටර් සමඟ ඒකාබද්ධ වේ.

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

6
  1. git reset --soft HEAD~n

    සමග nස්කොෂ් සඳහා අනාචාරයේ සංඛ්යාව වීම

  2. git commit -m "new commit message"
  3. git push origin <branch_name> --force

5

මට වඩා සාමාන්‍ය විසඳුමක් වන්නේ 'එන්' කොමිස් නියම කිරීම නොව, ඔබට ඉහළින් ස්කොෂ් කිරීමට අවශ්‍ය ශාඛාව / කැපවීමේ හැඳුනුම්පතයි. නිශ්චිත බැඳීමක් දක්වා වූ ගණන් කිරීමකට වඩා මෙය අඩු දෝෂ සහිත වේ 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විකල්පය භාවිතා කරන බව සලකයි , මැක් සහ ලිනක්ස් භාවිතා කරන්නන් මේ සමඟ හොඳින් සිටිය යුතුය.)


මම අන්වර්ථය අත්හදා බැලුවෙමි, නමුත් සෙඩ් ප්‍රතිස්ථාපනයෙන් යම් බලපෑමක් ඇති වේදැයි මට විශ්වාස නැත. ඔවුන් කළ යුත්තේ කුමක්ද?
වැසි

පළමු වරට ඉතිහාසය කොන්සෝලය වෙතට ඇද දමයි. දෙවන sed විසින් සියළුම 'පික්' 'f' (fixup) සමඟ ප්‍රතිස්ථාපනය කර සංස්කාරක ගොනුව තැනින් තැන නැවත ලියයි (-i විකල්පය). ඉතින් දෙවැන්නා සියලු වැඩ කරයි.
ඊතන්

ඔබ හරි, නිශ්චිත කොමිස් ගණන N ගණන් කිරීම ඉතා දෝෂ සහිතයි. එය කිහිප වතාවක්ම මාව රවටා ඇති අතර නැවත ගෙවීම අහෝසි කිරීමට උත්සාහ කරමින් පැය ගණනක් නාස්ති කර ඇත.
ඉගෝර්ගනාපොල්ස්කි

හායි ඊතන්, මෙම කාර්ය ප්‍රවාහය ඒකාබද්ධ කිරීමේදී ඇතිවිය හැකි ගැටුම් සැඟවිය හැකිදැයි දැන ගැනීමට මම කැමතියි. එබැවින් ඔබට ශාඛා දෙකක් ස්වාමියා හා දාසයා සිටීදැයි කරුණාකර සලකා බලන්න. දාසයාට ස්වාමියා සමඟ ගැටුමක් ඇත්නම් සහ අප git squash masterදාසයා පරීක්ෂා කරන විට භාවිතා කරමු. එය කුමක් සිදුවේද? අපි ගැටුම සඟවන්නද?
සර්ජියෝ බිලෙලෝ

Er සර්ජියෝ මෙය ඉතිහාසය නැවත ලිවීමේ අවස්ථාවකි, එබැවින් ඔබ දැනටමත් තල්ලු කර ඇති ස්කොෂ් කොමිස් කළහොත් ඔබට ගැටුම් ඇති විය හැකි අතර පසුව ස්කොෂ් කළ අනුවාදය නැවත ඒකාබද්ධ කිරීමට / නැවත ප්‍රතිස්ථාපනය කිරීමට උත්සාහ කරන්න. (සමහර සුළු සිද්ධීන් එයින් ගැලවී යා හැකිය.)
ඊතන්

5

ප්රශ්නය එය "අන්තිම" යන්නෙන් අදහස් කරන්නේ කුමක්ද යන්න අපැහැදිලි විය හැකිය.

උදාහරණයක් ලෙස 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 වෙනස්කම් වලට ස්කොෂ් කරයි (අතු බෙදීමෙන් පසුව හා ඒකාබද්ධ වීමට පෙර වෙනස්කම් සඳහා සම්පූර්ණයෙන්ම අහිමි වේ.

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.