මෙම සබැඳියෙන් ඒකාබද්ධ කිරීම ආපසු හරවා ගන්නේ කෙසේද යන්න පිළිබඳව මට හොඳ පැහැදිලි කිරීමක් හමු වූ අතර මම පහත පැහැදිලි කිරීම පිටපත් කළෙමි. පහත සබැඳිය ක්රියා නොකරන්නේ නම් එය ප්රයෝජනවත් වනු ඇත.
වැරදි ඒකාබද්ධ කිරීමක් ආපසු හරවා ගන්නේ කෙසේද
ඇලන් (alan@clueserver.org) මෙසේ පැවසීය:
මට ප්රධාන ශාඛාවක් ඇත. සමහර සංවර්ධකයින් වැඩ කරමින් සිටින ශාඛාවක් අප සතුව ඇත. ඔවුන් කියා සිටින්නේ එය සූදානම් බවයි. අපි එය ප්රධාන ශාඛාවට ඒකාබද්ධ කරමු. එය යමක් බිඳ දමයි, එබැවින් අපි ඒකාබද්ධ කිරීම ආපසු හරවන්නෙමු. ඔවුන් කේතයේ වෙනස්කම් සිදු කරයි. ඔවුන් එය හරි යැයි පවසන තැනකට එය ලබා ගන්නා අතර අපි නැවත ඒකාබද්ධ කරමු. පරීක්ෂා කර බැලූ විට, ආපසු හැරවීමට පෙර සිදු කරන ලද කේත වෙනස්කම් ප්රධාන ශාඛාවේ නොමැති බව අපට පෙනී යයි, නමුත් පසුව කේත වෙනස්වීම් ප්රධාන ශාඛාවේ ඇති බව අපට පෙනී යයි. මෙම තත්වයෙන් ගොඩ ඒමට උදව් ඉල්ලා සිටියේය.
"ඒකාබද්ධ කිරීම ආපසු හැරවීම" සිදු වූ වහාම ඉතිහාසය මෙසේ පෙනේ:
---o---o---o---M---x---x---W
/
---A---B
A සහ B එතරම් දියුණු නොවූ පැති සංවර්ධනයේ සිටින විට, M යනු මෙම නොමේරූ වෙනස්කම් ප්රධාන රේඛාවට ගෙන ඒමයි, x යනු පැති ශාඛාව කළ හා දැනටමත් ප්රධාන රේඛාවේ සිදු කර ඇති දෙයට සම්බන්ධ නොවන වෙනස්කම් වන අතර W යනු " ඒකාබද්ධ කිරීමේ එම් "(W උඩු යටිකුරු ලෙස පෙනෙන්නේ නැද්ද?). IOW, "diff W ^ .. W" යනු "diff -RM ^ .. M" ට සමානය.
ඒකාබද්ධයේ එවැනි "ආපසු හැරවීමක්" කළ හැක්කේ:
branch git revert -m 1 M පැති ශාඛාවේ සංවර්ධකයින් ඔවුන්ගේ වැරදි නිවැරදි කිරීමෙන් පසුව, ඉතිහාසය මේ ආකාරයට විය හැකිය:
---o---o---o---M---x---x---W---x
/
---A---B-------------------C---D
එහිදී C සහ D යනු A සහ B හි කැඩී ඇති දේ නිවැරදි කිරීමට වන අතර, W ට පසුව ප්රධාන මාර්ගයේ වෙනත් වෙනස්කම් ඔබට දැනටමත් තිබිය හැකිය.
ඔබ යාවත්කාලීන කරන ලද පැති ශාඛාව (එහි කෙළවරේ D සමඟ) ඒකාබද්ධ කරන්නේ නම්, A හෝ B හි සිදු කරන ලද කිසිදු වෙනසක් ප්රති result ලයට නොලැබේ, මන්ද ඒවා W විසින් ආපසු හරවන ලදි. ඇලන් දුටුවේ එයයි.
ලිනස් තත්වය පැහැදිලි කරයි:
නිත්ය කැපවීමක් ආපසු හැරවීම එම කැපවීම කළ දේ effectively ලදායී ලෙස අහෝසි කරන අතර එය තරමක් සරල ය. නමුත් ඒකාබද්ධ කිරීමේ බැඳීමක් ආපසු හැරවීමෙන් ද එම බැඳීම වෙනස් වූ දත්ත අහෝසි වේ , නමුත් එය ඒකාබද්ධ කිරීම ඉතිහාසයට ඇති බලපෑමට කිසිසේත් නොකරයි . එබැවින් ඒකාබද්ධ කිරීම තවමත් පවතිනු ඇති අතර, එය තවමත් ශාඛා දෙක එකට එකතු වන බවක් පෙනෙනු ඇති අතර, අනාගත ඒකාබද්ධ කිරීම් මගින් එම ඒකාබද්ධ කිරීම අවසන් හවුල් රාජ්යය ලෙස පෙනෙනු ඇත - සහ ඒකාබද්ධ කිරීම ආපසු හරවන ලද ආපසු හැරවීම කිසිසේත් බලපාන්නේ නැත. එබැවින් "ආපසු හැරවීමක්" මඟින් දත්ත වෙනස්වීම් අහෝසි කරයි, නමුත් එය එසේ නොවේ"අහෝසි කිරීම" යන්නෙන් එය නිධිය ඉතිහාසයට බැඳීමක බලපෑම අහෝසි නොකරයි. එබැවින් ඔබ "ආපසු හැරවීම" "අහෝසි කරන්න" ලෙස සිතන්නේ නම්, එවිට ඔබට සෑම විටම ප්රතිවර්තනයේ මෙම කොටස මග හැරෙනු ඇත. ඔව්, එය දත්ත අහෝසි කරයි, නමුත් නැත, එය ඉතිහාසය අහෝසි නොකරයි. එවැනි තත්වයක් තුළ, ඔබට පළමුව පෙර ප්රතිවර්තනය ආපසු හැරවීමට අවශ්ය වනු ඇත, එමඟින් ඉතිහාසය මේ ආකාරයෙන් පෙනෙනු ඇත:
---o---o---o---M---x---x---W---x---Y
/
---A---B-------------------C---D
මෙහි Y යනු W හි ප්රතිවර්තනයයි. එවැනි “ප්රතිවර්තනය” ආපසු හැරවිය හැක්කේ:
history git revert W මෙම ඉතිහාසය (W සහ W..Y වෙනස් කළ දේ අතර ඇති විය හැකි ගැටුම් නොසලකා හැරීම) ඉතිහාසයේ කිසිසේත් W හෝ Y නොතිබීමට සමාන වේ:
---o---o---o---M---x---x-------x----
/
---A---B-------------------C---D
පැති ශාඛාව නැවත ඒකාබද්ධ කිරීමෙන් කලින් ආපසු හැරවීම සහ ආපසු හැරවීම නිසා ගැටුම් ඇති නොවේ.
---o---o---o---M---x---x-------x-------*
/ /
---A---B-------------------C---D
ඇත්ත වශයෙන්ම සී සහ ඩී වල සිදු කරන ලද වෙනස්කම් ඕනෑම x විසින් කරන ලද දේ සමඟ ගැටෙන්නට පුළුවන, නමුත් එය සාමාන්ය ඒකාබද්ධ කිරීමේ ගැටුමකි.