Git ඒකාබද්ධ කිරීම වෙනුවට ඔබ Git rebase භාවිතා කරන්නේ කවදාද?


1568

Git rebase එදිරිව Git ඒකාබද්ධ කිරීම භාවිතා කිරීම නිර්දේශ කරන්නේ කවදාද?

සාර්ථක ප්‍රතිප්‍රහාරයකින් පසුව මට තවමත් ඒකාබද්ධ වීමට අවශ්‍යද?




6
නැවත භාවිතා කිරීමට කැමති පුද්ගලයින්ගේ එක් ගැටළුවක් නම්, එය ඔවුන්ගේ කේතය නිතිපතා තල්ලු කිරීමෙන් වළක්වයි. එබැවින් පිරිසිදු ඉතිහාසයක් අවශ්‍ය වීමෙන් ඔවුන්ගේ කේතය බෙදා ගැනීම වළක්වයි, එය වඩා වැදගත් යැයි මම සිතමි.
static_rtti

10
aticstatic_rtti: එය සත්‍ය නොවේ. ඔබගේ වෙනස්වීම් නිරන්තරයෙන් තල්ලු කිරීමෙන් එය වලක්වනු ලැබුවහොත් ඔබ නැවත භාවිතා කිරීම පදනම් කරගත් ප්‍රවාහයක් වැරදිය.
ජුස්ලින්

5
ඇන්ඩ rew ආර්නොට්ගේ පිළිතුර සහ පේස්ගේ පිළිතුර මීට පෙර පළ නොකිරීම ඇත්තෙන්ම ලැජ්ජාවකි . මන්දයත් මේ වන විටත් බොහෝ ඡන්ද රැස්කරගෙන තිබූ පිළිතුරු වලට වඩා පුළුල් ලෙස මෙම ප්‍රශ්නයට පිළිතුරු සපයන බැවිනි.
මාර්ක් බූත්

Answers:


1147

කෙටි අනුවාදය

  • ඒකාබද්ධ කිරීම එක් ශාඛාවක සියලුම වෙනස්කම් ගෙන ඒවා එක් ශාඛාවකට තවත් ශාඛාවකට ඒකාබද්ධ කරයි.
  • රීබේස් පවසන්නේ මා අතු බෙදී ඇති ස්ථානය නව ආරම්භක ස්ථානයකට ගෙන යාමට මට අවශ්‍ය බවයි

ඉතින් ඔබ එකක් භාවිතා කරන්නේ කවදාද?

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

  • තනි අංගයක් සංවර්ධනය කිරීම සඳහා ඔබ ශාඛාවක් නිර්මාණය කර ඇති බව කියමු. ඔබට එම වෙනස්කම් නැවත මාස්ටර් වෙත ගෙන ඒමට අවශ්‍ය වූ විට, ඔබට බොහෝ විට ඒකාබද්ධ වීමට අවශ්‍ය වනු ඇත (සියලු අන්තර්වාර කටයුතු පවත්වා ගැනීම ගැන ඔබ තැකීමක් නොකරයි).

නැවත සකස් කරන්න

  • දෙවන අවස්ථාව නම්, ඔබ යම් සංවර්ධනයක් කිරීමට පටන් ගෙන තවත් සංවර්ධකයෙකු සම්බන්ධයක් නැති වෙනසක් සිදු කළහොත් ය. ඔබ බොහෝ විට අදින්න හා පසුව අවශ්ය rebase නිධිය සිට වත්මන් අනුවාදය ඔබගේ වෙනස්කම් පදනම්.

105
Ob ඒකාබද්ධ කිරීමේදී අන්තර්වාර කටයුතු පවත්වා ගැනීම ගැන රොබ් සඳහන් කළේය. පෙරනිමියෙන් B ශාඛාව (ඔබ වැඩ කරමින් සිටි විශේෂාංග ශාඛාව) M ශාඛාවට (ප්‍රධාන ශාඛාව) ඒකාබද්ධ කිරීමෙන් B හි සිදු වූ සෑම කැපවීමක් සඳහාම M හි එක් බැඳීමක් නිර්මාණය වනු ඇත. නමුත් ඔබ --squash විකල්පය භාවිතා කර ඒකාබද්ධ කරන්නේ නම්, B ශාඛාව මත කරන ලද සියලු කැපවීම් “එකට එකතු වී” සහ M ශාඛාවේ තනි බැඳීමක් ලෙස ඒකාබද්ධ වන අතර, ඔබේ ප්‍රධාන ශාඛාවේ ලොගය ලස්සන හා පිරිසිදුව තබා ගනී. බොහෝ සංවර්ධකයින් ස්වාධීනව වැඩ කර නැවත ස්වාමියා සමඟ ඒකාබද්ධ වන්නේ නම් ස්කොෂ් කිරීම ඔබට අවශ්‍ය විය හැකිය.
spaaarky21

19
ඒකාබද්ධ කිරීම පිළිබඳ @ spaaarky21 උපකල්පනය නිවැරදි නොවන බව මම විශ්වාස කරමි. ඔබ ශාඛා බී ශාඛාව එම් මාස්ටර් සමඟ ඒකාබද්ධ කරන්නේ නම්, ඔබ සරල හෝ - ස්කෑෂ් ඒකාබද්ධ කිරීමක් භාවිතා කළත්, එම් හි එක් බැඳීමක් පමණක් ඇත (බීට බහු කොමිස් තිබුණත්). --Squash විසින් කරනුයේ දෙමව්පියන් ලෙස B වෙත යොමු කිරීම ඉවත් කිරීමයි. හොඳ දෘශ්‍යකරණයක් මෙහි ඇත: syntevo.com/smartgithg/howtos.html?page=workflows.merge
jpeskin

14
pespeskin ඒක මම දකින්නේ නැහැ. සත්‍යාපනය සඳහා මම ඉක්මන් පරීක්ෂණයක් කළා. පෙළ ගොනුවක්, initනව repo, addගොනුව සහ සමඟ නාමාවලියක් සාදන්න commit. නව විශේෂාංග ශාඛාවක් පරීක්ෂා කරන්න ( checkout -b feature.) පෙළ ගොනුව වෙනස් කරන්න, කැපවී නැවත නැවත කරන්න එවිට විශේෂාංග ශාඛාවේ නව කොමිස් දෙකක් තිබේ. එවිට checkout masterසහ merge feature. තුළ log, මාස්ටර් පිළිබඳ මගේ මුලික කැපවීම මම දකිමි, ඉන් පසුව විශේෂාංග දෙකෙන් ඒකාබද්ධ කරන ලදී. ඔබ නම් merge --squash feature, විශේෂාංගය මාස්ටර් සමඟ ඒකාබද්ධ වී ඇති නමුත් එය බැඳී නොමැත, එබැවින් මාස්ටර් පිළිබඳ එකම නව කැපවීම ඔබ විසින්ම කරගනු ඇත.
spaaarky21

21
@ spaaarky21 අප දෙදෙනාම අඩක් නිවැරදි බව පෙනේ. වේගයෙන් ඉදිරියට යා හැකි ඒකාබද්ධ කිරීමක් කළ හැකි විට (ඔබේ උදාහරණයේ දී මෙන්), B විශේෂාංග ශාඛාවේ සියලුම කොමිස් ඇතුළත් කිරීම සඳහා පෙරනිමිය (හෝ ඔබ යෝජනා කරන පරිදි, ඔබට තනි කැපවීමකට ඒකාබද්ධ කිරීම සඳහා --squash භාවිතා කළ හැකිය). නමුත් ඔබ ඒකාබද්ධ කරන M සහ B අපසාරී ශාඛා දෙකක් ඇති අවස්ථාවක, M සමඟ ඒකාබද්ධ වුවහොත් B ශාඛාවේ සියලුම තනි කොමිස් (git) ඇතුළත් නොවේ (ඔබ භාවිතා කළත් නැතත් --squash).
jpeskin

6
මෙම පිළිතුරෙහි “(ඔබ සියලු අතුරු කටයුතු නඩත්තු කිරීම ගැන තැකීමක් නොකරයි)” පසෙකට දමන්නේ ඇයි? එය '09 හි කිසිදු තේරුමක් නැති අතර දැන් එය තේරුමක් නැත. එසේම, ඔබට නැවත අවශ්‍ය වන්නේ වෙනත් සංවර්ධකයෙකු ඔබට අවශ්‍ය වෙනස්කම් සිදු කළහොත් පමණි - ඔවුන් සම්බන්ධ නොවූ වෙනස්කම් සිදු කළේ නම්, ඔබේ විශේෂාංග ශාඛාව කෙසේ හෝ ගැටුම් වලින් තොරව පහසුවෙන් ඒකාබද්ධ විය යුතු අතර ඔබේ ඉතිහාසය නඩත්තු කරනු ඇත.
මාර්ක් බූත්

375

ඒක සරලයි. ඔබේ වැඩ සඳහා නව පදනමක් ලෙස වෙනත් ශාඛාවක් භාවිතා කරන ලෙස ඔබ කියනු ලැබේ .

උදාහරණයක් ලෙස, ඔබට ශාඛාවක් තිබේ නම් 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

මෙවර, මාතෘකා ශාඛාවට එකම මාස්ටර්ගේ කොමිස් සහ නව අංගය සමඟ ඇති කොමිස් ඇති බැවින්, ඒකාබද්ධ කිරීම වේගයෙන් ඉදිරියට යනු ඇත.


31
but this way a new dummy commit is added, if you want to avoid spaghetti-history- කොහොමද නරක?
ア レ ッ ク ス

6
එසේම, --no-ff ඒකාබද්ධ කිරීමේ ධජය ඉතා ප්‍රයෝජනවත් වේ.
ඇල්ඩෝ 'xoen' Giambelluca

3
User ア レ ッ user user පරිශීලකයා Sean Schofieldඑය විවරණයක සඳහන් කර ඇති පරිදි: "ඔබ නැවත වරක් ඔබේ දේවල් නැවත මාස්ටර් සමඟ ඒකාබද්ධ කළ නිසා (එය දැනටමත් විස්තර කර ඇති පරිදි ඉතා සුළු කාරණයකි) ඔබ එය ur ර් කැපවීමේ ඉතිහාසයේ" ඉහළින් "හිඳගෙන සිටින නිසා විශාල වශයෙන් සති කිහිපයකට පසුව විශේෂාංග ලිවිය හැකි නමුත් ඒකාබද්ධ කළ හැකි ව්‍යාපෘති, ඉතිහාසයේ නැවත මාස්ටර් ක්‍රමයට “පිරවූ” නිසා ඒවා මාස්ටර් සමඟ ඒකාබද්ධ කිරීමට ඔබට අවශ්‍ය නැත. පුද්ගලිකව මම කැමතියි git log සහ see දැකීමට එම නවතම අංගය “ඉහළින්ම” තබා ඇති බව සලකන්න. බැඳීම් දිනයන් සංරක්ෂණය කර ඇති බව සලකන්න - නැවත සකස් කිරීම එම තොරතුරු වෙනස් නොකරයි. ”
ඇඩ්‍රියන් බී

4
මම එය මෙහි නැවත නැවත දරයි සිතන්න - මේ සියලු කොන්දේසි (බව මතක තබා ගන්න merge, rebase, fast-forward, ආදිය) නියමයෙන් ඇල්කේන වලට ප්රස්තාරය විශේෂිත උපක්රම සඳහන් කර ඇත. එම මානසික ආකෘතිය මනසේ තබාගෙන තර්ක කිරීම ඔවුන්ට පහසු වේ.
රෝයි ටින්කර්

11
Ld ඇල්ඩෝ ප්‍රතිනිර්මාණය කළ ඉතිහාසයක් ගැන “පිරිසිදු” හෝ “පිළිවෙලට” කිසිවක් නැත. එය සාමාන්‍යයෙන් අපිරිසිදු හා IMHO භයානක ය. “පිරිසිදුම” Git ඉතිහාසය යනු සැබවින්ම සිදුවීමයි. :)
මාර්නන් ලයිබෝ-කොසර්

270

TSamper විසින් සඳහන් කරන ලද මගේම පිළිතුරට අනුපූරක වීමට ,

  • නැවත එකතු කිරීම බොහෝ විට ඒකාබද්ධ වීමට පෙර කිරීම හොඳ අදහසකි, මන්ද අදහස නම් ඔබ ඒකාබද්ධ වන ශාඛාවේ Yවැඩ ඔබේ ශාඛාව තුළ Bඒකාබද්ධ කිරීමයි.
    නමුත් නැවතත්, ඒකාබද්ධ වීමට පෙර, ඔබ ඔබේ ශාඛාවේ ඇති ඕනෑම ගැටුමක් නිරාකරණය කරයි (එනම්: "නැවත සකස් කිරීම", "මගේ ශාඛාවේ මගේ වැඩ කටයුතු ශාඛාවේ සිට මෑත ස්ථානයක සිට නැවත ධාවනය කරන්න B).
    නිවැරදිව සිදු කළ හොත්, පසුව ඔබේ ශාඛාවෙන් ඒකාබද්ධ කිරීම ශාඛාව Bවේගයෙන් ඉදිරියට යා හැකිය.

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


ප්‍රතිප්‍රහාරයකින් පසු ඒකාබද්ධ වීමේ ලක්ෂ්‍යය?

මා විස්තර කරන නඩුවේදී, මම Bමගේ ශාඛාව වෙත නැවත පිවිසෙන්නේ, මගේ කෘතිය වඩාත් මෑත කාලීන ස්ථානයක සිට නැවත ධාවනය කිරීමට අවස්ථාව ලබා ගැනීම සඳහා ය B, නමුත් මගේ ශාඛාව තුළ රැඳී සිටියදී ය.
මෙම අවස්ථාවේ දී, මගේ "නැවත ධාවනය කරන ලද" කාර්යය ගෙන ඒමට ඒකාබද්ධ කිරීමක් තවමත් අවශ්‍ය වේ B.

අනෙක් අවස්ථාව නම් ( නිදසුනක් ලෙස Git Ready හි විස්තර කර ඇති ), ඔබේ වැඩ කටයුතු සෘජුවම Bප්‍රතිප්‍රහාරයක් හරහා ගෙන ඒමයි (එමඟින් ඔබගේ සියලු යහපත් ක්‍රියා සංරක්‍ෂණය වේ, නැතහොත් අන්තර්ක්‍රියාකාරී ප්‍රතිප්‍රහාරයක් හරහා ඒවා නැවත ඇණවුම් කිරීමට ඔබට අවස්ථාව ලැබේ).
එවැනි අවස්ථාවකදී (බී ශාඛාවේ සිටියදී ඔබ නැවත ප්‍රතිස්ථාපනය කරන විට), ඔබ නිවැරදියි: තවදුරටත් ඒකාබද්ධ කිරීමක් අවශ්‍ය නොවේ:

අප ඒකාබද්ධ වී හෝ ප්‍රතිනිර්මාණය නොකළ විට පෙරනිමියෙන් Git ගසක්

rebase1

නැවත ලබා ගැනීමෙන් අපට ලැබෙන්නේ:

rebase3

එම දෙවන අවස්ථාව සියල්ලම වේ: නව අංගය මාස්ටර් වෙත නැවත ලබා ගන්නේ කෙසේද?

මගේ අදහස නම්, පළමු නැවත ලබා ගැනීමේ අවස්ථාව විස්තර කිරීමෙන්, නැවත ලබා ගැනීමක් ද ඒ සඳහා මූලික පියවරක් ලෙස භාවිතා කළ හැකි බව සැමට මතක් කර දීමයි (“නව අංගය නැවත මාස්ටර් වෙත ලබා ගැනීම”).
පළමුවෙන්ම නව විශේෂාංග ශාඛාව තුළට මාස්ටර් ගෙන ඒමට ඔබට රීබේස් භාවිතා කළ හැකිය: ප්‍රතිඅපනය මඟින් නව විශේෂාංග කොමිස් නැවත ප්‍රතිස්ථාපනය කරනු ඇත HEAD master, නමුත් තවමත් නව විශේෂාංග ශාඛාව තුළ, ඔබේ ශාඛාවේ ආරම්භක ස්ථානය පැරණි ස්වාමියාගේ කැපවීමෙන් effectively ලදායී ලෙස ගෙන යයි HEAD-master.
එමඟින් ඔබේ ශාඛාවේ ඇති ඕනෑම ගැටුම් නිරාකරණය කර ගැනීමට ඔබට ඉඩ සලසයි (අර්ථය, හුදකලාව, ඔබේ ගැටුම් නිරාකරණ අදියර බොහෝ කාලයක් ගත වුවහොත් සමාන්තරව පරිණාමය වීමට ස්වාමියාට ඉඩ දෙයි).
එවිට ඔබට මාස්ටර් වෙත මාරු වී ඒකාබද්ධ විය හැකිය new-feature(හෝ ප්‍රතිස්ථාපනය කරන්නnew-feature මතටmaster ඔබේ සිදු අනාචාරයේ ආරක්ෂා කිරීමට අවශ්ය නම්new-feature ශාඛාව).

නිසා:

  • කෘතියක් ආනයනය කිරීමට ක්‍රම දෙකක් ලෙස “rebase vs. merge” දැකිය හැකිය master.
  • නමුත් "නැවත ප්‍රතිස්ථාපනය කිරීමෙන් පසුව ඒකාබද්ධ කිරීම" යනු හුදකලා ගැටුම නිරාකරණය කිරීම සඳහා වලංගු කාර්ය ප්‍රවාහයක් විය හැකි අතර පසුව ඔබේ වැඩ කටයුතු නැවත ගෙන එන්න.

17
ගැටුම නිරාකරණය නොකර නැවත සකස් කිරීම සුළු සුළු වේගවත් ඉදිරි ගමනකි.
obecalp

4
@obelcap: ඇත්ත වශයෙන්ම, මෙය එක්තරා ආකාරයක අදහසකි: ඔබ ඔබේ පරිසරයේ ඇති සියලුම ගැටලු-ගැටුම් (ඔබේ නව අංග ශාඛාව තුළ නැවත ප්‍රතිස්ථාපනය කරන්න) ගෙන, පසුව සම ස්වාමියා, නව අංගය ඒකාබද්ධ කරන්න: 1 pico-second (වේගවත්- ඉදිරියට) ස්වාමියාට පරිණාමයක්
නොතිබුනේ නම්

27
නැවත සකස් කිරීමද කදිමයි, මන්දයත් ඔබ අවසානයේදී ඔබේ දේවල් නැවත ස්වාමියා සමඟ ඒකාබද්ධ කළ විට (එය දැනටමත් විස්තර කර ඇති පරිදි ඉතා සුළු කාරණයකි) ඔබ එය ඔබගේ කැපවීමේ ඉතිහාසයේ "ඉහළින්" හිඳගෙන සිටී. විශේෂාංග ලිවිය හැකි නමුත් සති කිහිපයකට පසුව ඒකාබද්ධ කළ හැකි විශාල ව්‍යාපෘති වලදී, ඒවා ඉතිහාසයේ නැවත මාස්ටර් ක්‍රමයට “පිරවූ” නිසා ඒවා ස්වාමියා සමඟ ඒකාබද්ධ කිරීමට ඔබට අවශ්‍ය නැත. පුද්ගලිකව මම කැමතියි git ලොග් කිරීමට සහ එම නවතම අංගය "ඉහළින්" දැකීමට. බැඳීම් දිනයන් සංරක්ෂණය කර ඇති බව සලකන්න - නැවත ගෙවීම එම තොරතුරු වෙනස් නොකරයි.
ෂෝන් ෂෝෆීල්ඩ්

3
Oe ජෝ: මානසිකව, ඔබ කියන්නේ “මගේ ඕනෑම වෙනස්කමක් (මගේ පෞද්ගලික ශාඛාවේ හුදකලාව සිදු කර ඇති) වෙනත් ශාඛාවක් මත නැවත ධාවනය කරන්න, නමුත් නැවත ගෙවීම අවසන් වූ පසු මාව මගේ පෞද්ගලික ශාඛාවේ තබන්න”. දේශීය ඉතිහාසය පිරිසිඳු කිරීම, “මුරපොලවල්” කිරීම, බිඳුණු ද්විභාෂාව සහ වැරදි දෝෂාරෝපණ ප්‍රති .ල වළක්වා ගැනීම සඳහා මෙය හොඳ අවස්ථාවක්. "Git workflow" බලන්න: sandofsky.com/blog/git-workflow.html
VonC

4
@scoarescoare ප්රධාන ඔබ දේශීය වෙනස්කම් අනුකූල වේ ආකාරය දකින්න ලැබීම මත නවතම උඩුගං ශාඛාව. ඔබගේ බැඳීමක් ගැටුමක් හඳුන්වා දුන්නොත්, ඔබ එය වහාම දකිනු ඇත. ඒකාබද්ධ කිරීමක් මඟින් එක් (ඒකාබද්ධ) බැඳීමක් පමණක් හඳුන්වා දෙන අතර, එය ඔබේම දේශීය කොමිස් අතර, ගැටුම එකතු කළේ කුමන දැයි බැලීමට පහසු ක්‍රමයක් නොමැතිව බොහෝ ගැටුම් අවුලුවන. එබැවින් පිරිසිදු ඉතිහාසයකට අමතරව , උඩුමහලේ ශාඛාව විසින් හඳුන්වා දී ඇති සියලුම වෙනස්කම් වලට වඩා (එක් ඒකාබද්ධ කිරීමකට දමනු ලැබේ ), ඔබ හඳුන්වා දුන් වෙනස්කම් , කැපවීමෙන් (නැවත ප්‍රතිස්ථාපනය කිරීමෙන්) සිදු කරන ලද වෙනස්කම් පිළිබඳ වඩාත් නිවැරදි දැක්මක් ඔබට ලැබේ .
VonC

235

ටීඑල්; ඩී.ආර්

ඔබට කිසියම් සැකයක් ඇත්නම්, ඒකාබද්ධ කිරීම භාවිතා කරන්න.

කෙටි පිළිතුර

නැවත එකතු කිරීම හා ඒකාබද්ධ කිරීම අතර ඇති එකම වෙනස්කම්:

  • එහි ප්‍රති ing ලයක් ලෙස ඉතිහාසයේ ගස් ව්‍යුහය (සාමාන්‍යයෙන් කැපී පෙනෙන ප්‍රස්ථාරයක් දෙස බැලීමේදී පමණක් කැපී පෙනේ) වෙනස් වේ (එක් අතු ඇත, අනෙක එසේ නොවේ).
  • ඒකාබද්ධ කිරීම සාමාන්‍යයෙන් අමතර බැඳීමක් ඇති කරයි (උදා: ගසෙහි නෝඩ්).
  • ඒකාබද්ධ කිරීම සහ නැවත ප්‍රතිස්ථාපනය කිරීම ගැටුම් වෙනස් ලෙස හැසිරෙනු ඇත. ඒකාබද්ධ කිරීම මඟින් එකවර සිදු වන ගැටුම් නැවත ප්‍රතිස්ථාපනය කරනු ඇත.

එබැවින් කෙටි පිළිතුර නම් ඔබේ ඉතිහාසය කෙබඳු විය යුතුද යන්න මත පදනම්ව නැවත එකතු කිරීම හෝ ඒකාබද්ධ කිරීමයි .

දිගු පිළිතුර

කුමන මෙහෙයුමක් භාවිතා කළ යුතුද යන්න තෝරා ගැනීමේදී ඔබ සලකා බැලිය යුතු සාධක කිහිපයක් තිබේ.

ඔබේ කණ්ඩායමට පිටතින් ඇති වෙනත් සංවර්ධකයින් සමඟ බෙදාගැනීමෙන් ඔබට වෙනස්කම් ලැබෙන ශාඛාව (උදා: විවෘත මූලාශ්‍ර, පොදු)?

එසේ නම්, නැවත නොයන්න. රීබේස් ශාඛාව විනාශ කරන අතර එම සංවර්ධකයින් භාවිතා නොකරන්නේ නම් බිඳුණු / නොගැලපෙන ගබඩාවන් 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 භාවිතා කරන්නෙමි. එවැනි අවස්ථාවකදී, ඒකාබද්ධ කිරීමේ බැඳීම ඇත්තෙන්ම මට ප්‍රයෝජනවත් වේ, මන්ද ඒකාබද්ධ කිරීම මඟින් ගැටලුව හඳුන්වා දුන්නේ නම්, එය මට අර්ථවත් තොරතුරු වේ.

යාවත්කාලීන කිරීම (4/2017)

මගේ සාමාන්‍ය උපදෙස් තවමත් පැවතුනද, නැවත භාවිතා කිරීම පිළිබඳව මා පෞද්ගලිකව මෘදු වී ඇති බව සඳහන් කිරීමට මම බැඳී සිටිමි. මම මෑතකදී කෝණික 2 ද්‍රව්‍ය ව්‍යාපෘතිය සමඟ බොහෝ සෙයින් මැදිහත් වී සිටිමි . ඔවුන් ඉතා පිරිසිදු කැපවීමේ ඉතිහාසයක් තබා ගැනීම සඳහා නැවත භාවිතා කිරීම භාවිතා කර ඇත. දී ඇති අඩුපාඩුවක් නිරාකරණය කර ඇත්තේ කුමක් ද යන්න සහ එම නිකුතුව නිකුතුවකට ඇතුළත් කර තිබේද නැද්ද යන්න ඉතා පහසුවෙන් බැලීමට මෙය මට ඉඩ දී ඇත. රීබේස් නිවැරදිව භාවිතා කිරීම සඳහා එය හොඳ උදාහරණයක් ලෙස සේවය කරයි.


5
වලංගු පිළිතුර විය යුතුය.
මික් 378

මෙය නිසැකවම හොඳම පිළිතුරයි. විශේෂයෙන් නවතම යාවත්කාලීනයේ පැහැදිලි කළ ප්‍රකාශය සමඟ. එය git ඉතිහාසය පිරිසිදුව හා පැහැදිලිව තබා ගැනීමට උපකාරී වේ, නමුත් එය ආරක්ෂිතව භාවිතා කරන්න.
zquintana

5
මම බොහෝ දුරට මෙම පිළිතුරට කැමතියි. නමුත්: රීබේස් "පිරිසිදු" ඉතිහාසයක් ඇති නොකරයි. එය වඩාත් රේඛීය ඉතිහාසයක් ඇති කරයි, නමුත් එය කිසිසේත්ම එකම දෙයක් නොවේ, මන්ද දැන් සෑම බැඳීමක්ම සැඟවී ඇති බව බොහෝ "අපිරිසිදු" අය දන්නේ කවුද? පිරිසිදුම, පැහැදිලි Git ඉතිහාසය යනු ශාඛාව තබා අඛණ්ඩතාව පවත්වා ගැනීමයි.
මර්නන් ලයිබෝ-කොසර්

3
"පොදු මිථ්‍යාව, ඔබ දකින්නේ බී සහ සී" යන්නයි: අවශ්‍ය නොවේ !! ඔබ සැබවින්ම දකින්නේ ඒකාබද්ධය වේගයෙන් ඉදිරියට යන ඒකාබද්ධ කිරීමක් නම් සහ එය කළ හැක්කේ ගැටුම් නොමැති නම් පමණි. ගැටුම් තිබේ නම්, ඔබට තනි කැපවීමක් ලැබේ! කෙසේ වෙතත්: ඔබට පළමුව විශේෂාංගයට මාස්ටර් ඒකාබද්ධ කර එහි ඇති ගැටුම් නිරාකරණය කරගත හැකි අතර ඔබ විශේෂාංගය මාස්ටර් සමඟ ඒකාබද්ධ කළහොත් ඔබට බී සහ සී කොමිස් ලැබෙනු ඇත.
ජෙරමි බෙන්ක්ස්

188

මෙහි පිළිතුරු බොහොමයක් පවසන්නේ ඒකාබද්ධ කිරීම ඔබගේ සියලු කැපවීම් එකකට හරවන අතර එම නිසා ඔබේ කැපවීම් ආරක්ෂා කර ගැනීම සඳහා නැවත භාවිතා කිරීම යෝජනා කරන බවයි. මෙය වැරදිය. ඔබ දැනටමත් ඔබගේ බැඳීම් තල්ලු කර ඇත්නම් නරක අදහසක් .

ඒකාබද්ධ කිරීම ඔබගේ බැඳීම් මකා දමන්නේ නැත . ඒකාබද්ධ කිරීම ඉතිහාසය ආරක්ෂා කරයි! (gitk දෙස බලන්න) රීබේස් ඉතිහාසය නැවත ලියයි, එය ඔබ තල්ලු කළ පසු එය නරක දෙයකි .

ඒකාබද්ධ කිරීම භාවිතා කරන්න - ඔබ දැනටමත් තල්ලු කර ඇති සෑම අවස්ථාවකම නැවත ප්‍රතිස්ථාපනය නොකරන්න .

මෙන්න ලිනස් (Git හි කතුවරයා) එය භාර ගනී (දැන් මගේම බ්ලොග් අඩවියේ සත්කාරකත්වය දරයි , වේබැක් යන්ත්‍රය මගින් සොයා ගන්නා ලදි ). එය ඇත්තෙන්ම හොඳ කියවීමකි.

නැතහොත් ඔබට එම අදහසේම මගේම අනුවාදය පහතින් කියවිය හැකිය.

ස්වාමියා මත ශාඛාවක් නැවත සකස් කිරීම:

  • කොමිස් නිර්මාණය කළ ආකාරය පිළිබඳ වැරදි අදහසක් සපයයි
  • හොඳින් පරීක්ෂා කර නොතිබූ අතරමැදි කොමිස් පොකුරක් සමඟ මාස්ටර් දූෂණය කරයි
  • මුල් මාතෘකා ශාඛාව නිර්මාණය කරන විට සහ එය ප්‍රතිනිර්මාණය කරන ලද කාලය අතර ප්‍රගුණ කිරීම සඳහා සිදුකරන ලද වෙනස්කම් නිසා මෙම අතරමැදි කොමිස් සඳහා ගොඩනැඟිලි බිඳීම් සැබවින්ම හඳුන්වා දිය හැකිය.
  • පිටවීම සඳහා ස්වාමියා තුළ හොඳ ස්ථාන සොයා ගැනීම දුෂ්කර කරයි.
  • ගසෙහි කාලානුක්‍රමික අනුපිළිවෙල සමඟ නොගැලපීමට කොමිස් වල කාලරාමුව හේතු වේ. ඒ නිසා එම කැපවීම A ට පෙර මාස්ටර් ලෙස බැඳී ඇති බව ඔබට පෙනෙනු ඇත. (කුමන?!)
  • මාතෘකා ශාඛාව තුළ තනි තනිව සිදුකරන ගැටුම් එකිනෙකට සම්බන්ධ විය හැකි බැවින් ඒවා තනි තනිව විසඳිය යුතුය (එක් එක් බැඳීම තුළ සිදුවූ දේ පිළිබඳව ඉතිහාසයේ තවදුරටත් බොරු කියනු ලැබේ).
  • යනු ඉතිහාසය නැවත ලිවීමකි. නැවත ප්‍රතිස්ථාපනය කරන ලද ශාඛාව ඕනෑම තැනකට තල්ලු කර ඇත්නම් (ඔබ හැර වෙනත් අයෙකු සමඟ බෙදාගෙන තිබේ නම්) ඔබ ඉතිහාසය නැවත ලිවූ දා සිට එම ශාඛාව ඇති අනෙක් සියල්ලන්ම ඔබ රවටා ඇත.

ඊට වෙනස්ව, මාතෘකා ශාඛාවක් ස්වාමියා සමඟ ඒකාබද්ධ කිරීම:

  • මාතෘකා ශාඛා නිර්මාණය කරන ලද ඉතිහාසය ආරක්ෂා කරයි, එය ස්වාමියාගේ සිට මාතෘකා ශාඛාවට ඒකාබද්ධ කිරීම ඇතුළුව එය පවත්වා ගෙන යාමට උපකාරී වේ. සංවර්ධකයා ඔවුන් ගොඩනඟන විට ඔවුන් සමඟ වැඩ කළේ කුමන කේතයද යන්න පිළිබඳ නිවැරදි අදහසක් ඔබට සැබවින්ම ලැබේ.
  • මාස්ටර් යනු බොහෝ දුරට ඒකාබද්ධ කිරීම් වලින් සෑදී ඇති ශාඛාවක් වන අතර, එම එක් එක් ඒකාබද්ධ කිරීමේ කොමිස් සාමාන්‍යයෙන් ඉතිහාසයේ 'හොඳ ලකුණු' වන අතර ඒවා පරීක්ෂා කර බැලීමට ආරක්ෂිත වේ. මන්දයත් මාතෘකා ශාඛාව ඒකාබද්ධ කිරීමට සූදානම්ව සිටි බැවිනි.
  • මාතෘකා ශාඛාවේ සියලුම කාරණා සංරක්‍ෂණය කර ඇති අතර, ඒවා මාතෘකා ශාඛාවක තිබීම ඇතුළුව, එම වෙනස්කම් හුදකලා කිරීම ස්වාභාවික වන අතර ඔබට අවශ්‍ය අවස්ථාවන්හිදී සරඹ කළ හැකිය.
  • ඒකාබද්ධ කිරීමේ ගැටුම් විසඳිය යුත්තේ එක් වරක් පමණි (ඒකාබද්ධ කිරීමේ අවස්ථාවේදී), එබැවින් මාතෘකා ශාඛාවේ සිදු කරන ලද අතරමැදි බැඳීම් වෙනස්කම් ස්වාධීනව විසඳිය යුතු නොවේ.
  • කිහිප වතාවක් සුමටව කළ හැකිය. ඔබ වරින් වර ඔබේ මාතෘකා ශාඛාව ප්‍රගුණ කිරීම සඳහා ඒකාබද්ධ කරන්නේ නම්, මිනිසුන්ට මාතෘකා ශාඛාව ගොඩනඟා ගත හැකි අතර එය ස්වාධීනව ඒකාබද්ධ කළ හැකිය.

3
එසේම, git merge හි "--no-ff" (වේගයෙන් ඉදිරියට නොයන) විකල්පයක් ඇති අතර එමඟින් එක්තරා ඒකාබද්ධ කිරීමකින් හඳුන්වා දී ඇති සියලුම වෙනස්කම් පහසුවෙන් ආපසු හැරවීමට ඔබට ඉඩ සලසයි.
ටියාගෝ

3
එය වඩාත් පැහැදිලි කරන්න: ඔබ 'ඔබ දැනටමත් තල්ලු කර ඇති සෑම අවස්ථාවකම' තත්වය සඳහන් කරයි - මෙය නිර්භීත විය යුතුය. ලිනස් පෝස්ට් වෙත සබැඳිය විශිෂ්ටයි, btw., එය පැහැදිලි කරයි.
honzajde

2
නමුත් ඔබ මාතෘකා ශාඛාව PR හරහා මාස්ටර් සමඟ ඒකාබද්ධ කිරීමට පෙර (ඔබේ ශාඛාවේ ගැටුම් නිරාකරණය කිරීමට මිස ස්වාමියාට නොව) ඔබේ මාතෘකා ශාඛාවට “යාවත්කාලීන” කිරීම හොඳ පුරුද්දක් නොවේද? අපි එය කරන්නේ එලෙසය, එබැවින් බොහෝ මාතෘකා ශාඛාවලට අවසාන වශයෙන් "ශාඛා මාස්ටර් මාතෘකාවට ඒකාබද්ධ කරන්න" ... නමුත් මෙහි මෙය නැවත සකස් කිරීමේ "අංගයක්" ලෙස ලැයිස්තුගත කර ඇති අතර කිසිවෙකු එය ඒකාබද්ධ කිරීම ගැන සඳහන් නොකරයි ...?
ProblemsOfSumit

2
Nd ඇන්ඩ rew ආර්නොට් "බොහෝ මාතෘකා ශාඛා ගැටුම්වලින් තොරව ඔවුන්ගේ ඉලක්ක ශාඛාවලට ඒකාබද්ධ කිරීමට හැකි විය යුතුය" ශාඛා 30 ක් මත ඩිව්ස් 20 ක් වැඩ කරන විට එය කළ හැක්කේ කෙසේද? ඔබ ඔබේ වැඩ කරන අතරතුර ඒකාබද්ධ කිරීම් සිදුවනු ඇත - එබැවින් ඇත්ත වශයෙන්ම ඔබ PR නිර්මාණය කිරීමට පෙර ඉලක්ක ශාඛාව ඉලක්කයෙන් යාවත්කාලීන කළ යුතුය ... නැත?
ProblemsOfSumit

3
සාමාන්‍යයෙන් නොවේ, um සුමිට්. ශාඛා දෙකටම වෙනස් කිරීම් සිදු කර ඇතත්, Git දෙපැත්තටම හොඳින් ඒකාබද්ධ කළ හැකිය. ශාඛා දෙකක් හරහා එකම කේත රේඛා (හෝ ඉතා සමීප) වෙනස් කළ විට පමණක් ඔබට ගැටුම් ඇති වේ. කිසියම් කණ්ඩායමක එය නිතර සිදුවන්නේ නම්, ගැටුම් නිරාකරණය කිරීම බද්දක් වන බැවින් ඔවුන් වැඩ බෙදා හරින ආකාරය කණ්ඩායම නැවත සිතා බැලිය යුතුය.
ආර්නොට්

76

ටීඑල්ඩීආර්: එය වඩාත් වැදගත් දේ මත රඳා පවතී - පිළිවෙලට ඉතිහාසයක් හෝ සංවර්ධනයේ අනුක්‍රමය පිළිබඳ සැබෑ නිරූපණය

පිළිවෙලට ඇති ඉතිහාසයක් වඩාත්ම වැදගත් නම්, ඔබ පළමුව නැවත ප්‍රතිස්ථාපනය කර පසුව ඔබේ වෙනස්කම් ඒකාබද්ධ කරනු ඇත, එබැවින් නව කේතය යනු කුමක්ද යන්න හරියටම පැහැදිලි වේ. ඔබ දැනටමත් ඔබේ ශාඛාව තල්ලු කර ඇත්නම්, ප්‍රතිවිපාක සමඟ කටයුතු කළ හැකි නම් මිස නැවත නොයන්න.

අනුක්‍රමයේ සත්‍ය නිරූපණය වඩාත්ම වැදගත් නම්, ඔබ නැවත ප්‍රතිස්ථාපනය නොකර ඒකාබද්ධ වේ.

ඒකාබද්ධ කිරීම යන්නෙන් අදහස් වන්නේ: මගේ වෙනස්කම් ගමනාන්තයට ඒකාබද්ධ කරන තනි නව බැඳීමක් සාදන්න. සටහන: මෙම නව කැපවීමට දෙමව්පියන් දෙදෙනෙකු සිටී - ඔබගේ බැඳීම් මාලාවේ නවතම කැපවීම සහ ඔබ ඒකාබද්ධ කරන අනෙක් ශාඛාවේ නවතම කැපවීම.

ප්‍රතිස්ථාපනය යන්නෙන් අදහස් කරන්නේ: මගේ වර්තමාන කොමිස් කට්ටලය ඉඟි ලෙස භාවිතා කරමින් නව කොමිස් මාලාවක් සාදන්න. වෙනත් වචන වලින් කිවහොත්, මම නැවත ප්‍රතිස්ථාපනය කරන මොහොතේ සිට ඒවා සෑදීමට පටන් ගත්තා නම් මගේ වෙනස්කම් කෙබඳු වනු ඇත්දැයි ගණනය කරන්න. නැවත ගෙවීමෙන් පසුව, ඔබට ඔබගේ වෙනස්කම් නැවත පරීක්ෂා කිරීමට අවශ්‍ය විය හැකි අතර, නැවත ගෙවීමේදී ඔබට ගැටුම් කිහිපයක් ඇති විය හැකිය.

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


1
ස්වාමියා සමඟ ඒකාබද්ධ වීමෙන් වේගයෙන් ඉදිරියට යා හැකිය. විශේෂාංග ශාඛාවක සුළු දෝෂ ඇති හෝ සම්පාදනය නොකරන සමහර කොමිස් තිබිය හැකිය. ඔබ විශේෂාංග ශාඛාවක ඒකක පරීක්ෂණයක් පමණක් කරන්නේ නම්, මගේ ස්ලිප් එක ඒකාබද්ධ කිරීමේ සමහර දෝෂ. මාස්ටර් සමඟ ඒකාබද්ධ වීමට පෙර, ඒකාබද්ධ කිරීමේ පරීක්ෂණ අවශ්‍ය වන අතර සමහර දෝෂ පෙන්විය හැකිය. මේවා සවි කර ඇත්නම්, අංගය ඒකාබද්ධ කළ හැකිය. ඔබ මාස්ටර් වෙත දෝෂ සහිත කේතයක් කිරීමට අකමැති බැවින්, සියලු කැපවීම්-වේගයෙන් ඉදිරියට යාම වැළැක්වීම සඳහා නැවත ගෙවීමක් අත්‍යවශ්‍ය බව පෙනේ.
mbx

1
ඒකාබද්ධ කිරීම git mergeසඳහා බල කරන --no-ffවිකල්පයට @mbx සහය දක්වයි .
ගේවින් එස්. යන්සි

65

ඒකාබද්ධ කිරීම නියත වශයෙන්ම වෙනස්කම් ඒකාබද්ධ කිරීමට පහසුම හා වඩාත් පොදු ක්‍රමය වන අතර, එය එකම එකක් නොවේ: ප්‍රතිස්ථාපනය යනු ඒකාබද්ධ කිරීමේ විකල්ප මාධ්‍යයකි.

අවබෝධය ටිකක් හොඳ ඒකාබද්ධ කිරීම

Git ඒකාබද්ධ කිරීමක් සිදු කරන විට, එය කොමිස් තුනක් සොයයි:

  • (1) පොදු මුතුන් මිත්තන්ගේ කැපවීම. ඔබ ව්‍යාපෘතියක ශාඛා දෙකක ඉතිහාසය අනුගමනය කරන්නේ නම්, ඔවුන්ට සෑම විටම අවම වශයෙන් එක් බැඳීමක් තිබේ: මේ අවස්ථාවේ දී, ශාඛා දෙකම එකම අන්තර්ගතයක් ඇති අතර පසුව වෙනස් ආකාරයකින් පරිණාමය විය.
  • (2) + (3) එක් එක් ශාඛාවේ අවසාන ස්ථාන. ඒකාබද්ධ කිරීමේ පරමාර්ථය වන්නේ ශාඛා දෙකක වර්තමාන තත්වයන් ඒකාබද්ධ කිරීමයි. එබැවින් ඔවුන්ගේ නවතම සංශෝධන විශේෂ උනන්දුවක් දක්වයි. මෙම බැඳීම් තුන ඒකාබද්ධ කිරීමෙන් අප අරමුණු කරන ඒකාබද්ධතාවයට හේතු වේ.

වේගයෙන් ඉදිරියට හෝ ඒකාබද්ධ කිරීමේ බැඳීම

ඉතා සරල අවස්ථා වලදී, ශාඛා දෙකෙන් එකකට අතු බෙදීම් සිදු වූ දා සිට නව කොමිස් කිසිවක් නොමැත - එහි නවතම කැපවීම තවමත් පොදු මුතුන් මිත්තෙකි.

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

මෙම අවස්ථාවෙහිදී, අනුකලනය සිදු කිරීම ඉතා සරල ය: පොදු මුතුන් මිත්තන්ගේ කැපවීමට ඉහළින් Git හට අනෙක් ශාඛාවේ සියලු කැපවීම් එකතු කළ හැකිය. Git හි, මෙම සරලම ඒකාබද්ධ කිරීමේ ක්‍රමය “වේගයෙන් ඉදිරියට යාම” ලෙස හැඳින්වේ. ශාඛා දෙකම එකම ඉතිහාසය බෙදා ගනී.

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

කෙසේ වෙතත්, බොහෝ අවස්ථාවන්හිදී, ශාඛා දෙකම තනි තනිව ඉදිරියට ගියේය.

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

අනුකලනය කිරීම සඳහා, Git විසින් ඔවුන් අතර ඇති වෙනස්කම් අඩංගු නව බැඳීමක් නිර්මාණය කළ යුතුය - ඒකාබද්ධ කිරීමේ බැඳීම.

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

මානව කොමිස් සහ ඒකාබද්ධ කිරීමේ කමිටු

සාමාන්‍යයෙන්, කැපවීමක් මිනිසෙකු විසින් ප්‍රවේශමෙන් නිර්මාණය කරනු ලැබේ. එය අර්ථවත් ඒකකයක් වන අතර එය අදාළ වෙනස්කම් පමණක් ආවරණය කර ඒවා විවරණයකින් විවරණය කරයි.

ඒකාබද්ධ කිරීමේ බැඳීම ටිකක් වෙනස් ය: සංවර්ධකයෙකු විසින් නිර්මාණය කරනු වෙනුවට එය ස්වයංක්‍රීයව Git විසින් නිර්මාණය කරනු ලැබේ. අදාළ වෙනස්කම් සමූහයක් ඔතා ගැනීම වෙනුවට, එහි අරමුණ වන්නේ ගැටයක් මෙන් අතු දෙකක් සම්බන්ධ කිරීමයි. ඔබට පසුව ඒකාබද්ධ කිරීමේ මෙහෙයුමක් අවබෝධ කර ගැනීමට අවශ්‍ය නම්, ඔබ ශාඛා දෙකේම ඉතිහාසය සහ ඊට අනුරූප බැඳීම් ප්‍රස්ථාරය දෙස බැලිය යුතුය.

Rebase සමඟ ඒකාබද්ධ වීම

සමහර අය එවැනි ස්වයංක්‍රීය ඒකාබද්ධ කිරීම් නොමැතිව යාමට කැමැත්තක් දක්වයි. ඒ වෙනුවට, ඔවුන්ට අවශ්‍ය වන්නේ ව්‍යාපෘතියේ ඉතිහාසය තනි, සරල රේඛාවකින් පරිණාමය වූවාක් මෙනි. යම් අවස්ථාවක දී එය බහු ශාඛා වලට බෙදී ඇති බවට කිසිදු සාක්ෂියක් ඉතිරිව නැත.

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

පියවරෙන් පියවර නැවත ගෙවීමේ ක්‍රියාවලියක් හරහා ගමන් කරමු. මෙම දර්ශනය පෙර උදාහරණ වලට සමාන වේ: අපට අවශ්‍ය වන්නේ ශාඛා-බී සිට ශාඛා-ඒ දක්වා වෙනස්වීම් ඒකාබද්ධ කිරීමට ය, නමුත් දැන් නැවත භාවිතා කිරීමෙනි.

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

අපි මෙය පියවර තුනකින් කරන්නෙමු

  1. git rebase branch-A // Synchronises the history with branch-A
  2. git checkout branch-A // Change the current branch to branch-A
  3. git merge branch-B // Merge/take the changes from branch-B to branch-A

පළමුවෙන්ම, රේඛා අතු බෙදීමට පටන් ගත් පසු (පොදු මුතුන් මිත්තන්ගේ කැපවීමෙන් පසුව) සිදු වූ ශාඛා-ඒ පිළිබඳ සියලු කටයුතු Git "අහෝසි කරනු ඇත". කෙසේ වෙතත්, ඇත්ත වශයෙන්ම, එය ඒවා ඉවත නොදමනු ඇත: ඒ වෙනුවට ඔබට එම ක්‍රියාවන් "තාවකාලිකව ගැලවීම" ලෙස සිතිය හැකිය.

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

ඊළඟට, එය අපට ඒකාබද්ධ කිරීමට අවශ්‍ය ශාඛා-බී ශාඛාවෙන් අදාළ වේ. මෙම අවස්ථාවෙහිදී, ශාඛා දෙකම හරියටම සමාන වේ.

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

අවසාන පියවරේදී, ශාඛා-ඒ පිළිබඳ නව කොමිස් දැන් නැවත යෙදී ඇත - නමුත් නව ස්ථානයක, ශාඛා-බී වෙතින් ඒකාබද්ධ කොමිස් වලට ඉහළින් (ඒවා නැවත පදනම් වේ).

ප්‍රති result ලය පෙනෙන්නේ සංවර්ධනය සරල රේඛාවකින් සිදු වූ බවයි. සියලු ඒකාබද්ධ වෙනස්කම් අඩංගු ඒකාබද්ධ කිරීමේ බැඳීමක් වෙනුවට, මුල් බැඳීම් ව්‍යුහය ආරක්ෂා විය.

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

අවසාන වශයෙන්, ඔබට අනවශ්‍ය හා ස්වයංක්‍රීයව ජනනය කළ නොහැකි පිරිසිදු ශාඛා ශාඛාවක් ලැබෙනු ඇත .

සටහන: මෙම නියමයි සිට ගත වන පශ්චාත් විසින් git-tower. මෙහි ඇති අවාසිrebaseඑකම ලිපියේ හොඳ කියවීමකි.


ඉතා සිසිල් රූප සටහන් සඳහා +1. මට සෑම විටම අවශ්‍ය වූයේ වාසනාවකින් තොරව සමාන ආකාරයකින් git flow උදාහරණයක් නිරූපණය කිරීමට හැකිවීමයි.
මිකයිල් අබ්දුල්ලායෙව්

60

ඒකාබද්ධ කිරීමට / නැවත ප්‍රතිස්ථාපනය කිරීමට පෙර:

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 හි සොයාගත හැකිය .


30

මෙම වාක්‍යයට එය ලැබේ:

පොදුවේ ගත් කල, ලෝක දෙකෙහිම හොඳම දේ ලබා ගත හැකි ක්‍රමය නම්, ඔබ විසින් සිදුකරන ලද දේශීය වෙනස්කම් නැවත ප්‍රතිස්ථාපනය කිරීමයි, නමුත් ඔබේ කතාව පිරිසිදු කිරීම සඳහා ඔබ ඒවා තල්ලු කිරීමට පෙර තවමත් බෙදාගෙන නැත, නමුත් ඔබ කොහේ හෝ තල්ලු කළ කිසිවක් නැවත ප්‍රතික්ෂේප නොකරන්න .

මූලාශ්‍රය: 3.6 Git Branching - Rebasing, Rebase vs. Merge


25

මෙම පිළිතුර 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 mergevs පිළිබඳ ප්‍රශ්නය 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

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


15

මෙම Pro Git පොත මත ඇත්තෙන්ම හොඳ පැහැදිලි කිරීමක් කර rebasing පිටුව .

මූලික වශයෙන් ඒකාබද්ධ කිරීමක් කොමිස් දෙකක් ගෙන ඒවා ඒකාබද්ධ කරයි.

ප්‍රතිප්‍රහාරයක් පොදු මුතුන් මිත්තන් දෙදෙනා වෙත ගොස් එකිනෙකා මත වෙනස්කම් වැඩි වැඩියෙන් යොදනු ඇත. මෙය 'පිරිසිදු කරන්නෙකු' සහ වඩාත් රේඛීය ඉතිහාසයක් ඇති කරයි.

නමුත් ඔබ නැවත ප්‍රතිස්ථාපනය කරන විට, ඔබ කලින් කළ ක්‍රියා අතහැර දමා නව ඒවා සාදයි. එබැවින් ඔබ කිසි විටෙකත් පොදු වූ ගබඩාවක් නැවත ප්‍රතිස්ථාපනය නොකළ යුතුය. ගබඩාවේ වැඩ කරන අනෙක් පුද්ගලයින් ඔබට වෛර කරනු ඇත.

එම හේතුව නිසා පමණක් මම සම්පූර්ණයෙන්ම පාහේ ඒකාබද්ධ වෙමි. මගේ ශාඛා වලින් 99% ක් එතරම් වෙනස් නොවේ, එබැවින් ගැටුම් තිබේ නම් එය ස්ථාන එකක හෝ දෙකක පමණි.


1
ඒකාබද්ධ කිරීම් කොමිස් ඒකාබද්ධ නොකරයි - එය ඉතිහාසය නැවත ලිවීමකි. රෙබේස් එය කරයි.
kellyfj

4

ඉතිහාසයේ අතු බෙදීම් පිරිසිදු හා නිධි ව්‍යුහය රේඛීය කිරීමට Git rebase භාවිතා කරයි.

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

නැවත ලබා දීමෙන් පසු අප සාමාන්‍ය ඒකාබද්ධ කිරීමක් කරන්නේ දැයි බැලීමට භාවිතා කළ අතිරේක බැඳීමකින් ද අපි මිදෙමු.

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


4

ඔබ එක් සංවර්ධකයෙකු පමණක් නම් ඔබට පැහැදිලි ඉතිහාසයක් ඇතිවීම සඳහා ඒකාබද්ධ කිරීම වෙනුවට නැවත භාවිතා කළ හැකිය

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


3

යම් ප්රායෝගික උදාහරණ, මහා පරිමාණ සංවර්ධන එහිදී කිරීම තරමක් සම්බන්ධ ගෙරිට්සමාලෝචන සහ බෙදා හැරීමේ ඒකාබද්ධ කිරීම සඳහා භාවිතා කරන :

මගේ විශේෂාංග ශාඛාව නැවුම් දුරස්ථ මාස්ටර් වෙත ඔසවා තැබීමේදී මම ඒකාබද්ධ වෙමි. මෙය අවම නඟා සිටුවීමේ කාර්යයක් ලබා දෙන අතර නිදසුනක් ලෙස 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

3

නැවත එකතු කිරීම සහ ඒකාබද්ධ කිරීම යනු කුමක්ද යන්න බොහෝ වාරයක් පැහැදිලි කරන ලදී, නමුත් ඔබ භාවිතා කළ යුත්තේ කවදාද?

ඔබ නැවත භාවිතා කළ යුත්තේ කවදාද?

  • ඔබ ශාඛාව තල්ලු නොකළ විට / වෙනත් කිසිවෙකු ඒ මත වැඩ නොකරයි
  • ඔබට සම්පූර්ණ ඉතිහාසය අවශ්‍යයි
  • ස්වයංක්‍රීයව ජනනය කරන ලද "ඒකාබද්ධ කරන ලද .." පණිවිඩ සියල්ලම වළක්වා ගැනීමට ඔබට අවශ්‍යය

Git rebase ඉතිහාසය වෙනස් කරන විට. එම නිසා වෙනත් අයෙකු එකම ශාඛාවක වැඩ කරන විට / ඔබ එය තල්ලු කර ඇත්නම් එය භාවිතා නොකළ යුතුය. නමුත් ඔබට ප්‍රාදේශීය ශාඛාවක් තිබේ නම්, පිරිසිදු ඉතිහාසයක් තබා ගැනීම සඳහා ඔබේ ශාඛාව නැවත ස්වාමියා සමඟ ඒකාබද්ධ කිරීමට පෙර ඒකාබද්ධ කිරීමේ ප්‍රතිස්ථාපන මාස්ටර් කළ හැකිය. මෙය කිරීමෙන්, මාස්ටර් ශාඛාවට ඒකාබද්ධ කිරීමෙන් පසු ඔබ ප්‍රධාන ශාඛාවේ ශාඛාවක් භාවිතා කළ බවක් නොපෙනේ - ඔබ ස්වයංක්‍රීයව ජනනය කරන ලද “ඒකාබද්ධ” කර නොමැති නිසා ඉතිහාසය “පිරිසිදු” වේ, නමුත් තවමත් තිබේ ස්වයංක්‍රීයව "ඒකාබද්ධ කිරීම" නොමැතිව ඔබගේ ප්‍රධාන ශාඛාවේ සම්පූර්ණ ඉතිහාසය.

කෙසේ වෙතත්, ඔබ git merge feature-branch --ff-onlyඔබේ අංගය ප්‍රධාන වශයෙන් ඒකාබද්ධ කරන විට තනි බැඳීමක් ඇති කරන ගැටුම් නොමැති බවට වග බලා ගන්න.විශේෂාංග ශාඛාවේ ඉතිහාසය ලබා ගන්නා විට ඔබ වැඩ කරන සෑම කාර්යයක් සඳහාම විශේෂාංග ශාඛා භාවිතා කරන්නේ නම් මෙය සිත්ගන්නා කරුණකි, නමුත් "ඒකාබද්ධ .."

දෙවන අවස්ථාව නම්, ඔබ ශාඛාවකින් අතු බෙදී ප්‍රධාන ශාඛාවේ වෙනස් වී ඇති දේ දැන ගැනීමට අවශ්‍ය නම්. සෑම බැඳීමක්ම ඇතුළත් වන බැවින් රීබේස් ඔබට තොරතුරු ලබා දෙයි.

ඔබ ඒකාබද්ධ කිරීම භාවිතා කළ යුත්තේ කවදාද?

  • ඔබ ශාඛාව තල්ලු කළ විට / අනෙක් අයද ඒ මත වැඩ කරයි
  • ඔබට සම්පූර්ණ ඉතිහාසය අවශ්‍ය නොවේ
  • සරලව ඒකාබද්ධ කිරීම ඔබට ප්‍රමාණවත්

ඔබේ ප්‍රධාන ශාඛාවේ විශේෂාංග ශාඛාවක ඉතිහාසය ඔබට අවශ්‍ය නැති විට හෝ අවශ්‍ය නොවූ විට හෝ අනෙක් අය එකම ශාඛාවක වැඩ කරන්නේ නම් / ඔබ එය තල්ලු කර ඇත. ඔබට තවමත් ඉතිහාසය ලබා ගැනීමට අවශ්‍ය නම්, විශේෂාංග ශාඛාව මාස්ටර් සමඟ ඒකාබද්ධ කිරීමට පෙර විශේෂාංග ශාඛාවට මාස්ටර් ඒකාබද්ධ කරන්න. මෙහි ප්‍රති result ලය වනුයේ ඔබේ ස්වාමියා තුළ ඇති විශේෂාංග ශාඛාවේ ඉතිහාසය ඔබ සතුව ඇති අතර (ඔබ එහි ප්‍රධානියා ඒකාබද්ධ කළ නිසා ඔබේ විශේෂාංග ශාඛාවේ ඒකාබද්ධ කිරීමේ බැඳීමද ඇතුළුව).


-4

මම භාවිතා git rebaseකරන්නේ කවදාද? එය කිසි විටෙකත් පාහේ නොවේ, මන්ද එය ඉතිහාසය නැවත ලියයි. git mergeසෑම විටම පාහේ වඩාත් සුදුසු තේරීම වේ, මන්ද එය ඔබගේ ව්‍යාපෘතියේ ඇත්ත වශයෙන්ම සිදුවූ දෙයට ගරු කරන බැවිනි.


1
@ බෙන්ජමින්හුල් ස්තූතියි! - හැර මගේ පිළිතුර සත්‍යය පදනම් වේ යැයි මම විශ්වාස කරමි. IMHO මතයට මේ ආකාරයේ තැනක එතරම් තැනක් නැත: එය ඔබගේ සත්‍ය ඉතිහාසය අහිමි වීමෙන් පසු ජීවිතය දුෂ්කර වන බව සත්‍යයකි .
මාර්නන් ලයිබෝ-කොසර්

1
එකඟ වන්න. ඒකාබද්ධ කිරීම කිසි විටෙකත් දූෂිත ඉතිහාසයට මග පාදන්නේ නැත (ඔබ තල්ලු කළ ක්‍රියාවන් නැවත ප්‍රතික්ෂේප කරන විට)
සර්ෆයිඩර්
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.