Кіріспе

Версияны басқаруда біріктіру (немесе интеграция) – файлдардың нұсқамен бақыланатын жинағына енгізілген әр түрлі өзгерістерді үйлестіретін маңызды операция. Көбінесе, бұл қажеттілік туындайды, егер файл екі тәуелсіз тармақта өзгертіліп, содан кейін біріктірілсе. Нәтижесінде, екі жиын өзгерісті қамтитын файлдардың біртұтас жинағы құрылады. Кейбір жағдайларда, өзгерістерді қайта құруға жеткілікті тарих ақпараты болса және өзгерістер қақтығыс тудырмаса, біріктіру автоматты түрде жүзеге асырылуы мүмкін. Ал басқа жағдайларда, түпкі файлдарда қандай өзгерістер болу керектігін адам анықтауы тиіс. Көптеген нұсқаны басқару бағдарламалық құралдары біріктіру мүмкіндіктерін ұсынады.

Бірігу түрлері

Құрамалардың екі түрі бар: құрылымсыз және құрылымды.

Жұмыс ағыны

Автоматты біріктіру – нұсқауды басқару бағдарламалық қамтамасы бір мезгілде (логикалық тұрғыдан) жасалған өзгерістерді келістіргенде атқаратын әрекет. Сондай-ақ, бір мазмұнды бір уақытта өңдеуге рұқсат беретін басқа бағдарламалық жасақтамалар да автоматты біріктіруді қолданады. Мысалы, Уикипедия екі адамға бір мақаланы бірден өңдеуге мүмкіндік береді; екінші өңдеуші сақтағанда, олардың өзгерістері бұрынғы өзгерістерді жаңартудың орнына мақалаға біріктіріледі. Қолмен біріктіру – адамдар егер файлдардағы айырмашылықтарды келістіруге тиіс болса (мүмкін біріктіру құралдарының көмегімен) қолданатын тәсіл. Мысалы, егер екі жүйеде конфигурациялық файлдың сәл өзгеше нұсқалары болса және пайдаланушы екеуінде де қажетті өзгерістерді алғысы келсе, бұл әдетте конфигурациялық файлдарды қолмен біріктіру арқылы және екі дереккөзден қажетті өзгерістерді таңдау арқылы жүзеге асырылады (бұл екіталай біріктіру деп те аталады). Автоматты біріктіру өзгерістерлер қақтығысқа ұшырағанда қолмен біріктіру қажет болады; мысалы, өте сирек автоматты біріктіру құралдары кодтың бір жолына екі өзгерісті біріктіре алады (мысалы, функцияның атын өзгерту және түсініктеме қосу). Мұндай жағдайларда нұсқауды басқару жүйелері пайдаланушыға жоспарланған біріктіру нәтижесін анықтау үшін жүгінеді.

Біріктіру алгоритмдері

Автоматты біріктіруге қатысты көптеген әртүрлі тәсілдер бар, олардың арасында көзге көрінбейтін айырмашылықтар бар. Көзге түсетін біріктіру алгоритмдеріне үш жолды біріктіру, рекурсивті үш жолды біріктіру, шамалы жапсырманы қолдану, тоқу арқылы біріктіру және жапсырма алмастыру жатады.

Үшжақты бірігу

Үш жолды біріктіру "А" файлы мен "В" файлы арасындағы автоматты айырмашылықтарды талдағаннан кейін, сондай-ақ екі файлдың – "С" файлының бастауын немесе ортақ ата-бабасын ескере отырып жүзеге асырылады. Бұл шамалы дәлдіктегі біріктіру әдісі, бірақ кеңінен қолданылады, себебі біріктірілуге тиіс өзгерістерді қалпына келтіру үшін тек бір ортақ ата-баба ғана қажет. Үш жолды біріктіруді қара мәтінде (жолдар тізбегі) немесе құрылымдық ағаштарда жасауға болады. Үш жолды біріктіру үш файлдың екеуінде ғана бірдей болатын бөлімдерді іздейді. Мұндай жағдайда бөлімнің екі нұсқасы болады, ортақ ата-баба "С" нұсқасы жойылады, ал ерекшеленетін нұсқасы шығысқа сақталады. Егер "А" мен "В" келіссе, нәтиже сол күйінде шығарылады. "А" және "С" файлында бірдей бөлім "В" файлындағы өзгертілген нұсқаны шығарады, ал "В" және "С" файлында бірдей бөлім "А" файлындағы нұсқаны шығарады. Үш файлдың барлығында да әртүрлі бөлімдер қайшылық ретінде белгіленеді және оларды шешу пайдаланушыға жүктеледі. Үш жолды біріктіруді diff3 бағдарламасы іске асырады және бұл файлдық құлыптауға негіделген нұсқаларды басқару жүйелерінен біріктіруге негіделген нұсқаларды басқару жүйелеріне көшуге мүмкіндік берген маңызды жаңалық болды. Бұл жүйе Concurrent Versions System (CVS) жүйесінде кеңінен қолданылады.

Үш жолды рекурсивті біріктіру

Үш жолды біріктіруге негізделген нұсқаларды басқару құралдары кеңінен таралған, бірақ бұл техника негізінен біріктірілетін нұсқалардың ортақ ата-тегін табуға байланысты. Әсіресе "қырлы-сырлы біріктіру" сияқты қиын жағдайлар бар, онда өзгертілген нұсқалардың бірегей соңғы ортақ ата-тегі болмайды. Ақыртымызға орай, мұндай жағдайда ең көп дегенде екі мүмкін ата-тегі бар екені көрсетіледі, ал рекурсивті үш жолды біріктіру бірінші кезекте бірегей емес ата-тегтерді біріктіру арқылы жасанды ата-тег құрады. Бұл біріктірудің өзі сол мәселеге ұшырауы мүмкін, сондықтан алгоритм оларды рекурсивті түрде біріктіреді. Нұсқалар тарихында шектеулі болғандықтан, процесс әрқашан аяқталады деп кепілдік беріледі. Бұл техниканы Git нұсқаларды басқару құралы қолданады. (Git-тің рекурсивті біріктіруді іске асыруы басқа да қиын жағдайларды шешеді, мысалы, бір нұсқада өзгертілген және екінші нұсқада аты өзгертілген файл, бірақ бұл оның үш жолды біріктіруді іске асыруының кеңейтілген мүмкіндіктері; үш нұсқаны біріктіру әдісінің бөлігі емес.) Рекурсивті үш жолды біріктіруді тек құрал біріктірілетін туындылардың толық ата-тегі туралы мәліметтерге ие болған жағдайларда ғана қолдануға болады. Сондықтан, туындылар немесе біріктірулер өздерінің басты нұсқаларын толық көрсетпеген жағдайларда оны қолдануға болмайды.

Жапсырманы жапсыру

Жаңарту – файлға енгізілген өзгерістердің сипаттамасын қамтитын файл. Unix жүйесінде мәтіндік файлдарға енгізілген өзгерістерді "diff u" форматындағы жаңартулар түрінде тарату дәстүрі қалыптасқан. Бұл форматты жаңарту бағдарламасы мәтіндік файлға немесе мәтіндік файлдарды қамтитын каталог құрылымына өзгерістерді қайта қолдануға (немесе жоюға) пайдаланады. Дегенмен, жаңарту бағдарламасы жаңарту жасау үшін пайдаланылған бастапқы файлға толық сәйкес келмейтін файлға жаңартуды қолдану мүмкіндігін де ұсынады. Бұл процеске «шала қолдану» дейді, ол үш тармақты біріктірудің асимметриялық түріне әкеледі, егер жаңарту бағдарламасы оларды қолдануға орын таба алмаса, жаңартудағы өзгерістер жойылады. CVS diff3 скрипттері жиынтығынан басталып, GNU arch жаңарту бағдарламасы да скрипттер жиынтығынан бастау алды. Алайда, шала қолдану әдісі сенімділігі төмен, кейде жеткілікті контексті жоқ (әсіресе жаңа файл құратын) жаңартуларды қате қолдануы мүмкін, ал кейде екі түрлі нұсқасы да жасаған жоюларын қолданбайды.

Жапсырманы ауыстыру

Пач коммутациясы Darcs жүйесінде өзгерістерді біріктіру үшін қолданылады, сондай-ақ git жүйесінде де іске асырылады (бірақ "rebasing" деп аталады). Патч коммутациясы арқылы біріктіру дегеніміз – патчтардың (яғни, өзгерістердің сипаттамаларының) ретін өзгерту, осылайша олар сызықтық тарихты құрайды. Егер екі патч ортақ жағдайға байланысты жасалса, біріктіру кезінде олардың біреуі екіншісінің негізінде жасалғандай етіп қайта жазылады. Патч коммутациясы үшін туынды файлдар жасалған нақты өзгерістерді сақтау немесе қайта құру қажет. Осы нақты өзгерістерден, олардың біреуін екіншісіне негіздеу үшін қалай өзгерту керектігін есептеуге болады. Мысалы, егер A патчы F файлының 7-жолынан кейін "X" жолын, ал B патчы F файлының 310-жолынан кейін "Y" жолын қосса, егер B патчы A патчына негізделсе, оны қайта жазу қажет: "Y" жолын F файлының 311-жолынан кейін қосу керек, себебі A патчы қосылған жол жол нөмірін бірге жылдырады. Патч коммутациясы кеңінен зерттелді, бірақ патч коммутациясындағы біріктіру қақтығыстарын шешу алгоритмдері әлі де зерттеу мәселесі болып табылады. Дегенмен, патч коммутациясы "дұрыс" біріктіру нәтижелерін беретінін дәлелдеуге болады, ал басқа біріктіру стратегиялары көбінесе пайдаланушылардың көруін қалайтынын табуға бағытталған эвристикалық тәсілдер болып табылады. Unix жүйесіндегі flipdiff бағдарламасы, "patchutils" пакетінен, diff u командасымен жасалған дәстүрлі патчтар үшін патч коммутациясын іске асырады.

Ұстасу біріктірілуі

Weave merge – екі файлдың ортақ ата-тегін пайдаланбайтын алгоритм. Оның орнына, файлдардың туынды нұсқаларындағы жекелеген жолдардың қосылуы мен жойылуын қадағалайды және осы ақпарат негізінде біріктірілген файлды құрайды. Weave merge, туынды файлдардағы әрбір жол үшін келесі ақпаратты жинайды: оған дейінгі жолдар, одан кейінгі жолдар және ол туындының тарихының қандай да бір кезеңінде жойылған-жойылмағаны. Егер туындының біреуінде жол жойылған болса, ол біріктірілген нұсқада болуы керек емес. Ал қалған жолдар біріктірілген нұсқада болуы тиіс. Жолдар тарихтың белгілі бір кезеңінде оған дейінгі барлық жолдардан кейін және одан кейінгі барлық жолдардан бұрын орналасатындай ретпен сұрыпталады. Егер осы шектеулер барлық жолдарды толық ретке келтірмесе, бір-біріне қатысты реті анықталмаған жолдар – қақтығыс тудыратын қосымшалар болып табылады. Weave merge коммерциялық BitKeeper нұсқауларын басқару құралында қолданылған және үш таңбалы біріктіру қате немесе нашар нәтижелер беретін кейбір қиын жағдайларды шеше алады. Бұл GNU Bazaar нұсқауларын басқару құралының біріктіру опцияларының бірі және Codeville-де қолданылады.