Git merge --squash භාවිතා කරන්නේ කෙසේද?


1243

මට දුරස්ථ Git සේවාදායකයක් ඇත, මට ඉටු කිරීමට අවශ්‍ය අවස්ථාව මෙන්න:

  • සෑම දෝෂයක් / අංගයක් සඳහාම මම වෙනස් Git ශාඛාවක් නිර්මාණය කරමි

  • මම නිල නොවන Git පණිවිඩ සමඟ එම Git ශාඛාවේ මගේ කේතය දිගටම කරගෙන යමි

  • ඉහළ ගබඩාවේදී අප කළ යුත්තේ නිල Git පණිවිඩය සමඟ එක් දෝෂයක් සඳහා එක් කැපවීමකි

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


1
මම ඔබව සම්පූර්ණයෙන් තේරුම් ගත්තාදැයි මට විශ්වාස නැත, නමුත් ඔබට "බූවල්ලා ඒකාබද්ධ කිරීමක්" අවශ්‍ය විය හැකිය.
MatrixFrog

27
මම සාමාන්‍යයෙන් git rebase -i භාවිතා කරන්නේ මගේ සියලු කැපවීම් එක කැපවීමකට කඩා බිඳ දැමීමේ පණිවිඩය නැවත ලිවීමට ය. ඊට පස්සේ මම ඒක උඩට යවනවා.
එඩ්වඩ් ෆෝක්

18
git merge --squashමේ සියල්ලම විධාන රේඛාවේ එක පහරකින් කරන අතර එය ක්‍රියාත්මක වේ යැයි ඔබ සිතනවා. git rebase -iසංස්කාරකයක් ගෙන එන අතර නැවත ගෙවීම මනාව සැකසීමට ඔබට ඉඩ සලසයි. එය මන්දගාමී ය, නමුත් ඔබ කරන්නේ කුමක්දැයි ඔබට දැක ගත හැකිය. එසේම, නැවත අදහස් දැක්වීම හා ඒකාබද්ධ කිරීම අතර වෙනසක් ඇත.
එඩ්වඩ් ෆෝක්

4
මෙම සියලු පිළිතුරු වල ඇති ගැටළුව නම්, ඔබ දේශීයව ප්‍රධාන ශාඛාවේ සිටිය යුතු අතර merge --squash විධානය ක්‍රියාත්මක කළ යුතුය ... මට ඒකාබද්ධ කිරීම - ස්කෑෂ් ක්‍රියාත්මක කිරීමට අවශ්‍ය වන්නේ විශේෂාංග ශාඛාවෙන් නොව ප්‍රධාන ශාඛාවෙන් නොවේ..එහෙත් මා අවසන් වූ විට, මට විශේෂාංග ශාඛාව දුරස්ථයට තල්ලු කර PR එකක් ඉදිරිපත් කළ හැකිය, එය කළ හැකිද?
ඇලෙක්සැන්ඩර් මිල්ස්

2
Lex ඇලෙක්සැන්ඩර්මිල්ස්, මම හිතන්නේ ඔබට දෙවන අංග ශාඛාවක් අවශ්‍යයි (ප්‍රධාන ශාඛාවෙන් ක්ලෝන කර ඇත). ඇති කරන්නේ merge --squashනව එකක් පැරණි සිට, පසුව ස්වාමියා නව ශාඛා ඒකාබද්ධ. පැරණි ශාඛාව යල් පැන යයි.
ගයිරොමයිට්

Answers:


2067

ඔබේ දෝෂ නිවැරදි කිරීමේ ශාඛාව කැඳවා bugfixඑය ඒකාබද්ධ කිරීමට ඔබට අවශ්‍ය යැයි පවසන්න master:

git checkout master
git merge --squash bugfix
git commit

මෙමඟින් bugfixශාඛාවෙන් ලැබෙන සියලුම කොමිස් , බැඳීම් 1 කට ස්කොෂ් කර ඔබේ masterශාඛාව සමඟ ඒකාබද්ධ කරනු ඇත .


පැහැදිලි කිරීම :

git checkout master

ඔබේ masterශාඛාවට මාරු වේ.

git merge --squash bugfix

bugfixශාඛාවෙන් සියලුම කොමිස් ලබා ගෙන එය ඔබගේ වර්තමාන ශාඛාව සමඟ 1 බැඳීමක් සඳහා කාණ්ඩ කරයි.
(ඒකාබද්ධ කිරීමේ බැඳීමක් නොපෙන්වයි; බැඳීමට පෙර ගැටුම් අතින් විසඳා ගත හැකිය)

git commit

ඒකාබද්ධ කළ වෙනස්කම් වලින් තනි බැඳීමක් නිර්මාණය කරයි.

-mපරාමිතිය මඟ හැරීම මඟින් ඔබගේ කැපවීම අවසන් කිරීමට පෙර ඔබේ ස්කොෂ් කළ කොමිස් වලින් ලැබෙන සෑම පණිවිඩයක්ම ඇතුළත් කෙටුම්පත් පණිවිඩයක් වෙනස් කිරීමට ඔබට ඉඩ සලසයි.


226
ඔබට පරණ බැඳීම් පණිවිඩ වෙත යොමු කිරීමට අවශ්‍ය නම් git commit( -mපරාමිතියක් නොමැතිව ) ඔබට කෙටුම්පත් කළ පණිවිඩයක් වෙනස් කිරීමට ලැබෙනු ඇත.
ඇලෙක්ස්

12
git commit --amend -m '...'පසුකාලීනව කිරීමෙන් ඔබට එය සාක්ෂාත් කරගත හැකිය .
ජනුස් ලෙනාර්

19
ඒකාබද්ධ කිරීමේ ගැටුම් සිදුවී ඔබ මෙම ගැටුම් නිරාකරණය කරන්නේ නම්, git commitඔබ විසින් කොටු කරන ලද සියලු බැඳීම් පණිවිඩ අඩංගු ප්‍රයෝජනවත් බැඳීම් පණිවිඩය තවදුරටත් නොපෙන්වයි. එවැනි අවස්ථාවකදී උත්සාහ කරන්න git commit --file .git/SQUASH_MSG( stackoverflow.com/a/11230783/923560 හරහා ).
අබ්දුල්

23
ස්කොෂ් කිරීම පෙරනිමියෙන් ස්කොෂර් වෙත කොමිස් ආරෝපණය කරන බව මතක තබා ගන්න . මුල් කතුවරයා තබා ගැනීම සඳහා, ඔබ එය පැහැදිලිවම සඳහන් කළ යුතුය:git commit -a --author="Author" --message="Issue title #id"
gabrous

6
git merge --squashවෙනත් ශාඛාවක් ඒකාබද්ධ කිරීම හා සමාන වන වත්මන් ශාඛාවට ඉහළින් තනි බැඳීමක් නිර්මාණය කිරීමට ඔබට ඉඩ සලසයි. නමුත් එය ඒකාබද්ධ කිරීමේ වාර්තාව නිපදවන්නේ නැත, එයින් අදහස් වන්නේ ඔබේ අදින්න ඉල්ලීමෙහි කිසිදු වෙනසක් සිදු නොවන නමුත් ඒකාබද්ධ වූ ලෙස සලකුණු නොකෙරේ! එබැවින්, ඔබට අවශ්‍ය වන්නේ එම ශාඛාව මකා දැමීමයි.
am0wa

131

දේ මා අවසානයේ මේ දක්වා ඉවත් වූයේ අදහස් බව පෙන්නුම්:

git checkout main
git merge --squash feature

කිරීම සමාන වේ:

git checkout feature
git diff main > feature.patch
git checkout main
patch -p1 < feature.patch
git add .

මට විශේෂාංග ශාඛාවක් 105 (!!) සමඟ ඒකාබද්ධ කර ඒවා සියල්ලම එකකට බෙදීමට අවශ්‍ය වූ විට, මට අවශ්‍ය නොවන්නේ එක් එක් අතරමැදි කොමිස් (හෝ අවම වශයෙන් ඒවා git rebase -i origin/masterසඳහා) ඒකාබද්ධ කිරීමේ ගැටුම් වෙන වෙනම විසඳීමට අවශ්‍ය නිසාය. git හට එයම හදුනාගත නොහැක). භාවිතා කිරීමෙන් මට අවශ්‍ය ප්‍රති result ලය ලැබෙනු ඇත, සමස්ත අංග ශාඛාවක් ඒකාබද්ධ කිරීම සඳහා වූ තනි කැපවීම. තවද, මට අවශ්‍ය වන්නේ එක් අතින් ගැටුම් නිරාකරණය කිරීම පමණි.git merge --squash


78
විශේෂාංග ශාඛාව තුළ ඒකාබද්ධ කිරීම සිදු කිරීමට මම තරයේ යෝජනා කරමි git merge master, පසුව git merge --squash featureප්‍රධාන ශාඛාව තුළ පමණි.
dotancohen

8
commentdotancohen පරණ අදහසක් හෑරීමට කණගාටුයි :) git merge --squash featureප්‍රධාන ශාඛාවෙන් ක්‍රියා කිරීමට පෙර විශේෂාංග ශාඛාව සමඟ ඒකාබද්ධ කිරීමෙන් ලැබෙන්නේ කුමක්ද?
bitsmack

59
ඔබට පළමුව මාස්ටර් විශේෂාංග ශාඛාවට ඒකාබද්ධ කිරීමට අවශ්‍ය වන අතර ඔබේ විශේෂාංග ශාඛාවේ ඇති ඕනෑම නිවැරදි කිරීම් සමඟ කටයුතු කරන්න. එමඟින් ඔබට පරීක්ෂණ ක්‍රියාත්මක කිරීමට සහ ඔබේ විශේෂාංග ශාඛාව නිවැරදිව ක්‍රියාත්මක වන බවට වග බලා ගන්න. එවිට, ඔබේ විශේෂාංග ශාඛාව ස්වයංක්‍රීයව මාස්ටර් බවට ඒකාබද්ධ කළ හැකි බවට ඔබට සහතික වේ.
ඩෑන් කෝන්

4
@dankohn ඔබගේ ඉහත අදහස් දැක්වීමේ පැහැදිලි කිරීම ඔබේ පිළිතුරට එක් කිරීමට මම යෝජනා කරමි.
ගුන්ට්බර්ට්

3
@bitsmack: ඔබ පළමුව මාස්ටර් විශේෂාංගයට ඒකාබද්ධ කරයි. විශේෂාංගය මාස්ටර් සමඟ ඒකාබද්ධ කිරීමට පෙර විශේෂාංගයේ ගැටුම් නිරාකරණය කිරීමට මෙය ඔබට අවස්ථාව ලබා දෙයි
මයික්

97

ඔබට ස්කොෂ් විකල්පය සමඟ ඒකාබද්ධ කිරීමට අවශ්‍යයි. ඔබට එය වරකට එක් ශාඛාවක් කිරීමට අවශ්‍ය නම්.

git merge --squash feature1

ඔබට සෑම ශාඛාවක්ම එකවර සිදු කිරීමට අවශ්‍ය නම්, පළමුව අන්තර්ක්‍රියාකාරී ලෙස ප්‍රතිනිර්මාණය කර එක් එක් අංග ස්කොෂ් කර ඉන්පසු බූවල්ලා ඒකාබද්ධ කරන්න:

git checkout feature1
git rebase -i master

එක් කැපවීමකට ස්කොෂ් කර අනෙක් අංග සඳහා නැවත නැවත කරන්න.

git checkout master
git merge feature1 feature2 feature3 ...

එම අන්තිම ඒකාබද්ධ කිරීම "බූවල්ලා ඒකාබද්ධ කිරීමක්" වන්නේ එය එකවර ශාඛා රාශියක් ඒකාබද්ධ කරන බැවිනි.

මෙය උපකාරී වේ යැයි සිතමි


3
ඔබ ප්‍රතික්ෂේප කරන්නේ ඇයි?
උමෙයාර් ඒ.

12
Ma උමයිර් අෂ්රාෆ් එය අන්තර්ක්‍රියාකාරී ප්‍රතිප්‍රහාරයක් වන අතර එමඟින් ඔබේ ශාඛාව තුළ ස්කොෂ් එකක් කිරීමට අවස්ථාව ලබා දේ.
andho

1
නැවත සකස් කිරීම නරක අදහසකි. දැනටමත් ප්‍රකාශයට පත් කර ඇති
කොමිස් නැවත ප්‍රතික්ෂේප නොකරන්න

1
B Sebi2020 git merge --squash ඔබ දැනටමත් ප්‍රකාශයට පත් කර ඇති කොමිස් අන්තර්ක්‍රියාකාරී ප්‍රතිප්‍රහාරයකට වඩා නරක ආකාරයකින් නැවත ලබා දෙනු ඇත. අන්තර්ක්‍රියාකාරී ප්‍රතිප්‍රහාරයක් (විශේෂාංග ශාඛාවක් මත) කිසිදු අහිතකර බලපෑමක් ඇති නොකරයි.
xiix

1
ixiix මෙය සත්‍ය වන්නේ ඔබ පමණක් විශේෂාංග ශාඛාව සමඟ වැඩ කරන්නේ නම් පමණි. මෙය ඔබට කළ හැකි උපකල්පනයක් නොවේ. Git-SCM නැවත ප්‍රතිස්ථාපනය කිරීමට අදාළ පිටු කියවීමට මම නිර්දේශ කරමි . එහි සඳහන් වන්නේ " ඔබේ ගබඩාවෙන් පිටත පවතින කොමිස් නැවත ප්‍රතිස්ථාපනය නොකරන්න, මිනිසුන්ට ඒවා මත පදනම් වූ වැඩ තිබිය හැකිය. " තවද ඔබ දැනටමත් ප්‍රකාශිත කොමිස් මත වැඩ පදනම් කර ගෙන තිබේදැයි ඔබ නිශ්චිතව නොදන්නේ නම් (විමධ්‍යගත නිසා ඔබට දැනගත නොහැක git වල ස්වභාවය) ඔබ එය නොකරන්න.
Sebi2020

23

ඔබ දැනටමත් git merge bugfixමත main, ඔබ ඔබේ ඒකාබද්ධ තීන්දුව බලරහිත හැකි එක බවට සිදු:

git reset --soft HEAD^1
git commit

git reset --soft HEAD^1අවම වශයෙන් ඒකාබද්ධ කිරීම වේගයෙන් ඉදිරියට යන අවස්ථාවකදී, ඒකාබද්ධ වීමට පෙර සිදු කළ අවසන් කැපවීම අහෝසි කරන බවක් පෙනේ .
ජෙස්පර් මැතිසෙන්

Es ජෙස්පර්මැතිසන් වේගයෙන් ඉදිරියට ගියහොත් ඔබට ඒකාබද්ධ කිරීමේ බැඳීමක් නොලැබේ, එවිට ඔබ එසේ කරනු ඇත git reset --soft HEAD^<number-of-commits-to-squash>.
qwertzguy

පහළට ඒකාබද්ධ වීමෙන් පසු සෑම දෙයක්ම තනි කැපවීමකට යොමු කිරීමට මෙය මට උපකාරී විය.
killjoy

19

අභිරුචි බැඳීමක් සමඟ newFeatureශාඛාව ඒකාබද්ධ කරන්න master:

git merge --squash newFeature && git commit -m 'Your custom commit message';

ඒ වෙනුවට, ඔබ එසේ කරයි

git merge --squash newFeature && git commit

ඔබට newFeatureඅභිරුචිකරණය කළ හැකි සියලුම ශාඛා කොමිස් ඇතුළත් වන බැඳීම් පණිවිඩයක් ඔබට ලැබෙනු ඇත .

මම එය මෙහි විස්තරාත්මකව පැහැදිලි කරමි: https://youtu.be/FQNAIacelT4


11

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

නිධිය සඳහා සක්‍රීය කර ඇති ඒකාබද්ධ කිරීමේ විකල්ප මත පදනම්ව, ස්කොෂ් ඒකාබද්ධ කිරීමේ හැකියාව ගිතුබ්ට ඇත.

ස්කොෂ් ඒකාබද්ධ කිරීම් සක්‍රීය කර ඇත්නම්, "ඒකාබද්ධ කිරීම" බොත්තම යටතේ ඇති පතන කොටසේ "ස්කොෂ් සහ ඒකාබද්ධ කිරීම" විකල්පය දිස්විය යුතුය.

"ස්කොෂ් සහ ඒකාබද්ධ කිරීම" ගිතුබ් විශේෂාංගයේ තිර රුව


ඔබගේ ගිණුම හා සම්බන්ධ සුපුරුදු විද්‍යුත් ලිපිනය GitHub භාවිතා කරයි. ඔබට බහු ඊමේල් ලිපින තිබේ නම් සහ ඔබට ද්විතීයික එකක් භාවිතා කිරීමට අවශ්‍ය නම්, ඔබට GH UI භාවිතා කළ නොහැක.
ලූකා ගුඩි

4

ඔබ බහු කාර්යයන් සමඟ විශේෂාංග / කාර්ය 1 හි වැඩ කළා යැයි සිතමු.

  1. ඔබේ ව්‍යාපෘති ශාඛාවට යන්න (ව්‍යාපෘතිය / my_project)

    git checkout project/my_project
    
  2. නව ශාඛාවක් සාදන්න (විශේෂාංගය / කාර්යය 1_බග්ෆික්ස්)

    git checkout -b feature/task1_bugfix
    
  3. --squashවිකල්පය සමඟ සලකුණු කරන්න

    git merge --squash feature/task1
    
  4. තනි කැපවීමක් සාදන්න

    git commit -am "add single comments"
    
  5. ඔබේ ශාඛාව තල්ලු කරන්න

    git push --set-upstream origin feature/task1_bugfix
    

1

Git සඳහා

නව අංගයක් සාදන්න

පර්යන්තය / ෂෙල් හරහා:

git checkout origin/feature/<featurename>
git merge --squash origin/feature/<featurename>

මෙය සිදු නොකරන අතර, පළමුව එය සමාලෝචනය කිරීමට ඔබට ඉඩ සලසයි.

ඉන්පසු මෙම නව ශාඛාවෙන් විශේෂාංගය අවසන් කර පරණ එක මකා දමන්න / නොසලකා හරින්න (ඔබ කළ දේ).


E මෙලෙබියස් "SourceTree" පිළිබඳ එකම සඳහන ඔබේ වාක්‍යයේ ඇත, එය ටැගයක් හෝ පෙර ප්‍රශ්නයක් නම්: එය තවදුරටත් නොපවතී.
ජෝර්දාන් ස්ටෙෆනෙලි

1
Answer ජෝර්දාන්ස්ටෙෆනෙලි SourceTree මෙම පිළිතුරේ මුල් පිටපතෙහි භාවිතා කරන ලදී . එය සවි කර ඇති බව දැනුම් දීම ගැන ස්තූතියි!
මෙලෙබියස්

1

ඔබට දෝෂයක් ඇති වුවහොත්: ඔබ සතුව නැති ලිපිගොනු ඇති බැවින් කැපවීම කළ නොහැක.

git checkout master
git merge --squash bugfix
git add .
git commit -m "Message"

සියලුම ගැටුම් ලිපිගොනු සවි කර ඇත

git add . 

ඔබට ද භාවිතා කළ හැකිය

git add [filename]

0

ඔබේ ප්‍රාදේශීය ශාඛාව තල්ලු කිරීමට පෙර එය ස්කොෂ් කිරීමට:

  1. දැනටමත් පරීක්ෂා කර නොමැති නම් වැඩ කිරීමට ප්‍රශ්නයක් ඇති ශාඛාව පරීක්ෂා කරන්න.

  2. ඔබ තබා ගැනීමට කැමති පැරණිතම කැපවීමේ ෂා සොයා ගන්න.

  3. එම බැඳීමෙන් නව ශාඛාවක් (tmp1) සාදන්න / පරීක්ෂා කරන්න.

    git checkout -b tmp1 <sha1-of-commit>

  4. මුල් ශාඛාව නව ස්කොෂ් කිරීමකට ඒකාබද්ධ කරන්න.

    git merge --squash <original branch>

  5. ඒකාබද්ධ කිරීම මගින් නිර්මාණය කර ඇති වෙනස්කම් සාරාංශගත පණිවිඩයක් සමඟ සිදු කරන්න.

    git commit -m <msg>

  6. ඔබට ස්කොෂ් කිරීමට අවශ්‍ය මුල් ශාඛාව පරීක්ෂා කරන්න.

    git checkout <branch>

  7. ඔබ තබා ගැනීමට කැමති මුල් කැපවීම ෂා වෙත නැවත සකසන්න.

    git reset --soft <sha1>

  8. නව tmp1 ශාඛාව මත පදනම්ව මෙම ශාඛාව නැවත සකස් කරන්න.

    git rebase tmp1

  9. ඒක තමයි - දැන් සියල්ල නිවැරදි බව ඔබට විශ්වාස වූ පසු තාවකාලික tmp1 ශාඛාව මකන්න.


0

මෙම ක්‍රියාවලිය පහසු කිරීම සඳහා මා විසින් නිර්මාණය කරන ලද මෙවලම ඔබට භාවිතා කළ හැකිය: git-squash . නිදසුනක් ලෙස, ප්‍රධාන ශාඛාවෙන් අතු බෙදී ඇති විශේෂාංග ශාඛාවේ සියලුම කොමිස් ස්කොෂ් කිරීමට, ලියන්න:

git squash master
git push --force
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.