Git rebase එදිරිව Git ඒකාබද්ධ කිරීම භාවිතා කිරීම නිර්දේශ කරන්නේ කවදාද?
සාර්ථක ප්රතිප්රහාරයකින් පසුව මට තවමත් ඒකාබද්ධ වීමට අවශ්යද?
Git rebase එදිරිව Git ඒකාබද්ධ කිරීම භාවිතා කිරීම නිර්දේශ කරන්නේ කවදාද?
සාර්ථක ප්රතිප්රහාරයකින් පසුව මට තවමත් ඒකාබද්ධ වීමට අවශ්යද?
Answers:
ඉතින් ඔබ එකක් භාවිතා කරන්නේ කවදාද?
init
නව repo, add
ගොනුව සහ සමඟ නාමාවලියක් සාදන්න commit
. නව විශේෂාංග ශාඛාවක් පරීක්ෂා කරන්න ( checkout -b feature
.) පෙළ ගොනුව වෙනස් කරන්න, කැපවී නැවත නැවත කරන්න එවිට විශේෂාංග ශාඛාවේ නව කොමිස් දෙකක් තිබේ. එවිට checkout master
සහ merge feature
. තුළ log
, මාස්ටර් පිළිබඳ මගේ මුලික කැපවීම මම දකිමි, ඉන් පසුව විශේෂාංග දෙකෙන් ඒකාබද්ධ කරන ලදී. ඔබ නම් merge --squash feature
, විශේෂාංගය මාස්ටර් සමඟ ඒකාබද්ධ වී ඇති නමුත් එය බැඳී නොමැත, එබැවින් මාස්ටර් පිළිබඳ එකම නව කැපවීම ඔබ විසින්ම කරගනු ඇත.
ඒක සරලයි. ඔබේ වැඩ සඳහා නව පදනමක් ලෙස වෙනත් ශාඛාවක් භාවිතා කරන ලෙස ඔබ කියනු ලැබේ .
උදාහරණයක් ලෙස, ඔබට ශාඛාවක් තිබේ නම් master
, ඔබ නව අංගයක් ක්රියාත්මක කිරීම සඳහා ශාඛාවක් නිර්මාණය කර, ඔබ එය නම් කරන්නැයි කියන්නේ නම් cool-feature
, ඇත්ත වශයෙන්ම ප්රධාන ශාඛාව ඔබේ නව අංගය සඳහා පදනම වේ.
දැන් එක්තරා අවස්ථාවක දී ඔබ master
ශාඛාව තුළ ක්රියාත්මක කළ නව අංගය එක් කිරීමට අවශ්යය . ඔබට ශාඛාව වෙත මාරු වී master
ඒකාබද්ධ කළ හැකිය cool-feature
:
$ git checkout master
$ git merge cool-feature
නමුත් මේ ආකාරයෙන් නව ව්යාජ බැඳීමක් එකතු වේ. ඔබට ස්පැගටි ඉතිහාසය මග හැරීමට අවශ්ය නම් ඔබට නැවත ප්රතිස්ථාපනය කළ හැකිය :
$ git checkout cool-feature
$ git rebase master
ඉන්පසු එය ඒකාබද්ධ කරන්න master
:
$ git checkout master
$ git merge cool-feature
මෙවර, මාතෘකා ශාඛාවට එකම මාස්ටර්ගේ කොමිස් සහ නව අංගය සමඟ ඇති කොමිස් ඇති බැවින්, ඒකාබද්ධ කිරීම වේගයෙන් ඉදිරියට යනු ඇත.
but this way a new dummy commit is added, if you want to avoid spaghetti-history
- කොහොමද නරක?
Sean Schofield
එය විවරණයක සඳහන් කර ඇති පරිදි: "ඔබ නැවත වරක් ඔබේ දේවල් නැවත මාස්ටර් සමඟ ඒකාබද්ධ කළ නිසා (එය දැනටමත් විස්තර කර ඇති පරිදි ඉතා සුළු කාරණයකි) ඔබ එය ur ර් කැපවීමේ ඉතිහාසයේ" ඉහළින් "හිඳගෙන සිටින නිසා විශාල වශයෙන් සති කිහිපයකට පසුව විශේෂාංග ලිවිය හැකි නමුත් ඒකාබද්ධ කළ හැකි ව්යාපෘති, ඉතිහාසයේ නැවත මාස්ටර් ක්රමයට “පිරවූ” නිසා ඒවා මාස්ටර් සමඟ ඒකාබද්ධ කිරීමට ඔබට අවශ්ය නැත. පුද්ගලිකව මම කැමතියි git log සහ see දැකීමට එම නවතම අංගය “ඉහළින්ම” තබා ඇති බව සලකන්න. බැඳීම් දිනයන් සංරක්ෂණය කර ඇති බව සලකන්න - නැවත සකස් කිරීම එම තොරතුරු වෙනස් නොකරයි. ”
merge
, rebase
, fast-forward
, ආදිය) නියමයෙන් ඇල්කේන වලට ප්රස්තාරය විශේෂිත උපක්රම සඳහන් කර ඇත. එම මානසික ආකෘතිය මනසේ තබාගෙන තර්ක කිරීම ඔවුන්ට පහසු වේ.
TSamper විසින් සඳහන් කරන ලද මගේම පිළිතුරට අනුපූරක වීමට ,
නැවත එකතු කිරීම බොහෝ විට ඒකාබද්ධ වීමට පෙර කිරීම හොඳ අදහසකි, මන්ද අදහස නම් ඔබ ඒකාබද්ධ වන ශාඛාවේ Y
වැඩ ඔබේ ශාඛාව තුළ B
ඒකාබද්ධ කිරීමයි.
නමුත් නැවතත්, ඒකාබද්ධ වීමට පෙර, ඔබ ඔබේ ශාඛාවේ ඇති ඕනෑම ගැටුමක් නිරාකරණය කරයි (එනම්: "නැවත සකස් කිරීම", "මගේ ශාඛාවේ මගේ වැඩ කටයුතු ශාඛාවේ සිට මෑත ස්ථානයක සිට නැවත ධාවනය කරන්න B
).
නිවැරදිව සිදු කළ හොත්, පසුව ඔබේ ශාඛාවෙන් ඒකාබද්ධ කිරීම ශාඛාව B
වේගයෙන් ඉදිරියට යා හැකිය.
ඒකාබද්ධ කිරීම ගමනාන්ත ශාඛාවට කෙලින්ම බලපායි B
, එයින් අදහස් වන්නේ ඒකාබද්ධ කිරීම වඩා සුළු කාරණයක් වන අතර එසේ නොවුවහොත් එම ශාඛාව B
ස්ථාවර තත්වයකට පත්වීමට දිගු කාලයක් ගත විය හැකිය (ඔබ සියලු ගැටුම් විසඳීමට කාලයයි)
ප්රතිප්රහාරයකින් පසු ඒකාබද්ධ වීමේ ලක්ෂ්යය?
මා විස්තර කරන නඩුවේදී, මම B
මගේ ශාඛාව වෙත නැවත පිවිසෙන්නේ, මගේ කෘතිය වඩාත් මෑත කාලීන ස්ථානයක සිට නැවත ධාවනය කිරීමට අවස්ථාව ලබා ගැනීම සඳහා ය B
, නමුත් මගේ ශාඛාව තුළ රැඳී සිටියදී ය.
මෙම අවස්ථාවේ දී, මගේ "නැවත ධාවනය කරන ලද" කාර්යය ගෙන ඒමට ඒකාබද්ධ කිරීමක් තවමත් අවශ්ය වේ B
.
අනෙක් අවස්ථාව නම් ( නිදසුනක් ලෙස Git Ready හි විස්තර කර ඇති ), ඔබේ වැඩ කටයුතු සෘජුවම B
ප්රතිප්රහාරයක් හරහා ගෙන ඒමයි (එමඟින් ඔබගේ සියලු යහපත් ක්රියා සංරක්ෂණය වේ, නැතහොත් අන්තර්ක්රියාකාරී ප්රතිප්රහාරයක් හරහා ඒවා නැවත ඇණවුම් කිරීමට ඔබට අවස්ථාව ලැබේ).
එවැනි අවස්ථාවකදී (බී ශාඛාවේ සිටියදී ඔබ නැවත ප්රතිස්ථාපනය කරන විට), ඔබ නිවැරදියි: තවදුරටත් ඒකාබද්ධ කිරීමක් අවශ්ය නොවේ:
අප ඒකාබද්ධ වී හෝ ප්රතිනිර්මාණය නොකළ විට පෙරනිමියෙන් Git ගසක්
නැවත ලබා ගැනීමෙන් අපට ලැබෙන්නේ:
එම දෙවන අවස්ථාව සියල්ලම වේ: නව අංගය මාස්ටර් වෙත නැවත ලබා ගන්නේ කෙසේද?
මගේ අදහස නම්, පළමු නැවත ලබා ගැනීමේ අවස්ථාව විස්තර කිරීමෙන්, නැවත ලබා ගැනීමක් ද ඒ සඳහා මූලික පියවරක් ලෙස භාවිතා කළ හැකි බව සැමට මතක් කර දීමයි (“නව අංගය නැවත මාස්ටර් වෙත ලබා ගැනීම”).
පළමුවෙන්ම නව විශේෂාංග ශාඛාව තුළට මාස්ටර් ගෙන ඒමට ඔබට රීබේස් භාවිතා කළ හැකිය: ප්රතිඅපනය මඟින් නව විශේෂාංග කොමිස් නැවත ප්රතිස්ථාපනය කරනු ඇත HEAD master
, නමුත් තවමත් නව විශේෂාංග ශාඛාව තුළ, ඔබේ ශාඛාවේ ආරම්භක ස්ථානය පැරණි ස්වාමියාගේ කැපවීමෙන් effectively ලදායී ලෙස ගෙන යයි HEAD-master
.
එමඟින් ඔබේ ශාඛාවේ ඇති ඕනෑම ගැටුම් නිරාකරණය කර ගැනීමට ඔබට ඉඩ සලසයි (අර්ථය, හුදකලාව, ඔබේ ගැටුම් නිරාකරණ අදියර බොහෝ කාලයක් ගත වුවහොත් සමාන්තරව පරිණාමය වීමට ස්වාමියාට ඉඩ දෙයි).
එවිට ඔබට මාස්ටර් වෙත මාරු වී ඒකාබද්ධ විය හැකිය new-feature
(හෝ ප්රතිස්ථාපනය කරන්නnew-feature
මතටmaster
ඔබේ සිදු අනාචාරයේ ආරක්ෂා කිරීමට අවශ්ය නම්new-feature
ශාඛාව).
නිසා:
master
.ඔබට කිසියම් සැකයක් ඇත්නම්, ඒකාබද්ධ කිරීම භාවිතා කරන්න.
නැවත එකතු කිරීම හා ඒකාබද්ධ කිරීම අතර ඇති එකම වෙනස්කම්:
එබැවින් කෙටි පිළිතුර නම් ඔබේ ඉතිහාසය කෙබඳු විය යුතුද යන්න මත පදනම්ව නැවත එකතු කිරීම හෝ ඒකාබද්ධ කිරීමයි .
කුමන මෙහෙයුමක් භාවිතා කළ යුතුද යන්න තෝරා ගැනීමේදී ඔබ සලකා බැලිය යුතු සාධක කිහිපයක් තිබේ.
එසේ නම්, නැවත නොයන්න. රීබේස් ශාඛාව විනාශ කරන අතර එම සංවර්ධකයින් භාවිතා නොකරන්නේ නම් බිඳුණු / නොගැලපෙන ගබඩාවන් git pull --rebase
ඇත. අනෙක් සංවර්ධකයින් ඉක්මනින් කලබල කිරීමට මෙය හොඳ ක්රමයකි.
නැවත සකස් කිරීම විනාශකාරී මෙහෙයුමකි. එයින් අදහස් වන්නේ, ඔබ එය නිවැරදිව අදාළ නොකරන්නේ නම්, ඔබට කැපවූ වැඩ අහිමි විය හැකි අතර / හෝ වෙනත් සංවර්ධකයින්ගේ ගබඩාවල අනුකූලතාව බිඳ දැමිය හැකිය.
ශාඛා හා ඒකාබද්ධ කිරීම සමඟ කටයුතු කිරීම සඳහා සමාගම්වලට කැපවූ කාර්ය මණ්ඩලයක් ලබා ගත හැකි කාලයක සිට සංවර්ධකයින් සියල්ලන්ම පැමිණි කණ්ඩායම්වල මම වැඩ කර ඇත්තෙමි. එම සංවර්ධකයින් Git ගැන වැඩි යමක් නොදන්නා අතර බොහෝ දේ දැන ගැනීමට අවශ්ය නැත. මෙම කණ්ඩායම් වලදී මම කිසිදු හේතුවක් නිසා නැවත ප්රතිස්ථාපනය කිරීම නිර්දේශ නොකරමි.
සමහර කණ්ඩායම් ශාඛා-එක්-විශේෂාංග ආකෘතියක් භාවිතා කරයි, එහිදී සෑම ශාඛාවක්ම අංගයක් නියෝජනය කරයි (හෝ දෝෂ නිරාකරණය, හෝ උප-අංග, ආදිය) මෙම ආකෘතියේ දී ශාඛාව අදාළ කොමිස් කට්ටල හඳුනා ගැනීමට උපකාරී වේ. නිදසුනක් වශයෙන්, එම ශාඛාවේ ඒකාබද්ධ කිරීම ආපසු හැරවීමෙන් කෙනෙකුට විශේෂාංගයක් ඉක්මනින් ආපසු හැරවිය හැකිය (සාධාරණ ලෙස කිවහොත් මෙය දුර්ලභ මෙහෙයුමකි). හෝ ශාඛා දෙකක් සංසන්දනය කිරීමෙන් අංගයක් වෙනස් කරන්න (වඩාත් පොදු). නැවත සකස් කිරීම ශාඛාව විනාශ කරන අතර මෙය සරල නොවේ.
එක් එක් සංවර්ධක ආකෘතිය භාවිතා කළ කණ්ඩායම්වල ද මම වැඩ කර ඇත්තෙමි (අපි සියල්ලෝම එහි සිටියෙමු). මෙම අවස්ථාවේ දී ශාඛාව විසින් කිසිදු අමතර තොරතුරක් ඉදිරිපත් නොකරයි (බැඳීම දැනටමත් කතුවරයා සතුව ඇත). නැවත පණ ගැන්වීමේදී කිසිදු හානියක් සිදු නොවනු ඇත.
ඒකාබද්ධ කිරීමක් ආපසු හැරවීමට සාපේක්ෂව නැවත ලබා ගැනීම (අහෝසි කිරීමේදී මෙන්) සැලකිය යුතු ලෙස දුෂ්කර සහ / හෝ කළ නොහැකි ය. ඔබට ආපසු හැරවීමට අවශ්ය අවස්ථාවක් ඇතැයි ඔබ සිතන්නේ නම් ඒකාබද්ධ කිරීම භාවිතා කරන්න.
ප්රතිස්ථාපන මෙහෙයුම් අනුරූපව ඇදගෙන යා යුතුය git pull --rebase
. ඔබ තනිවම වැඩ කරන්නේ නම්, සුදුසු වේලාවට ඔබ භාවිතා කළ යුතු දේ ඔබට මතක තබා ගත හැකිය. ඔබ කණ්ඩායමක් මත වැඩ කරන්නේ නම් මෙය සම්බන්ධීකරණය කිරීම ඉතා අපහසු වනු ඇත. බොහෝ ප්රතිස්ථාපන කාර්ය ප්රවාහයන් සියලු ඒකාබද්ධ කිරීම් සඳහා (සහ git pull --rebase
සියලු අදින්නන් සඳහා) නැවත භාවිතා කිරීම නිර්දේශ කරන්නේ මේ නිසා ය .
ඔබට පහත ඒකාබද්ධ කිරීමක් ඇතැයි උපකල්පනය කරන්න:
B -- C
/ \
A--------D
ඒකාබද්ධ කිරීම බැඳීම් ඉතිහාසය "විනාශ කරන" බව සමහර අය පවසනු ඇත, මන්ද ඔබ ප්රධාන ශාඛාවේ (A - D) ලොගය දෙස බැලුවහොත් ඔබට B සහ C හි ඇති වැදගත් බැඳීම් පණිවිඩ මග හැරෙනු ඇත.
මෙය සත්ය නම් අපට මෙවැනි ප්රශ්න නොමැත . මූලික වශයෙන්, ඔබ B සහ C දකින්නේ නැතැයි ඔබ පැහැදිලිවම ඉල්ලා නොසිටින්නේ නම් (- පළමු-මාපිය භාවිතා කරමින්). මෙය ඔබම උත්සාහ කිරීම ඉතා පහසුය.
ප්රවේශයන් දෙක එකිනෙකට වෙනස් ලෙස ඒකාබද්ධ වේ, නමුත් එකක් සෑම විටම අනෙකට වඩා හොඳ බව පැහැදිලි නැති අතර එය සංවර්ධකයාගේ කාර්ය ප්රවාහය මත රඳා පවතී. නිදසුනක් වශයෙන්, සංවර්ධකයෙකු නිතිපතා කැපවීමට නැඹුරු නම් (උදා: ඔවුන් රැකියාවෙන් ගෙදරට මාරුවීමේදී දිනකට දෙවරක් කැප කරයි) එවිට දී ඇති ශාඛාවක් සඳහා විශාල වැඩ කොටසක් කළ හැකිය. එම කොමිස් වලින් බොහොමයක් අවසාන නිෂ්පාදනය මෙන් පෙනෙන්නේ නැත (මම එක් අංගයකට වරක් හෝ දෙවරක් මගේ ප්රවේශය ප්රතිනිර්මාණය කිරීමට නැඹුරු වෙමි). වෙනත් අයෙකු සම්බන්ධිත කේත ක්ෂේත්රයක වැඩ කරන්නේ නම් සහ ඔවුන් මගේ වෙනස්කම් නැවත කිරීමට උත්සාහ කළහොත් එය තරමක් වෙහෙසකර ක්රියාවක් විය හැකිය.
"කාලය ඉතිරි කර ගැනීම" සඳහා ඔබ අන්වර්ථ rm
කිරීමට කැමති rm -rf
නම් සමහර විට නැවත ලබා ගැනීම ඔබ වෙනුවෙන් විය හැකිය.
මම නිතරම සිතන්නේ කවදා හෝ දවසක මට Git rebase යනු ගැටලුව විසඳන පුදුමාකාර මෙවලමකි. Git reflog යනු මගේ ගැටලුව විසඳන පුදුමාකාර මෙවලමක් වන අවස්ථාවක් මට හමුවනු ඇතැයි මම සිතමි. මම දැන් අවුරුදු පහකට වැඩි කාලයක් Git සමඟ වැඩ කර ඇත්තෙමි. එය සිදු වී නැත.
අවුල් සහගත ඉතිහාසයන් මට කිසි විටෙකත් ගැටලුවක් වී නොමැත. සිත් ඇදගන්නාසුළු නවකතාවක් මෙන් මගේ කැපවීමේ ඉතිහාසය මා කියවා නැත. මට ඉතිහාසයක් අවශ්ය බොහෝ විට මම කෙසේ හෝ Git blame හෝ Git bisect භාවිතා කරන්නෙමි. එවැනි අවස්ථාවකදී, ඒකාබද්ධ කිරීමේ බැඳීම ඇත්තෙන්ම මට ප්රයෝජනවත් වේ, මන්ද ඒකාබද්ධ කිරීම මඟින් ගැටලුව හඳුන්වා දුන්නේ නම්, එය මට අර්ථවත් තොරතුරු වේ.
මගේ සාමාන්ය උපදෙස් තවමත් පැවතුනද, නැවත භාවිතා කිරීම පිළිබඳව මා පෞද්ගලිකව මෘදු වී ඇති බව සඳහන් කිරීමට මම බැඳී සිටිමි. මම මෑතකදී කෝණික 2 ද්රව්ය ව්යාපෘතිය සමඟ බොහෝ සෙයින් මැදිහත් වී සිටිමි . ඔවුන් ඉතා පිරිසිදු කැපවීමේ ඉතිහාසයක් තබා ගැනීම සඳහා නැවත භාවිතා කිරීම භාවිතා කර ඇත. දී ඇති අඩුපාඩුවක් නිරාකරණය කර ඇත්තේ කුමක් ද යන්න සහ එම නිකුතුව නිකුතුවකට ඇතුළත් කර තිබේද නැද්ද යන්න ඉතා පහසුවෙන් බැලීමට මෙය මට ඉඩ දී ඇත. රීබේස් නිවැරදිව භාවිතා කිරීම සඳහා එය හොඳ උදාහරණයක් ලෙස සේවය කරයි.
මෙහි පිළිතුරු බොහොමයක් පවසන්නේ ඒකාබද්ධ කිරීම ඔබගේ සියලු කැපවීම් එකකට හරවන අතර එම නිසා ඔබේ කැපවීම් ආරක්ෂා කර ගැනීම සඳහා නැවත භාවිතා කිරීම යෝජනා කරන බවයි. මෙය වැරදිය. ඔබ දැනටමත් ඔබගේ බැඳීම් තල්ලු කර ඇත්නම් නරක අදහසක් .
ඒකාබද්ධ කිරීම ඔබගේ බැඳීම් මකා දමන්නේ නැත . ඒකාබද්ධ කිරීම ඉතිහාසය ආරක්ෂා කරයි! (gitk දෙස බලන්න) රීබේස් ඉතිහාසය නැවත ලියයි, එය ඔබ තල්ලු කළ පසු එය නරක දෙයකි .
ඒකාබද්ධ කිරීම භාවිතා කරන්න - ඔබ දැනටමත් තල්ලු කර ඇති සෑම අවස්ථාවකම නැවත ප්රතිස්ථාපනය නොකරන්න .
මෙන්න ලිනස් (Git හි කතුවරයා) එය භාර ගනී (දැන් මගේම බ්ලොග් අඩවියේ සත්කාරකත්වය දරයි , වේබැක් යන්ත්රය මගින් සොයා ගන්නා ලදි ). එය ඇත්තෙන්ම හොඳ කියවීමකි.
නැතහොත් ඔබට එම අදහසේම මගේම අනුවාදය පහතින් කියවිය හැකිය.
ස්වාමියා මත ශාඛාවක් නැවත සකස් කිරීම:
ඊට වෙනස්ව, මාතෘකා ශාඛාවක් ස්වාමියා සමඟ ඒකාබද්ධ කිරීම:
ටීඑල්ඩීආර්: එය වඩාත් වැදගත් දේ මත රඳා පවතී - පිළිවෙලට ඉතිහාසයක් හෝ සංවර්ධනයේ අනුක්රමය පිළිබඳ සැබෑ නිරූපණය
පිළිවෙලට ඇති ඉතිහාසයක් වඩාත්ම වැදගත් නම්, ඔබ පළමුව නැවත ප්රතිස්ථාපනය කර පසුව ඔබේ වෙනස්කම් ඒකාබද්ධ කරනු ඇත, එබැවින් නව කේතය යනු කුමක්ද යන්න හරියටම පැහැදිලි වේ. ඔබ දැනටමත් ඔබේ ශාඛාව තල්ලු කර ඇත්නම්, ප්රතිවිපාක සමඟ කටයුතු කළ හැකි නම් මිස නැවත නොයන්න.
අනුක්රමයේ සත්ය නිරූපණය වඩාත්ම වැදගත් නම්, ඔබ නැවත ප්රතිස්ථාපනය නොකර ඒකාබද්ධ වේ.
ඒකාබද්ධ කිරීම යන්නෙන් අදහස් වන්නේ: මගේ වෙනස්කම් ගමනාන්තයට ඒකාබද්ධ කරන තනි නව බැඳීමක් සාදන්න. සටහන: මෙම නව කැපවීමට දෙමව්පියන් දෙදෙනෙකු සිටී - ඔබගේ බැඳීම් මාලාවේ නවතම කැපවීම සහ ඔබ ඒකාබද්ධ කරන අනෙක් ශාඛාවේ නවතම කැපවීම.
ප්රතිස්ථාපනය යන්නෙන් අදහස් කරන්නේ: මගේ වර්තමාන කොමිස් කට්ටලය ඉඟි ලෙස භාවිතා කරමින් නව කොමිස් මාලාවක් සාදන්න. වෙනත් වචන වලින් කිවහොත්, මම නැවත ප්රතිස්ථාපනය කරන මොහොතේ සිට ඒවා සෑදීමට පටන් ගත්තා නම් මගේ වෙනස්කම් කෙබඳු වනු ඇත්දැයි ගණනය කරන්න. නැවත ගෙවීමෙන් පසුව, ඔබට ඔබගේ වෙනස්කම් නැවත පරීක්ෂා කිරීමට අවශ්ය විය හැකි අතර, නැවත ගෙවීමේදී ඔබට ගැටුම් කිහිපයක් ඇති විය හැකිය.
මෙය සැලකිල්ලට ගෙන, ඔබ නැවත ප්රතික්ෂේප කරන්නේ ඇයි? සංවර්ධන ඉතිහාසය පැහැදිලිව තබා ගැනීම සඳහා. ඔබ X විශේෂාංගය මත වැඩ කරන බව කියමු. ඔබ අවසන් වූ විට, ඔබ ඔබේ වෙනස්කම් ඒකාබද්ධ කරයි. ගමනාන්තයට දැන් "එකතු කරන ලද විශේෂාංග X" රේඛාව ඔස්සේ යමක් පවසන තනි කැපවීමක් ඇත. දැන්, ඒකාබද්ධ කිරීම වෙනුවට, ඔබ නැවත ප්රතිස්ථාපනය කර ඒකාබද්ධ කළහොත්, ගමනාන්ත සංවර්ධන ඉතිහාසයේ තනි තාර්කික ප්රගතියක් තුළ සියලු තනි කැපවීම් අඩංගු වේ. මෙය පසුව වෙනස්කම් සමාලෝචනය කිරීම වඩාත් පහසු කරයි. සංවර්ධකයින් 50 ක් සෑම විටම විවිධ අංග ඒකාබද්ධ කරන්නේ නම් සංවර්ධන ඉතිහාසය සමාලෝචනය කිරීම ඔබට කොතරම් දුෂ්කරදැයි සිතා බලන්න.
එයින් කියැවෙන්නේ, ඔබ දැනටමත් වැඩ කරමින් සිටින ශාඛාව ඉහළට තල්ලු කර ඇත්නම්, ඔබ නැවත ප්රතිස්ථාපනය නොකළ යුතු අතර ඒ වෙනුවට ඒකාබද්ධ කරන්න. ඉහළට තල්ලු කර නොමැති ශාඛා සඳහා, නැවත සකස් කිරීම, පරීක්ෂා කිරීම සහ ඒකාබද්ධ කිරීම.
උඩු යටිකුරු කිරීමට පෙර ඔබේ ශාඛාවෙන් ලැබෙන කොමිස් ඉවත් කර ගැනීමට ඔබට අවශ්ය වූ විට නැවත ප්රතිස්ථාපනය කිරීමට ඔබට අවශ්ය විය හැකි තවත් අවස්ථාවකි. උදාහරණයක් ලෙස: යම්කිසි නිදොස් කිරීමේ කේතයක් මුලදී හඳුන්වා දෙන කොමිස් සහ වෙනත් අය එම කේතය පිරිසිදු කරයි. මෙය කළ හැකි එකම ක්රමය අන්තර්ක්රියාකාරී ප්රතිප්රහාරයක් කිරීම ය:git rebase -i <branch/commit/tag>
UPDATE: ඔබ ද ඔබට රේඛීය නොවන ඉතිහාසය සහාය නොදෙන වෙළුම් පාලන පද්ධතිය (කිරීමට දෙනාටම Git භාවිතා කරන විට rebase භාවිතා කිරීමට අවශ්ය Subversion උදාහරණයක් ලෙස). Git-svn පාලම භාවිතා කරන විට, ඔබ නැවත උපසිරැසි සමඟ ඒකාබද්ධ කරන වෙනස්කම් කඳෙහි නවතම වෙනස්කම් වලට ඉහළින් සිදුවන වෙනස්කම් ලැයිස්තුවක් වීම ඉතා වැදගත් වේ. එය කිරීමට ඇත්තේ ක්රම දෙකක් පමණි: (1) වෙනස්කම් අතින් ප්රතිනිර්මාණය කිරීම සහ (2) රීබේස් විධානය භාවිතා කිරීම, එය වඩා වේගවත් වේ.
යාවත්කාලීන කිරීම 2: නැවත ගෙවීමක් ගැන සිතීමට තවත් අමතර ක්රමයක් නම්, එය ඔබගේ සංවර්ධන ශෛලියේ සිට ඔබ කැපවී සිටින ගබඩාවේ පිළිගත් ශෛලියට සිතියම් ගත කිරීමට ඉඩ සලසයි. අපි කියමු ඔබ කුඩා, කුඩා කැබලිවලට බැඳීමට කැමතියි. යතුරු ලියනය නිවැරදි කිරීමට ඔබට එක් කැපවීමක් ඇත, භාවිතයට නොගත් කේත ඉවත් කිරීමට එක් අයෙකු බැඳී සිටී. ඔබ කළ යුතු දේ අවසන් කරන විට, ඔබට දිගු කොමිස් මාලාවක් තිබේ. දැන් අපි කියමු ඔබ කරන කැපවීම විශාල කොමිස් දිරිගැන්වීම සඳහා, එබැවින් ඔබ කරන වැඩ සඳහා යමෙක් කොමිස් එකක් හෝ දෙකක් බලාපොරොත්තු වේ. ඔබ ඔබේ බැඳීම් මාලාව ගෙන ඒවා අපේක්ෂිත දේට සම්පීඩනය කරන්නේ කෙසේද? ඔබ අන්තර්ක්රියාකාරී ප්රතිරෝධයක් භාවිතා කරන අතර ඔබේ කුඩා කැපවීම් විශාල කැබලිවලට අඩු කරන්න. ආපසු හැරවීම අවශ්ය වූයේ නම් එය එසේම වේ - ඔබේ ශෛලිය විශාල කොමිස් කිහිපයක් නම්, නමුත් ගබඩාව කුඩා කොමිස් වල දිගු නූල් ඉල්ලා සිටියේය. එය සිදු කිරීම සඳහා ඔබ නැවත භාවිතා කිරීමක් භාවිතා කරනු ඇත. ඔබ ඒ වෙනුවට ඒකාබද්ධ වී ඇත්නම්, ඔබ දැන් ඔබගේ කැපවීමේ විලාසය ප්රධාන ගබඩාවට බද්ධ කර ඇත. සංවර්ධකයින් විශාල ප්රමාණයක් සිටී නම්, යම් කාලයකට පසු විවිධ කැපවීම් ශෛලීන් සහිත ඉතිහාසයක් අනුගමනය කිරීම කොතරම් දුෂ්කර දැයි ඔබට සිතාගත හැකිය.
යාවත්කාලීන කිරීම 3: Does one still need to merge after a successful rebase?
ඔව්. හේතුව නම්, ප්රතිප්රහාරයක් සඳහා අනිවාර්යයෙන්ම “මාරුවීමක්” ඇතුළත් වේ. මා ඉහත කී පරිදි, මෙම කොමිස් ගණනය කරනු ලැබේ, නමුත් ඔබට අතු බෙදීමේ ස්ථානයේ සිට කොමිස් 14 ක් තිබුනේ නම්, එවිට ඔබේ ප්රතිප්රහාරයේ කිසිදු වැරැද්දක් සිදු නොවේ යැයි උපකල්පනය කළහොත්, ඔබ පසු 14 ක් ඉදිරියට යනු ඇත (ඔබ නැවත ප්රතිස්ථාපනය කරන මොහොතේ සිට) නැවත ගෙවීම සිදු කරනු ලැබේ. නැවත ලබා ගැනීමට පෙර ඔබට ශාඛාවක් තිබුණි. ඔබට පසුව එකම දිගකින් යුත් ශාඛාවක් ලැබෙනු ඇත. ඔබගේ වෙනස්කම් ප්රකාශයට පත් කිරීමට පෙර ඔබ තවමත් ඒකාබද්ධ කළ යුතුය. වෙනත් වචන වලින් කිවහොත්, ඔබට අවශ්ය වාර ගණනක් නැවත ප්රතිස්ථාපනය කරන්න (නැවතත්, ඔබ ඔබේ වෙනස්කම් ඉහළට තල්ලු නොකළේ නම් පමණි). ඒකාබද්ධ කරන්න ඔබ නැවත ප්රතිස්ථාපනය කිරීමෙන් පසුව පමණි.
git merge
සඳහා බල කරන --no-ff
විකල්පයට @mbx සහය දක්වයි .
ඒකාබද්ධ කිරීම නියත වශයෙන්ම වෙනස්කම් ඒකාබද්ධ කිරීමට පහසුම හා වඩාත් පොදු ක්රමය වන අතර, එය එකම එකක් නොවේ: ප්රතිස්ථාපනය යනු ඒකාබද්ධ කිරීමේ විකල්ප මාධ්යයකි.
අවබෝධය ටිකක් හොඳ ඒකාබද්ධ කිරීම
Git ඒකාබද්ධ කිරීමක් සිදු කරන විට, එය කොමිස් තුනක් සොයයි:
වේගයෙන් ඉදිරියට හෝ ඒකාබද්ධ කිරීමේ බැඳීම
ඉතා සරල අවස්ථා වලදී, ශාඛා දෙකෙන් එකකට අතු බෙදීම් සිදු වූ දා සිට නව කොමිස් කිසිවක් නොමැත - එහි නවතම කැපවීම තවමත් පොදු මුතුන් මිත්තෙකි.
මෙම අවස්ථාවෙහිදී, අනුකලනය සිදු කිරීම ඉතා සරල ය: පොදු මුතුන් මිත්තන්ගේ කැපවීමට ඉහළින් Git හට අනෙක් ශාඛාවේ සියලු කැපවීම් එකතු කළ හැකිය. Git හි, මෙම සරලම ඒකාබද්ධ කිරීමේ ක්රමය “වේගයෙන් ඉදිරියට යාම” ලෙස හැඳින්වේ. ශාඛා දෙකම එකම ඉතිහාසය බෙදා ගනී.
කෙසේ වෙතත්, බොහෝ අවස්ථාවන්හිදී, ශාඛා දෙකම තනි තනිව ඉදිරියට ගියේය.
අනුකලනය කිරීම සඳහා, Git විසින් ඔවුන් අතර ඇති වෙනස්කම් අඩංගු නව බැඳීමක් නිර්මාණය කළ යුතුය - ඒකාබද්ධ කිරීමේ බැඳීම.
මානව කොමිස් සහ ඒකාබද්ධ කිරීමේ කමිටු
සාමාන්යයෙන්, කැපවීමක් මිනිසෙකු විසින් ප්රවේශමෙන් නිර්මාණය කරනු ලැබේ. එය අර්ථවත් ඒකකයක් වන අතර එය අදාළ වෙනස්කම් පමණක් ආවරණය කර ඒවා විවරණයකින් විවරණය කරයි.
ඒකාබද්ධ කිරීමේ බැඳීම ටිකක් වෙනස් ය: සංවර්ධකයෙකු විසින් නිර්මාණය කරනු වෙනුවට එය ස්වයංක්රීයව Git විසින් නිර්මාණය කරනු ලැබේ. අදාළ වෙනස්කම් සමූහයක් ඔතා ගැනීම වෙනුවට, එහි අරමුණ වන්නේ ගැටයක් මෙන් අතු දෙකක් සම්බන්ධ කිරීමයි. ඔබට පසුව ඒකාබද්ධ කිරීමේ මෙහෙයුමක් අවබෝධ කර ගැනීමට අවශ්ය නම්, ඔබ ශාඛා දෙකේම ඉතිහාසය සහ ඊට අනුරූප බැඳීම් ප්රස්ථාරය දෙස බැලිය යුතුය.
Rebase සමඟ ඒකාබද්ධ වීම
සමහර අය එවැනි ස්වයංක්රීය ඒකාබද්ධ කිරීම් නොමැතිව යාමට කැමැත්තක් දක්වයි. ඒ වෙනුවට, ඔවුන්ට අවශ්ය වන්නේ ව්යාපෘතියේ ඉතිහාසය තනි, සරල රේඛාවකින් පරිණාමය වූවාක් මෙනි. යම් අවස්ථාවක දී එය බහු ශාඛා වලට බෙදී ඇති බවට කිසිදු සාක්ෂියක් ඉතිරිව නැත.
පියවරෙන් පියවර නැවත ගෙවීමේ ක්රියාවලියක් හරහා ගමන් කරමු. මෙම දර්ශනය පෙර උදාහරණ වලට සමාන වේ: අපට අවශ්ය වන්නේ ශාඛා-බී සිට ශාඛා-ඒ දක්වා වෙනස්වීම් ඒකාබද්ධ කිරීමට ය, නමුත් දැන් නැවත භාවිතා කිරීමෙනි.
අපි මෙය පියවර තුනකින් කරන්නෙමු
git rebase branch-A // Synchronises the history with branch-A
git checkout branch-A // Change the current branch to branch-A
git merge branch-B // Merge/take the changes from branch-B to branch-A
පළමුවෙන්ම, රේඛා අතු බෙදීමට පටන් ගත් පසු (පොදු මුතුන් මිත්තන්ගේ කැපවීමෙන් පසුව) සිදු වූ ශාඛා-ඒ පිළිබඳ සියලු කටයුතු Git "අහෝසි කරනු ඇත". කෙසේ වෙතත්, ඇත්ත වශයෙන්ම, එය ඒවා ඉවත නොදමනු ඇත: ඒ වෙනුවට ඔබට එම ක්රියාවන් "තාවකාලිකව ගැලවීම" ලෙස සිතිය හැකිය.
ඊළඟට, එය අපට ඒකාබද්ධ කිරීමට අවශ්ය ශාඛා-බී ශාඛාවෙන් අදාළ වේ. මෙම අවස්ථාවෙහිදී, ශාඛා දෙකම හරියටම සමාන වේ.
අවසාන පියවරේදී, ශාඛා-ඒ පිළිබඳ නව කොමිස් දැන් නැවත යෙදී ඇත - නමුත් නව ස්ථානයක, ශාඛා-බී වෙතින් ඒකාබද්ධ කොමිස් වලට ඉහළින් (ඒවා නැවත පදනම් වේ).
ප්රති result ලය පෙනෙන්නේ සංවර්ධනය සරල රේඛාවකින් සිදු වූ බවයි. සියලු ඒකාබද්ධ වෙනස්කම් අඩංගු ඒකාබද්ධ කිරීමේ බැඳීමක් වෙනුවට, මුල් බැඳීම් ව්යුහය ආරක්ෂා විය.
අවසාන වශයෙන්, ඔබට අනවශ්ය හා ස්වයංක්රීයව ජනනය කළ නොහැකි පිරිසිදු ශාඛා ශාඛාවක් ලැබෙනු ඇත .
සටහන: මෙම නියමයි සිට ගත වන පශ්චාත් විසින් git-tower
. මෙහි ඇති අවාසි ද rebase
එකම ලිපියේ හොඳ කියවීමකි.
ඒකාබද්ධ කිරීමට / නැවත ප්රතිස්ථාපනය කිරීමට පෙර:
A <- B <- C [master]
^
\
D <- E [branch]
පසු git merge master
:
A <- B <- C
^ ^
\ \
D <- E <- F
පසු git rebase master
:
A <- B <- C <- D' <- E'
(A, B, C, D, E සහ F යනු කොමිස් වේ)
මෙම උදාහරණය සහ Git පිළිබඳ වඩාත් හොඳින් නිදර්ශනය කළ තොරතුරු Git The Basics Tutorial හි සොයාගත හැකිය .
මෙම වාක්යයට එය ලැබේ:
පොදුවේ ගත් කල, ලෝක දෙකෙහිම හොඳම දේ ලබා ගත හැකි ක්රමය නම්, ඔබ විසින් සිදුකරන ලද දේශීය වෙනස්කම් නැවත ප්රතිස්ථාපනය කිරීමයි, නමුත් ඔබේ කතාව පිරිසිදු කිරීම සඳහා ඔබ ඒවා තල්ලු කිරීමට පෙර තවමත් බෙදාගෙන නැත, නමුත් ඔබ කොහේ හෝ තල්ලු කළ කිසිවක් නැවත ප්රතික්ෂේප නොකරන්න .
මෙම පිළිතුර Git Flow වටා පුළුල් ලෙස නැඹුරු වේ. ලස්සන ASCII වගු උත්පාදක යන්ත්රය සමඟ වගු ජනනය කර ඇති අතර, මෙම අපූරු විධානය සහිත ඉතිහාස ගස් ( අන්වර්ථ ලෙස git lg
):
git log --graph --abbrev-commit --decorate --date=format:'%Y-%m-%d %H:%M:%S' --format=format:'%C(bold blue)%h%C(reset) - %C(bold cyan)%ad%C(reset) %C(bold green)(%ar)%C(reset)%C(bold yellow)%d%C(reset)%n'' %C(white)%s%C(reset) %C(dim white)- %an%C(reset)'
ඉතිහාස වෘක්ෂයන්ට වඩා අනුකූල වන පරිදි වගු ප්රතිලෝම කාලානුක්රමික පිළිවෙලට ඇත. git merge
සහ git merge --no-ff
පළමු අතර වෙනස ද බලන්න (සාමාන්යයෙන් git merge --no-ff
ඔබේ ඉතිහාසය යථාර්ථයට සමීප වන බැවින් භාවිතා කිරීමට ඔබට අවශ්යය ):
git merge
විධාන:
Time Branch "develop" Branch "features/foo"
------- ------------------------------ -------------------------------
15:04 git merge features/foo
15:03 git commit -m "Third commit"
15:02 git commit -m "Second commit"
15:01 git checkout -b features/foo
15:00 git commit -m "First commit"
ප්රති ult ලය:
* 142a74a - YYYY-MM-DD 15:03:00 (XX minutes ago) (HEAD -> develop, features/foo)
| Third commit - Christophe
* 00d848c - YYYY-MM-DD 15:02:00 (XX minutes ago)
| Second commit - Christophe
* 298e9c5 - YYYY-MM-DD 15:00:00 (XX minutes ago)
First commit - Christophe
git merge --no-ff
විධාන:
Time Branch "develop" Branch "features/foo"
------- -------------------------------- -------------------------------
15:04 git merge --no-ff features/foo
15:03 git commit -m "Third commit"
15:02 git commit -m "Second commit"
15:01 git checkout -b features/foo
15:00 git commit -m "First commit"
ප්රති ult ලය:
* 1140d8c - YYYY-MM-DD 15:04:00 (XX minutes ago) (HEAD -> develop)
|\ Merge branch 'features/foo' - Christophe
| * 69f4a7a - YYYY-MM-DD 15:03:00 (XX minutes ago) (features/foo)
| | Third commit - Christophe
| * 2973183 - YYYY-MM-DD 15:02:00 (XX minutes ago)
|/ Second commit - Christophe
* c173472 - YYYY-MM-DD 15:00:00 (XX minutes ago)
First commit - Christophe
git merge
එදිරිව git rebase
පළමු කරුණ: සෑම විටම අංග සංවර්ධනය කිරීමට ඒකාබද්ධ කරන්න, කිසි විටෙකත් විශේෂාංග වලින් සංවර්ධනය නොවිය යුතුය. මෙය නැවත සකස් කිරීමේ ස්වර්ණමය නීතියේ ප්රති ence ලයකි :
රන් රීතිය
git rebase
නම් එය කිසි විටෙකත් පොදු ශාඛා වල භාවිතා නොකිරීමයි.
ඔබ කොහේ හෝ තල්ලු කළ කිසිවක් නැවත ප්රතික්ෂේප නොකරන්න.
මම පුද්ගලිකව එකතු කරමි: එය විශේෂාංග ශාඛාවක් මිස ඔබ සහ ඔබේ කණ්ඩායම එහි ප්රතිවිපාක ගැන දැනුවත් නොවේ නම් .
එබැවින් git merge
vs පිළිබඳ ප්රශ්නය git rebase
අදාළ වන්නේ විශේෂාංග ශාඛාවලට පමණි (පහත උදාහරණ වලදී, --no-ff
ඒකාබද්ධ කිරීමේදී සෑම විටම භාවිතා කර ඇත). වඩා හොඳ විසඳුමක් ඇති බව මට විශ්වාස නැති නිසා ( විවාදයක් පවතී ), මම සපයන්නේ විධාන දෙකම හැසිරෙන ආකාරය පමණි. මගේ නඩුවේදී, git rebase
එය වඩාත් හොඳ ඉතිහාස ගසක් නිපදවන බැවින් භාවිතා කිරීමට මම කැමැත්තෙමි :)
git merge
විධාන:
Time Branch "develop" Branch "features/foo" Branch "features/bar"
------- -------------------------------- ------------------------------- --------------------------------
15:10 git merge --no-ff features/bar
15:09 git merge --no-ff features/foo
15:08 git commit -m "Sixth commit"
15:07 git merge --no-ff features/foo
15:06 git commit -m "Fifth commit"
15:05 git commit -m "Fourth commit"
15:04 git commit -m "Third commit"
15:03 git commit -m "Second commit"
15:02 git checkout -b features/bar
15:01 git checkout -b features/foo
15:00 git commit -m "First commit"
ප්රති ult ලය:
* c0a3b89 - YYYY-MM-DD 15:10:00 (XX minutes ago) (HEAD -> develop)
|\ Merge branch 'features/bar' - Christophe
| * 37e933e - YYYY-MM-DD 15:08:00 (XX minutes ago) (features/bar)
| | Sixth commit - Christophe
| * eb5e657 - YYYY-MM-DD 15:07:00 (XX minutes ago)
| |\ Merge branch 'features/foo' into features/bar - Christophe
| * | 2e4086f - YYYY-MM-DD 15:06:00 (XX minutes ago)
| | | Fifth commit - Christophe
| * | 31e3a60 - YYYY-MM-DD 15:05:00 (XX minutes ago)
| | | Fourth commit - Christophe
* | | 98b439f - YYYY-MM-DD 15:09:00 (XX minutes ago)
|\ \ \ Merge branch 'features/foo' - Christophe
| |/ /
|/| /
| |/
| * 6579c9c - YYYY-MM-DD 15:04:00 (XX minutes ago) (features/foo)
| | Third commit - Christophe
| * 3f41d96 - YYYY-MM-DD 15:03:00 (XX minutes ago)
|/ Second commit - Christophe
* 14edc68 - YYYY-MM-DD 15:00:00 (XX minutes ago)
First commit - Christophe
git rebase
විධාන:
Time Branch "develop" Branch "features/foo" Branch "features/bar"
------- -------------------------------- ------------------------------- -------------------------------
15:10 git merge --no-ff features/bar
15:09 git merge --no-ff features/foo
15:08 git commit -m "Sixth commit"
15:07 git rebase features/foo
15:06 git commit -m "Fifth commit"
15:05 git commit -m "Fourth commit"
15:04 git commit -m "Third commit"
15:03 git commit -m "Second commit"
15:02 git checkout -b features/bar
15:01 git checkout -b features/foo
15:00 git commit -m "First commit"
ප්රති ult ලය:
* 7a99663 - YYYY-MM-DD 15:10:00 (XX minutes ago) (HEAD -> develop)
|\ Merge branch 'features/bar' - Christophe
| * 708347a - YYYY-MM-DD 15:08:00 (XX minutes ago) (features/bar)
| | Sixth commit - Christophe
| * 949ae73 - YYYY-MM-DD 15:06:00 (XX minutes ago)
| | Fifth commit - Christophe
| * 108b4c7 - YYYY-MM-DD 15:05:00 (XX minutes ago)
| | Fourth commit - Christophe
* | 189de99 - YYYY-MM-DD 15:09:00 (XX minutes ago)
|\ \ Merge branch 'features/foo' - Christophe
| |/
| * 26835a0 - YYYY-MM-DD 15:04:00 (XX minutes ago) (features/foo)
| | Third commit - Christophe
| * a61dd08 - YYYY-MM-DD 15:03:00 (XX minutes ago)
|/ Second commit - Christophe
* ae6f5fc - YYYY-MM-DD 15:00:00 (XX minutes ago)
First commit - Christophe
develop
විශේෂාංග ශාඛාවක් දක්වාgit merge
විධාන:
Time Branch "develop" Branch "features/foo" Branch "features/bar"
------- -------------------------------- ------------------------------- -------------------------------
15:10 git merge --no-ff features/bar
15:09 git commit -m "Sixth commit"
15:08 git merge --no-ff develop
15:07 git merge --no-ff features/foo
15:06 git commit -m "Fifth commit"
15:05 git commit -m "Fourth commit"
15:04 git commit -m "Third commit"
15:03 git commit -m "Second commit"
15:02 git checkout -b features/bar
15:01 git checkout -b features/foo
15:00 git commit -m "First commit"
ප්රති ult ලය:
* 9e6311a - YYYY-MM-DD 15:10:00 (XX minutes ago) (HEAD -> develop)
|\ Merge branch 'features/bar' - Christophe
| * 3ce9128 - YYYY-MM-DD 15:09:00 (XX minutes ago) (features/bar)
| | Sixth commit - Christophe
| * d0cd244 - YYYY-MM-DD 15:08:00 (XX minutes ago)
| |\ Merge branch 'develop' into features/bar - Christophe
| |/
|/|
* | 5bd5f70 - YYYY-MM-DD 15:07:00 (XX minutes ago)
|\ \ Merge branch 'features/foo' - Christophe
| * | 4ef3853 - YYYY-MM-DD 15:04:00 (XX minutes ago) (features/foo)
| | | Third commit - Christophe
| * | 3227253 - YYYY-MM-DD 15:03:00 (XX minutes ago)
|/ / Second commit - Christophe
| * b5543a2 - YYYY-MM-DD 15:06:00 (XX minutes ago)
| | Fifth commit - Christophe
| * 5e84b79 - YYYY-MM-DD 15:05:00 (XX minutes ago)
|/ Fourth commit - Christophe
* 2da6d8d - YYYY-MM-DD 15:00:00 (XX minutes ago)
First commit - Christophe
git rebase
විධාන:
Time Branch "develop" Branch "features/foo" Branch "features/bar"
------- -------------------------------- ------------------------------- -------------------------------
15:10 git merge --no-ff features/bar
15:09 git commit -m "Sixth commit"
15:08 git rebase develop
15:07 git merge --no-ff features/foo
15:06 git commit -m "Fifth commit"
15:05 git commit -m "Fourth commit"
15:04 git commit -m "Third commit"
15:03 git commit -m "Second commit"
15:02 git checkout -b features/bar
15:01 git checkout -b features/foo
15:00 git commit -m "First commit"
ප්රති ult ලය:
* b0f6752 - YYYY-MM-DD 15:10:00 (XX minutes ago) (HEAD -> develop)
|\ Merge branch 'features/bar' - Christophe
| * 621ad5b - YYYY-MM-DD 15:09:00 (XX minutes ago) (features/bar)
| | Sixth commit - Christophe
| * 9cb1a16 - YYYY-MM-DD 15:06:00 (XX minutes ago)
| | Fifth commit - Christophe
| * b8ddd19 - YYYY-MM-DD 15:05:00 (XX minutes ago)
|/ Fourth commit - Christophe
* 856433e - YYYY-MM-DD 15:07:00 (XX minutes ago)
|\ Merge branch 'features/foo' - Christophe
| * 694ac81 - YYYY-MM-DD 15:04:00 (XX minutes ago) (features/foo)
| | Third commit - Christophe
| * 5fd94d3 - YYYY-MM-DD 15:03:00 (XX minutes ago)
|/ Second commit - Christophe
* d01d589 - YYYY-MM-DD 15:00:00 (XX minutes ago)
First commit - Christophe
git cherry-pick
ඔබට එක් නිශ්චිත බැඳීමක් අවශ්ය වූ විට git cherry-pick
එය කදිම විසඳුමකි ( -x
විකල්පය මුල් කැපවීමේ පණිවිඩ ශරීරයට " (චෙරි තෝරාගත් ...) " යනුවෙන් පේළියක් එක් කරයි , එබැවින් එය සාමාන්යයෙන් භාවිතා කිරීම හොඳ අදහසකි -git log <commit_sha1>
බැලීමට එය):
විධාන:
Time Branch "develop" Branch "features/foo" Branch "features/bar"
------- -------------------------------- ------------------------------- -----------------------------------------
15:10 git merge --no-ff features/bar
15:09 git merge --no-ff features/foo
15:08 git commit -m "Sixth commit"
15:07 git cherry-pick -x <second_commit_sha1>
15:06 git commit -m "Fifth commit"
15:05 git commit -m "Fourth commit"
15:04 git commit -m "Third commit"
15:03 git commit -m "Second commit"
15:02 git checkout -b features/bar
15:01 git checkout -b features/foo
15:00 git commit -m "First commit"
ප්රති ult ලය:
* 50839cd - YYYY-MM-DD 15:10:00 (XX minutes ago) (HEAD -> develop)
|\ Merge branch 'features/bar' - Christophe
| * 0cda99f - YYYY-MM-DD 15:08:00 (XX minutes ago) (features/bar)
| | Sixth commit - Christophe
| * f7d6c47 - YYYY-MM-DD 15:03:00 (XX minutes ago)
| | Second commit - Christophe
| * dd7d05a - YYYY-MM-DD 15:06:00 (XX minutes ago)
| | Fifth commit - Christophe
| * d0d759b - YYYY-MM-DD 15:05:00 (XX minutes ago)
| | Fourth commit - Christophe
* | 1a397c5 - YYYY-MM-DD 15:09:00 (XX minutes ago)
|\ \ Merge branch 'features/foo' - Christophe
| |/
|/|
| * 0600a72 - YYYY-MM-DD 15:04:00 (XX minutes ago) (features/foo)
| | Third commit - Christophe
| * f4c127a - YYYY-MM-DD 15:03:00 (XX minutes ago)
|/ Second commit - Christophe
* 0cf894c - YYYY-MM-DD 15:00:00 (XX minutes ago)
First commit - Christophe
git pull --rebase
ඩෙරෙක් ගෝර්ලේට වඩා මට එය පැහැදිලි කළ හැකි බව මට විශ්වාස නැත ... මූලික වශයෙන්, git pull --rebase
ඒ වෙනුවට භාවිතා කරන්න git pull
:) ලිපියේ නැති දේ නම්, ඔබට පෙරනිමියෙන් එය සක්රීය කළ හැකිය :
git config --global pull.rebase true
git rerere
නැවතත්, මෙහි හොඳින් විස්තර කර ඇත . සරලව කිවහොත්, ඔබ එය සක්රීය කළහොත්, ඔබට එකම ගැටුම තවත් කිහිප වතාවක් විසඳීමට සිදු නොවේ.
මෙම Pro Git පොත මත ඇත්තෙන්ම හොඳ පැහැදිලි කිරීමක් කර rebasing පිටුව .
මූලික වශයෙන් ඒකාබද්ධ කිරීමක් කොමිස් දෙකක් ගෙන ඒවා ඒකාබද්ධ කරයි.
ප්රතිප්රහාරයක් පොදු මුතුන් මිත්තන් දෙදෙනා වෙත ගොස් එකිනෙකා මත වෙනස්කම් වැඩි වැඩියෙන් යොදනු ඇත. මෙය 'පිරිසිදු කරන්නෙකු' සහ වඩාත් රේඛීය ඉතිහාසයක් ඇති කරයි.
නමුත් ඔබ නැවත ප්රතිස්ථාපනය කරන විට, ඔබ කලින් කළ ක්රියා අතහැර දමා නව ඒවා සාදයි. එබැවින් ඔබ කිසි විටෙකත් පොදු වූ ගබඩාවක් නැවත ප්රතිස්ථාපනය නොකළ යුතුය. ගබඩාවේ වැඩ කරන අනෙක් පුද්ගලයින් ඔබට වෛර කරනු ඇත.
එම හේතුව නිසා පමණක් මම සම්පූර්ණයෙන්ම පාහේ ඒකාබද්ධ වෙමි. මගේ ශාඛා වලින් 99% ක් එතරම් වෙනස් නොවේ, එබැවින් ගැටුම් තිබේ නම් එය ස්ථාන එකක හෝ දෙකක පමණි.
ඉතිහාසයේ අතු බෙදීම් පිරිසිදු හා නිධි ව්යුහය රේඛීය කිරීමට Git rebase භාවිතා කරයි.
ඔබ විසින් නිර්මාණය කරන ලද ශාඛා පුද්ගලිකව තබා ගැනීමටද එය භාවිතා කරයි, සේවාදායකයේ වෙනස්කම් නැවත සකස් කර තල්ලු කිරීමෙන් පසුව, ඔබ ඔබේ ශාඛාව මකා දැමුවහොත්, ඔබ වැඩ කළ ශාඛාව පිළිබඳ කිසිදු සාක්ෂියක් නොමැත. එබැවින් ඔබේ ශාඛාව දැන් ඔබේ දේශීය අවධානයට ලක්ව ඇත.
නැවත ලබා දීමෙන් පසු අප සාමාන්ය ඒකාබද්ධ කිරීමක් කරන්නේ දැයි බැලීමට භාවිතා කළ අතිරේක බැඳීමකින් ද අපි මිදෙමු.
ඔව්, සාර්ථක ප්රතිප්රහාරයකින් පසුව යමෙක් ඒකාබද්ධ කිරීම කළ යුතුව ඇත. මන්දයත්, ප්රතිව්යුහගත කිරීමේ විධානය මඟින් ඔබ නැවත වැඩ කරන විට සඳහන් කළ ශාඛාව මත ඔබේ වැඩ කටයුතු කරගෙන යන අතර, ස්වාමියා යැයි කියමින්, ඔබේ ශාඛාවේ පළමු කැපවීම ප්රධාන ශාඛාවෙන් සෘජුවම පැවත එන්නෙකු බවට පත් කරයි. . මෙයින් අදහස් කරන්නේ මෙම ශාඛාවෙන් ප්රධාන ශාඛාවට වෙනස්කම් ගෙන ඒම සඳහා අපට දැන් වේගයෙන් ඉදිරියට යා හැකි බවයි.
යම් ප්රායෝගික උදාහරණ, මහා පරිමාණ සංවර්ධන එහිදී කිරීම තරමක් සම්බන්ධ ගෙරිට්සමාලෝචන සහ බෙදා හැරීමේ ඒකාබද්ධ කිරීම සඳහා භාවිතා කරන :
මගේ විශේෂාංග ශාඛාව නැවුම් දුරස්ථ මාස්ටර් වෙත ඔසවා තැබීමේදී මම ඒකාබද්ධ වෙමි. මෙය අවම නඟා සිටුවීමේ කාර්යයක් ලබා දෙන අතර නිදසුනක් ලෙස gitk හි විශේෂාංග සංවර්ධනයේ ඉතිහාසය අනුගමනය කිරීම පහසුය .
git fetch
git checkout origin/my_feature
git merge origin/master
git commit
git push origin HEAD:refs/for/my_feature
බෙදා හැරීමේ කැපවීමක් සූදානම් කරන විට මම ඒකාබද්ධ වෙමි.
git fetch
git checkout origin/master
git merge --squash origin/my_feature
git commit
git push origin HEAD:refs/for/master
කුමන හේතුවක් නිසා හෝ මගේ භාර දීමේ ඒකාග්රතාවය අසමත් වූ විට මම නැවත ප්රතිස්ථාපනය කරමි, එය නැවුම් දුරස්ථ මාස්ටර් වෙත යාවත්කාලීන කළ යුතුය.
git fetch
git fetch <gerrit link>
git checkout FETCH_HEAD
git rebase origin/master
git push origin HEAD:refs/for/master
නැවත එකතු කිරීම සහ ඒකාබද්ධ කිරීම යනු කුමක්ද යන්න බොහෝ වාරයක් පැහැදිලි කරන ලදී, නමුත් ඔබ භාවිතා කළ යුත්තේ කවදාද?
ඔබ නැවත භාවිතා කළ යුත්තේ කවදාද?
Git rebase ඉතිහාසය වෙනස් කරන විට. එම නිසා වෙනත් අයෙකු එකම ශාඛාවක වැඩ කරන විට / ඔබ එය තල්ලු කර ඇත්නම් එය භාවිතා නොකළ යුතුය. නමුත් ඔබට ප්රාදේශීය ශාඛාවක් තිබේ නම්, පිරිසිදු ඉතිහාසයක් තබා ගැනීම සඳහා ඔබේ ශාඛාව නැවත ස්වාමියා සමඟ ඒකාබද්ධ කිරීමට පෙර ඒකාබද්ධ කිරීමේ ප්රතිස්ථාපන මාස්ටර් කළ හැකිය. මෙය කිරීමෙන්, මාස්ටර් ශාඛාවට ඒකාබද්ධ කිරීමෙන් පසු ඔබ ප්රධාන ශාඛාවේ ශාඛාවක් භාවිතා කළ බවක් නොපෙනේ - ඔබ ස්වයංක්රීයව ජනනය කරන ලද “ඒකාබද්ධ” කර නොමැති නිසා ඉතිහාසය “පිරිසිදු” වේ, නමුත් තවමත් තිබේ ස්වයංක්රීයව "ඒකාබද්ධ කිරීම" නොමැතිව ඔබගේ ප්රධාන ශාඛාවේ සම්පූර්ණ ඉතිහාසය.
කෙසේ වෙතත්, ඔබ git merge feature-branch --ff-only
ඔබේ අංගය ප්රධාන වශයෙන් ඒකාබද්ධ කරන විට තනි බැඳීමක් ඇති කරන ගැටුම් නොමැති බවට වග බලා ගන්න.විශේෂාංග ශාඛාවේ ඉතිහාසය ලබා ගන්නා විට ඔබ වැඩ කරන සෑම කාර්යයක් සඳහාම විශේෂාංග ශාඛා භාවිතා කරන්නේ නම් මෙය සිත්ගන්නා කරුණකි, නමුත් "ඒකාබද්ධ .."
දෙවන අවස්ථාව නම්, ඔබ ශාඛාවකින් අතු බෙදී ප්රධාන ශාඛාවේ වෙනස් වී ඇති දේ දැන ගැනීමට අවශ්ය නම්. සෑම බැඳීමක්ම ඇතුළත් වන බැවින් රීබේස් ඔබට තොරතුරු ලබා දෙයි.
ඔබ ඒකාබද්ධ කිරීම භාවිතා කළ යුත්තේ කවදාද?
ඔබේ ප්රධාන ශාඛාවේ විශේෂාංග ශාඛාවක ඉතිහාසය ඔබට අවශ්ය නැති විට හෝ අවශ්ය නොවූ විට හෝ අනෙක් අය එකම ශාඛාවක වැඩ කරන්නේ නම් / ඔබ එය තල්ලු කර ඇත. ඔබට තවමත් ඉතිහාසය ලබා ගැනීමට අවශ්ය නම්, විශේෂාංග ශාඛාව මාස්ටර් සමඟ ඒකාබද්ධ කිරීමට පෙර විශේෂාංග ශාඛාවට මාස්ටර් ඒකාබද්ධ කරන්න. මෙහි ප්රති result ලය වනුයේ ඔබේ ස්වාමියා තුළ ඇති විශේෂාංග ශාඛාවේ ඉතිහාසය ඔබ සතුව ඇති අතර (ඔබ එහි ප්රධානියා ඒකාබද්ධ කළ නිසා ඔබේ විශේෂාංග ශාඛාවේ ඒකාබද්ධ කිරීමේ බැඳීමද ඇතුළුව).
මම භාවිතා git rebase
කරන්නේ කවදාද? එය කිසි විටෙකත් පාහේ නොවේ, මන්ද එය ඉතිහාසය නැවත ලියයි. git merge
සෑම විටම පාහේ වඩාත් සුදුසු තේරීම වේ, මන්ද එය ඔබගේ ව්යාපෘතියේ ඇත්ත වශයෙන්ම සිදුවූ දෙයට ගරු කරන බැවිනි.