mergiraf — инструмСнт, ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€Π°Π½ към AST Π·Π° Ρ‚Ρ€ΠΎΠΉΠ½ΠΎ сливанС Π² Git

ΠŸΡƒΠ±Π»ΠΈΠΊΡƒΠ²Π°Π½ Π΅ Ρ€Π΅Π»ΠΈΠ· Π½Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° mergiraf 0.4, ΠΊΠΎΠΉΡ‚ΠΎ Ρ€Π°Π·Π²ΠΈΠ²Π° Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€Π° Π·Π° Git с Ρ€Π΅Π°Π»ΠΈΠ·ΠΈΡ€Π°Π½Π° Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ Π·Π° Ρ‚Ρ€ΠΎΠΉΠ½ΠΎ сливанС. Mergiraf ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ° Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ Π²ΠΈΠ΄ΠΎΠ²Π΅ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΠΈ ΠΏΡ€ΠΈ сливанС ΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π·Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ Π΅Π·ΠΈΡ†ΠΈ Π·Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈΡ€Π°Π½Π΅ ΠΈ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈ Π½Π° Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅. Π’ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎ Π΅ ΠΊΠ°ΠΊΡ‚ΠΎ ΠΎΡ‚Π΄Π΅Π»Π½ΠΎ ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅ Π½Π° mergiraf Π·Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΠΈ, Π²ΡŠΠ·Π½ΠΈΠΊΠ²Π°Ρ‰ΠΈ ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π° с рСдовния Git, Ρ‚Π°ΠΊΠ° ΠΈ замяна Π½Π° Git ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π²Π°Ρ‡Π° Π½Π° сливания, Π·Π° Π΄Π° сС Ρ€Π°Π·ΡˆΠΈΡ€ΡΡ‚ Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΠΈΡ‚Π΅ Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ ΠΊΠ°Ρ‚ΠΎ merge, revert, rebase ΠΈ cherry-pick. ΠšΠΎΠ΄ΡŠΡ‚ сС разпространява ΠΏΠΎΠ΄ лицСнзия GPLv3. Π’ Π½ΠΎΠ²Π°Ρ‚Π° вСрсия Π΅ Π΄ΠΎΠ±Π°Π²Π΅Π½Π° ΠΏΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ° Π·Π° Π΅Π·ΠΈΡ†ΠΈ Python, TOML, Scala ΠΈ Typescript, Π° ΡΡŠΡ‰ΠΎ Ρ‚Π°ΠΊΠ° Π΅ ΠΏΡ€ΠΎΠ²Π΅Π΄Π΅Π½Π° оптимизация Π½Π° производитСлността.

По-Π΄ΠΎΠ»Ρƒ Π΅ прСдставСно ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ описаниС Π½Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈΡ‚Π΅, ΠΊΠΎΠΈΡ‚ΠΎ сС Ρ€Π΅ΡˆΠ°Π²Π°Ρ‚ с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° mergiraf:

Π‘ΠΎΡ„Ρ‚ΡƒΠ΅Ρ€ΡŠΡ‚ Π΅ ΡΡ€ΡŠΠΊ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π·Π° ΠΈΠ·ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»Π½ΠΎ слоТна систСма. Π‘Π»ΠΎΠΆΠ½ΠΈΡ‚Π΅ систСми ΠΈΠΌΠ°Ρ‚ Π΅Π΄Π½ΠΎ ΠΎΠ±Ρ‰ΠΎ свойство β€” Ρ‚Π΅ са Π‘Π›ΠžΠ–ΠΠ˜ β€” ΠΈ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΎΡ‡Π°ΠΊΠ²Π°Ρ‚Π΅, Ρ‡Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ слоТното ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Ρ‰Π΅ възникнС само ΠΏΠΎ сСбС си, случайно. ВмСсто Ρ‚ΠΎΠ²Π° Ρ‚Π΅Π·ΠΈ систСми Π΅Π²ΠΎΠ»ΡŽΠΈΡ€Π°Ρ‚ с Π²Ρ€Π΅ΠΌΠ΅Ρ‚ΠΎ, ΡΡ‚ΡŠΠΏΠΊΠ° ΠΏΠΎ ΡΡ‚ΡŠΠΏΠΊΠ°, ΠΈ всяка мутация сС провСрява Π²Π½ΠΈΠΌΠ°Ρ‚Π΅Π»Π½ΠΎ Π½Π° всСки Π΅Ρ‚Π°ΠΏ. Π—Π° Π΄Π° сС постигнС Ρ‚ΠΎΠ²Π°, са Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΈ Π΄ΠΎΠ±Ρ€Π΅ Π΄Π΅Ρ„ΠΈΠ½ΠΈΡ€Π°Π½Π° структура ΠΈ подходящи инструмСнти. Π•Π²ΠΎΠ»ΡŽΡ†ΠΈΡΡ‚Π° Π½Π° всяка слоТна систСма ΠΌΠΎΠΆΠ΅ Π΄Π° сС Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·ΠΈΡ€Π° ΠΏΠΎΠ΄ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° Π½Π° насочСно Π΄ΡŠΡ€Π²ΠΎ, ΠΊΡŠΠ΄Π΅Ρ‚ΠΎ ΠΊΠΎΡ€Π΅Π½ΡŠΡ‚ прСдставлява ΠΏΡ€Π°Π·Π΅Π½ Π½Π°Π±ΠΎΡ€ ΠΎΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π° всСки възСл β€” с ΠΈΠ·ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π½Π° ΠΊΠΎΡ€Π΅Π½Π° β€” Π΅ Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ ΠΎΡ‚ ΠΏΡ€ΠΈΠ»Π°Π³Π°Π½Π΅ Π½Π° мутация към своя Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π».

Π’ контСкста Π½Π° ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚ΠΈΡ‚Π΅ всСки възСл сС Π½Π°Ρ€ΠΈΡ‡Π° "вСрсия", прСдставляваща ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ Π½Π°Π±ΠΎΡ€ ΠΎΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ Π°Π½Ρ‚ΠΈΡ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Всяка промяна Π² Ρ‚ΠΎΠ·ΠΈ Π½Π°Π±ΠΎΡ€ сС счита Π·Π° мутация, която Ρ„ΠΎΡ€ΠΌΠΈΡ€Π° Ρ€Π΅Π±Ρ€ΠΎ Π² нашия насочСн Π°Ρ†ΠΈΠΊΠ»ΠΈΡ‡Π΅Π½ Π³Ρ€Π°Ρ„. Π’Π΅Π·ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΠΎ ΡΡŠΡ‰Π΅ΡΡ‚Π²ΠΎ са абстрактни; Ρ‚Π΅ Π½Π΅ отразяват Π΄ΠΈΡ€Π΅ΠΊΡ‚Π½ΠΎ Π½Π°Ρ‡ΠΈΠ½ΠΈΡ‚Π΅ Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½ΠΈΡ€Π°Π½Π΅ Π½Π° физичСскитС систСми, Π° ΠΏΠΎ-скоро дСмонстрират ΠΊΠ°ΠΊ Ρ€Π°Π·ΡƒΠΌΠ½ΠΈ Π°Π³Π΅Π½Ρ‚ΠΈ Π²ΡŠΠ·ΠΏΡ€ΠΈΠ΅ΠΌΠ°Ρ‚ полСзността Π½Π° Ρ‚Π΅Π·ΠΈ систСми. Π—Π° Π΄Π° сС ΠΏΡ€Π΅Π²Π΅Π΄Π°Ρ‚ ΠΈΠ΄Π΅ΠΈΡ‚Π΅ Π² ΡΡŠΡ‰Π΅ΡΡ‚Π²ΡƒΠ²Π°Ρ‰ΠΈ Π² рСалния свят Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° сС засучат Ρ€ΡŠΠΊΠ°Π²ΠΈ ΠΈ Π΄Π° сС ΠΏΠΎΡ‚ΠΎΠΏΠΈΠΌ Π² *Π΄ΠΎΡΡ‚Π°Ρ‚ΡŠΡ‡Π½ΠΎ* нискоуровнСвитС Π΄Π΅Ρ‚Π°ΠΉΠ»ΠΈ, Π½Π° Π΅Π·ΠΈΠΊ, Π½Π° ΠΊΠΎΠΉΡ‚ΠΎ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΈΠ·Ρ€Π°Π·ΠΈΠΌ ΠΈ обясним ΠΊΠ°ΠΊ Ρ‚ΠΎΡ‡Π½ΠΎ всичко Ρ€Π°Π±ΠΎΡ‚ΠΈ. Π’ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°Ρ‚Π° Π½Π° софтуСр Ρ‚Π΅Π·ΠΈ нискоуровнСви Π΄Π΅Ρ‚Π°ΠΉΠ»ΠΈ ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ са прСдставСни ΠΎΡ‚ ΠΈΠ·Ρ…ΠΎΠ΄Π΅Π½ ΠΊΠΎΠ΄.

Π—Π° Π΄Π° Π΄ΠΎΠ²Π΅Π΄Π°Ρ‚ изходния ΠΊΠΎΠ΄ Π΄ΠΎ ΡΡŠΡΡ‚ΠΎΡΠ½ΠΈΠ΅, изразяващо ΠΆΠ΅Π»Π°Π½ΠΎΡ‚ΠΎ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅, ΠΈ Π΄Π° Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΈΡ€Π°Ρ‚ ΠΊΠ°ΠΊ са стигнали Π΄ΠΎ Π½Π΅Π³ΠΎ, програмиститС прСдставят своята Ρ€Π°Π±ΠΎΡ‚Π° Π² Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΈ Π½Π° snapshot ΠΈ changeset. Snapshot прСдставлява ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ ΡΡŠΡΡ‚ΠΎΡΠ½ΠΈΠ΅ Π½Π° ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π° с всички нискоуровнСви Π΄Π΅Ρ‚Π°ΠΉΠ»ΠΈ, Π΄ΠΎΠΊΠ°Ρ‚ΠΎ changeset ΠΎΠ·Π½Π°Ρ‡Π°Π²Π° ΠΏΡ€Π΅Ρ…ΠΎΠ΄ ΠΌΠ΅ΠΆΠ΄Ρƒ snapshot-ΠΈΡ‚Π΅. ОбикновСно snapshot-ΠΈΡ‚Π΅ сС Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°Ρ‚ ΠΎΡ‚ ΠΈΠ½Π΄ΠΈΠ²ΠΈΠ΄ΡƒΠ°Π»Π½ΠΈ changeset-ΠΎΠ²Π΅ спрямо Ρ‚Π΅Ρ…Π½ΠΈΡ‚Π΅ родитСлски, ΠΏΠΎΡ€Π°Π΄ΠΈ ΠΊΠΎΠ΅Ρ‚ΠΎ Ρ‚Π΅Π·ΠΈ snapshot-ΠΎΠ²Π΅ ΠΏΠΎΡ‡Ρ‚ΠΈ Π²ΠΈΠ½Π°Π³ΠΈ са ΠΌΠ°Ρ€ΠΊΠΈΡ€Π°Π½ΠΈ с дСйствията Π½Π° changeset-ΠΈΡ‚Π΅, ΠΊΠΎΠΈΡ‚ΠΎ Π³ΠΈ ΡΡŠΠ·Π΄Π°Π²Π°Ρ‚, ΠΈ Π·Π°Ρ‚ΠΎΠ²Π° Ρ‚Π΅Π·ΠΈ Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΈ чСсто сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ взаимозамСняСмо.

Понякога ΡΡŠΡ‰Π΅ΡΡ‚Π²ΡƒΠ²Π°Ρ‚ снимки, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈ Π² Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ Π½Π° няколко ΠΏΡ€Π΅Ρ…ΠΎΠ΄Π° β€” сливанС Π½Π° ΠΊΠΎΠΌΠΈΡ‚ΠΈ. Π’Π΅ са Ρ‚Ρ€ΡƒΠ΄Π½ΠΈ Π·Π° Ρ€Π°Π±ΠΎΡ‚Π°, Π·Π°Ρ‚ΠΎΠ²Π° ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ сС избягват. Π‘ΡŠΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΈΡ‚Π΅ систСми Π·Π° ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ» Π½Π° вСрсиитС с ΠΎΡ‚Π²ΠΎΡ€Π΅Π½ ΠΊΠΎΠ΄, ΠΊΠ°Ρ‚ΠΎ Git, ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Ρ‚ доста основни Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΠΈ Π·Π° ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° Ρ€Π°Π±ΠΎΡ‚Π½ΠΈΡ‚Π΅ ΠΏΠΎΡ‚ΠΎΡ†ΠΈ Π½Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°Ρ‚Π°. Π’Π΅ позволяват Π½Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΡ†ΠΈΡ‚Π΅ Π΄Π° ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΈΡ€Π°Ρ‚ снимкитС ΠΏΠΎΠ΄ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° Π½Π° насочСни Π°Ρ†ΠΈΠΊΠ»ΠΈΡ‡Π½ΠΈ Π³Ρ€Π°Ρ„ΠΎΠ²Π΅, Π΄Π° Π³ΠΈ Π°Π½ΠΎΡ‚ΠΈΡ€Π°Ρ‚ с ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈ ΠΈ ΠΏΡ€ΠΈ нСобходимост Π΄Π° промСнят тяхната послСдоватСлност.

Π’Π°Π·ΠΈ функционалност позволява Π½Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΡ†ΠΈΡ‚Π΅ Π΄Π° ΠΏΠΈΡˆΠ°Ρ‚ сСмантично Π·Π½Π°Ρ‡ΠΈΠΌΠ° история Π½Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°, ΠΊΠΎΠ΅Ρ‚ΠΎ Π΅ Ρ€Π΅ΡˆΠ°Π²Π°Ρ‰ΠΎ Π·Π° отстраняванС Π½Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ ΠΈ ΠΎΡ‚Π³ΠΎΠ²ΠΎΡ€ΠΈ Π½Π° Π²ΡŠΠΏΡ€ΠΎΡΠΈ ΠΊΠ°Ρ‚ΠΎ β€žΠ—Π°Ρ‰ΠΎ бСшС въвСдСн Ρ‚ΠΎΠ·ΠΈ нискоуровнСвСн Π΄Π΅Ρ‚Π°ΠΉΠ» (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π°)?β€œ, β€žΠšΠΎΠ»ΠΊΠΎ ΠΏΡ€ΠΎΡ†Π΅Π½Ρ‚Π° Π΅ моят принос Π² Ρ‚ΠΎΠ·ΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚?β€œ, β€žΠšΠΎΠ³ΠΎ Ρ…Π°ΠΊΠ½Π°Ρ…Π° внСдряванията Π½Π° Π±Π΅ΠΊΠ΄ΠΎΡ€ ΠΈ ΠΊΠΎΠ³Π°?β€œ, β€žΠšΠ°ΠΊΠ²ΠΎ нискоуровнСво ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ счупи Ρ‚Π°Π·ΠΈ функция (Π²ΡŠΠΏΡ€Π΅ΠΊΠΈ Ρ‡Π΅ Π½Π΅ Π±ΠΈ трябвало Π΄Π° Π΅ Ρ‚Π°ΠΊΠ°, Π½ΠΈΠ΅ всичко ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ…ΠΌΠ΅!?)"

БистСмитС Π·Π° ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ» Π½Π° вСрсиитС Π΄ΠΎΠΏΡŠΠ»Π²Π°Ρ‚ концСпцията Π·Π° ΠΊΠ»ΠΎΠ½ΠΎΠ²Π΅ β€” ниско Π½ΠΈΠ²ΠΎ понятиС, ΠΊΠΎΠ΅Ρ‚ΠΎ просто ΠΎΠ·Π½Π°Ρ‡Π°Π²Π° Π½Π΅ΠΏΡ€Π΅ΠΊΡŠΡΠ½Π°Ρ‚ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ ΠΎΡ‚ историята Π½Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°, сСмантично Π·Π½Π°Ρ‡ΠΈΠΌ Π·Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°. ОбикновСно ΠΊΠ»ΠΎΠ½ΠΎΠ²Π΅Ρ‚Π΅ сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ Π·Π° ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Π° рСализация Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠ°Ρ‚ΠΎ понякога сС ΡΡŠΠ·Π΄Π°Π²Π°Ρ‚ няколко ΠΊΠ»ΠΎΠ½Π° Π·Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ ΠΊΠ°Π½Π΄ΠΈΠ΄Π°Ρ‚ΠΈ Π·Π° рСализация Π½Π° Π΅Π΄Π½Π° ΠΈ ΡΡŠΡ‰Π° функция. Използвайки Ρ€Π°Π±ΠΎΡ‚Π½ΠΈ ΠΏΠΎΡ‚ΠΎΡ†ΠΈ с ΠΊΠ»ΠΎΠ½ΠΎΠ²Π΅ (ΠΊΠΎΠ΅Ρ‚ΠΎ Π²ΡΡŠΡ‰Π½ΠΎΡΡ‚ Π΅ мСйнстрийм ΠΈ стандарт Π² Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°Ρ‚Π°, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° сС навсякъдС), всСки ΠΎΡ‚Π΄Π΅Π»Π΅Π½ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΌΠΎΠΆΠ΅ Π΅Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎ Π΄Π° управлява ΠΌΠ½ΠΎΠ³ΠΎΠ±Ρ€ΠΎΠΉΠ½ΠΈ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Π½ΠΈ ΠΊΠ»ΠΎΠ½ΠΎΠ²Π΅ Π½Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°, всСки ΠΎΡ‚ ΠΊΠΎΠΈΡ‚ΠΎ сС Ρ€Π°Π·Π»ΠΈΡ‡Π°Π²Π° ΠΏΠΎ стСпСн Π½Π° готовност ΠΈΠ»ΠΈ качСство. Π’ΠΎΠ²Π° позволява Π½Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΡ†ΠΈΡ‚Π΅ Π΄Π° ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€Π°Ρ‚ Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ΠΈΡ‚Π΅ ΠΎΡ‚ своя Ρ‚Ρ€ΡƒΠ΄ ΠΈ Ρ‡ΡƒΠΆΠ΄Π°Ρ‚Π° Ρ€Π°Π±ΠΎΡ‚Π° Π±Π΅Π· Π΄Π° прСзаписват всичко Π½Π° Ρ€ΡŠΠΊΠ° всСки ΠΏΡŠΡ‚.

ОбикновСно сС създава основСн ΠΊΠ»ΠΎΠ½, прСдставляващ "официалния" ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚, ΠΎΡ‚ ΠΊΠΎΠΉΡ‚ΠΎ сС разклоняват странични ΠΊΠ»ΠΎΠ½ΠΎΠ²Π΅ Π·Π° всяка функция, ΠΊΠΎΠΈΡ‚ΠΎ Ρ€Π΅Π΄ΠΎΠ²Π½ΠΎ (Π² идСалния случай β€” слСд всяко ΠΊΠΎΠΌΠΈΡ‚Π²Π°Π½Π΅) сС синхронизират с основния ΠΊΠ»ΠΎΠ½, ΠΊΠΎΠ΅Ρ‚ΠΎ позволява Π½Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΡ†ΠΈΡ‚Π΅ Π΄Π° работят с послСдната вСрсия Π½Π° ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π° ΠΈ Π² ΡΡŠΡ‰ΠΎΡ‚ΠΎ Π²Ρ€Π΅ΠΌΠ΅ Π΄Π° внСдряват Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π²Π°Ρ‚, ΠΎΡ‚ΠΊΡ€ΠΈΠ²Π°ΠΉΠΊΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ, ΠΏΡ€ΠΎΠΈΠ·Ρ‚ΠΈΡ‡Π°Ρ‰ΠΈ ΠΎΡ‚ дСйствията Π½Π° Π΄Ρ€ΡƒΠ³ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΡ†ΠΈ, ΠΊΠΎΠ»ΠΊΠΎΡ‚ΠΎ сС ΠΌΠΎΠΆΠ΅ ΠΏΠΎ-Ρ€Π°Π½ΠΎ.

ΠŸΡ€ΠΈ ΠΎΠΏΠΈΡ‚ Π·Π° ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€Π°Π½Π΅ Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΎΡ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ snapshot-ΠΎΠ²Π΅ (ΠΊΠΎΠ΅Ρ‚ΠΎ Π΅ просто Π½Π°ΠΌΠΈΡ€Π°Π½Π΅ Π½Π° ΠΎΠ±Ρ‰ ΠΏΡ€Π΅Π΄ΡˆΠ΅ΡΡ‚Π²Π΅Π½ΠΈΠΊ ΠΈ послСдоватСлно ΠΏΡ€ΠΈΠ»Π°Π³Π°Π½Π΅ Π½Π° changeset-ΠΈΡ‚Π΅, ΠΊΠΎΠΈΡ‚ΠΎ Π³ΠΈ ΠΈΠ·Π²Π΅ΠΆΠ΄Π°Ρ‚, Π²ΡŠΡ€Ρ…Ρƒ Π΄Ρ€ΡƒΠ³, Ρ‚Π°Π·ΠΈ опСрация сС Π½Π°Ρ€ΠΈΡ‡Π° rebase, Π΄ΠΎΠΊΠ°Ρ‚ΠΎ сливанСто Π΅ ΠΏΠΎΡ‡Ρ‚ΠΈ ΠΊΠ°Ρ‚ΠΎ rebase, просто структурира Π³Ρ€Π°Ρ„Π° Π½Π° ΠΊΠΎΠΌΠΈΡ‚ΠΈΡ‚Π΅ ΠΏΠΎ Ρ€Π°Π·Π»ΠΈΡ‡Π΅Π½ Π½Π°Ρ‡ΠΈΠ½, Π² Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ Π½Π° ΠΊΠΎΠ΅Ρ‚ΠΎ става Π½Π΅ΡƒΠ΄ΠΎΠ±Π½ΠΎ Π΄Π° сС ΠΌΠ°Π½ΠΈΠΏΡƒΠ»ΠΈΡ€Π° с тях, Π·Π°Ρ‚ΠΎΠ²Π° сС стараят Π΄Π° сС ΠΎΡ‚ΠΊΠ°ΠΆΠ°Ρ‚ ΠΎΡ‚ сливания Π² ΠΏΠΎΠ»Π·Π° Π½Π° rebase-ΠΎΠ²Π΅) Π²ΡŠΠ·Π½ΠΈΠΊΠ²Π°Ρ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ. Π‘ΡŠΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΈΡ‚Π΅ систСми Π·Π° ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ» Π½Π° вСрсиитС (VCS) ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ Π²ΡŠΡ‚Ρ€Π΅ΡˆΠ½ΠΈ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΈ Π·Π° ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€Π°Π½Π΅ Π½Π° измСнСния, ΠΊΠΎΠΈΡ‚ΠΎ просто Ρ€Π°Π·Π±ΠΈΠ²Π°Ρ‚ Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅Ρ‚Π΅ Π½Π° ΠΎΡ‚Π΄Π΅Π»Π½ΠΈ Ρ€Π΅Π΄ΠΎΠ²Π΅, Ρ€Π°Π·Π³Π»Π΅ΠΆΠ΄Π°Ρ‚ всСки Ρ€Π΅Π΄ ΠΊΠ°Ρ‚ΠΎ символ, Π° Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅Ρ‚Π΅ β€” ΠΊΠ°Ρ‚ΠΎ послСдоватСлности ΠΎΡ‚ тях, ΠΈ слСд Ρ‚ΠΎΠ²Π° ΠΏΡ€ΠΈΠ»Π°Π³Π°Ρ‚ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΈ Π·Π° ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€Π°Π½Π΅Ρ‚ΠΎ ΠΈΠΌ, ΠΏΡ€ΠΎΠΈΠ·Ρ…ΠΎΠΆΠ΄Π°Ρ‰ΠΈ ΠΎΡ‚ Π±ΠΈΠΎΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΠΊΠ°Ρ‚Π°.

Π—Π° съТалСниС, Ρ‚ΠΎΠ²Π° построчно прСдставянС Π½Π° изходния ΠΊΠΎΠ΄ Π½Π΅ отразява ΡΡŠΠ΄ΡŠΡ€ΠΆΠ°Π½ΠΈΠ΅Ρ‚ΠΎ ΠΌΡƒ. ЕдинствСното ΠΌΡƒ прСдимство Π΅, Ρ‡Π΅ Π΅ прост ΠΈ унивСрсалСн. ΠΠ΅ΡΡŠΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΠΈΡΡ‚Π° водят Π΄ΠΎ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΠΈ, причинявайки постоянно Π³Π»Π°Π²ΠΎΠ±ΠΎΠ»ΠΈΠ΅ Π·Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΡ†ΠΈΡ‚Π΅. Π Π°Π·Ρ€Π΅ΡˆΠ°Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΠΈ изисква ΠΎΡ‚ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° Π²Π½ΠΈΠΌΠ°Ρ‚Π΅Π»Π½ΠΎ Π΄Π° ΠΏΡ€ΠΎΡƒΡ‡ΠΈ ΠΈ Π΄Π²Π΅Ρ‚Π΅ вСрсии Π½Π° ΠΊΠΎΠ΄Π°, ΠΈ Ρ‚ΠΎ Π½Π΅ само Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅, ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π΅Π½ΠΈ ΠΎΡ‚ построчния Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΡŠΠΌ Π·Π° сравнСниС ΠΊΠ°Ρ‚ΠΎ β€žΠΏΡ€ΠΎΠΌΠ΅Π½Π΅Π½ΠΈβ€œ ΠΈΠ»ΠΈ β€žΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΡƒΠ²Π°Ρ‰ΠΈβ€œ, Π½ΠΎ ΠΌΠΎΠΆΠ΅ Π±ΠΈ ΠΈ цСлия ΠΏΡ€ΠΎΠ΅ΠΊΡ‚.

Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΡŠΡ‚ трябва Π΄Π° Ρ€Π°Π·Π±Π΅Ρ€Π΅ ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΡ‚Π΅, Ρ€ΡŠΡ‡Π½ΠΎ Π΄Π° напишС ΠΎΠ±Π΅Π΄ΠΈΠ½Π΅Π½ ΠΊΠΎΠ΄ ΠΈ Π΄Π° отстрани всякакви Π½Π΅ΡΡŠΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΠΈΡ. ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠΈΡ‚Π΅ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»Π½ΠΎ сС ΡƒΠ²Π΅Π»ΠΈΡ‡Π°Π²Π°Ρ‚, ΠΊΠΎΠ³Π°Ρ‚ΠΎ пострСчният инструмСнт Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»Π½ΠΎ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€Π° ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΡ‚Π΅, ΠΊΠΎΠ΅Ρ‚ΠΎ чСсто сС случва ΠΏΡ€ΠΈ Π³ΠΎΠ»Π΅ΠΌΠΈ измСнСния, Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»Π½ΠΎ Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»Π½ΠΈ, ΠΊΠ°Ρ‚ΠΎ Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€Π°Π½Π΅Ρ‚ΠΎ Π½Π° ΠΊΠΎΠ΄Π°. Ако послСдващи ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ Π½Π΅ ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° Π±ΡŠΠ΄Π°Ρ‚ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈ към Ρ€ΡŠΡ‡Π½ΠΎ обСдинСния ΠΊΠΎΠ΄, ситуацията става пълСн ΠΊΠΎΡˆΠΌΠ°Ρ€. Π’ΡŠΠΏΡ€Π΅ΠΊΠΈ уТаснитС случаи, Π² ΠΏΠΎΠ²Π΅Ρ‡Π΅Ρ‚ΠΎ случаи построчният Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΡŠΠΌ Ρ€Π°Π±ΠΎΡ‚ΠΈ, особСно Π°ΠΊΠΎ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΡ†ΠΈΡ‚Π΅ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎ сС ΠΎΠΏΠΈΡ‚Π²Π°Ρ‚ Π΄Π° Π½Π΅ ΡΡŠΠ·Π΄Π°Π²Π°Ρ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ. Π•Π΄ΠΈΠ½ ΠΎΡ‚ Π½Π°Ρ‡ΠΈΠ½ΠΈΡ‚Π΅ Π·Π° ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡ€Π°Π½Π΅ Π½Π° ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ Π΅ Π·Π°Π΄ΡŠΠ»ΠΆΠΈΡ‚Π΅Π»Π½ΠΎΡ‚ΠΎ изискванС Π·Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° ΠΈΠ·Ρ…ΠΎΠ΄Π½ΠΈΡ†ΠΈΡ‚Π΅ с инструмСнти Π·Π° каноникализация, ΠΊΠ°Ρ‚ΠΎ black.

Π Π°Π·Π±ΠΈΡ€Π° сС, ΠΏΡ€Π°Π²ΠΈΠ»Π½ΠΎΡ‚ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π½Π° уТасни случаи (ΠΈ ΠΈΠ·ΠΎΠ±Ρ‰ΠΎ, Π½Π΅ само Π·Π° тях, построчният Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΡŠΠΌ Π΅ хСвристика, която ΠΌΠΎΠΆΠ΅ Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»Π½ΠΎ Π΄Π° Π΄ΠΎΠ²Π΅Π΄Π΅ Π΄ΠΎ Π½Π΅Ρ€Π°Π±ΠΎΡ‚Π΅Ρ‰ ΠΊΠΎΠ΄; Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π΅Π΄ΠΈΠ½ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ Π΅ ΠΏΡ€Π΅ΠΈΠΌΠ΅Π½ΡƒΠ²Π°Π» ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π°, Π° Π΄Ρ€ΡƒΠ³ Π΅ написал Π½ΠΎΠ² ΠΊΠΎΠ΄, ΠΊΠΎΠΉΡ‚ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Ρ‚Π°Π·ΠΈ ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π°, ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ Π½Π° сливанС/ΠΏΡ€Π΅Π±Π°Π·ΠΈΡ€Π°Π½Π΅ няма Π΄Π° ΠΈΠΌΠ°, Π½ΠΎ Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ΡŠΡ‚ Ρ‰Π΅ станС Π½Π΅Ρ€Π°Π±ΠΎΡ‚Π΅Ρ‰) Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° правилния Π²ΡŠΡ‚Ρ€Π΅ΡˆΠ΅Π½ ΠΌΠΎΠ΄Π΅Π».

Π’ΡŠΠΏΡ€Π΅ΠΊΠΈ Ρ‡Π΅ изслСдванията Π² Ρ‚Π°Π·ΠΈ област ΠΏΡ€ΠΎΠ΄ΡŠΠ»ΠΆΠ°Π²Π°Ρ‚ Π²Π΅Ρ‡Π΅ ΠΎΠΊΠΎΠ»ΠΎ 30 Π³ΠΎΠ΄ΠΈΠ½ΠΈ ΠΈ Π΄ΠΎΠ²Π΅Π΄ΠΎΡ…Π° Π΄ΠΎ ΡΡŠΠ·Π΄Π°Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° няколко ΠΏΡ€ΠΎΠΏΡ€ΠΈΠ΅Ρ‚Π°Ρ€Π½ΠΈ Ρ‚ΡŠΡ€Π³ΠΎΠ²ΡΠΊΠΈ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π°, Ρ‚Π΅Π·ΠΈ изслСдвания доскоро Π½Π΅ бяха ΠΏΡ€Π΅Π²ΡŠΡ€Π½Π°Ρ‚ΠΈ Π² практичСски ΠΏΡ€ΠΈΠ»ΠΎΠΆΠΈΠΌΠΈ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚ΠΈ с ΠΎΡ‚Π²ΠΎΡ€Π΅Π½ ΠΊΠΎΠ΄. ΠžΡΠ½ΠΎΠ²Π½Π°Ρ‚Π° част ΠΎΡ‚ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡΡ‚Π° с ΠΎΡ‚Π²ΠΎΡ€Π΅Π½ ΠΊΠΎΠ΄ Π·Π°ΠΏΠΎΡ‡Π½Π° Π΄Π° сС Ρ€Π°Π·Π²ΠΈΠ²Π° Π² Π½Π°Ρ‡Π°Π»ΠΎΡ‚ΠΎ Π½Π° 2010-Ρ‚Π΅ Π³ΠΎΠ΄ΠΈΠ½ΠΈ ΠΈ бСшС изцяло фокусирана Π²ΡŠΡ€Ρ…Ρƒ Π΅Π·ΠΈΠΊΠ° Java.

Най-Π·Π½Π°Ρ‡ΠΈΠΌΠ°Ρ‚Π° свободна рСализация ΠΎΡ‚ Ρ‚ΠΎΠ·ΠΈ ΠΏΠ΅Ρ€ΠΈΠΎΠ΄, GumTree, Π΅ създадСна ΠΎΡ‚ изслСдоватСл с Π°ΠΊΠ°Π΄Π΅ΠΌΠΈΡ‡Π΅Π½ Ρ„ΠΎΠ½, написана Π½Π° Java ΠΈ ΠΈΠΌΠ° своСто абстрактно Π²ΡŠΡ‚Ρ€Π΅ΡˆΠ½ΠΎ прСдставянС, ΠΏΡ€Π΅Π΄ΡˆΠ΅ΡΡ‚Π²Π°Ρ‰ΠΎ treesitter. Вя Ρ€Π°Π·ΠΏΠΎΠ»Π°Π³Π° с Π±Π΅ΠΊΠ΅Π½Π΄ΠΈ ΠΊΠ°ΠΊΡ‚ΠΎ Π½Π° Π±Π°Π·Π°Ρ‚Π° Π½Π° treesitter, Ρ‚Π°ΠΊΠ° ΠΈ Π½Π° Π΄Ρ€ΡƒΠ³ΠΈ инструмСнти Π·Π° парсинг Π½Π° ΠΈΠ·Ρ…ΠΎΠ΄Π΅Π½ ΠΊΠΎΠ΄ Π² абстрактни прСдставяния. Π’Π°Π·ΠΈ систСма ΠΌΠΎΠΆΠ΅ само Π΄Π° Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π° (ΠΏΠΎΠ΄ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° Π½Π° тСкстов ΠΆΡƒΡ€Π½Π°Π» Π½Π° ΡΡŠΠ±ΠΈΡ‚ΠΈΡ, ΠΊΠ°ΠΊΡ‚ΠΎ ΠΈ Π΄Π° прСдоставя API, ΠΊΠΎΠ΅Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС ΠΈΠ·Π²ΠΈΠΊΠ°Π½ΠΎ ΠΎΡ‚ всСки ЯП, ΠΊΠΎΠΉΡ‚ΠΎ ΠΈΠΌΠ° Π±ΠΈΠ½Π΄ΠΈΠ½Π³ΠΈ Π·Π° Java) ΠΈ Π΄Π° Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·ΠΈΡ€Π° ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΡ‚Π΅. Π’ΡŠΠΏΡ€Π΅ΠΊΠΈ Ρ‚ΠΎΠ²Π°, тя Π½Π΅ Π΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠΈΠΌΠ° Π΄ΠΈΡ€Π΅ΠΊΡ‚Π½ΠΎ Π·Π° сливанСто Π½Π° ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ ΠΈΠ»ΠΈ Π·Π° ΠΏΡ€Π΅Π³Π»Π΅Π΄ Π½Π° Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°Π½ΠΈΡ‚Π΅ ΠΎΡ‚ нСя diff-Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ (Π²ΡŠΠΏΡ€Π΅ΠΊΠΈ Ρ‡Π΅ вСроятно Π΅ възмоТно Π΄Π° сС Ρ€Π΅Π°Π»ΠΈΠ·ΠΈΡ€Π° Π·Π°Ρ€Π΅ΠΆΠ΄Π°Π½Π΅ Π½Π° diff-ΠΎΠ²Π΅ Ρ‡Ρ€Π΅Π· API).

По-ΠΌΠ»Π°Π΄Π°Ρ‚Π° ΠΈ ΠΏΠΎ-подходяща Π·Π° практичСско ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ рСализация difftastic Π΅ написана Π½Π° Rust, Π±Π°Π·ΠΈΡ€Π°Π½Π° Π½Π° treesitter ΠΈ сС фокусира Π²ΡŠΡ€Ρ…Ρƒ Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°Π½Π΅Ρ‚ΠΎ Π½Π° подсвСтСни diff-ΠΎΠ²Π΅ Π² ΠΊΠΎΠ½Π·ΠΎΠ»Π°Ρ‚Π°. Π’Π°Π·ΠΈ систСма ΡΡŠΡ‰ΠΎ Ρ‚Π°ΠΊΠ° Π΅ насочСна към визуализация Π½Π° diff-ΠΎΠ²Π΅ ΠΈ ΠΈΠ·ΠΎΠ±Ρ‰ΠΎ Π½Π΅ си поставя Π·Π° Ρ†Π΅Π» сливанСто Π½Π° ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ ΠΈΠ»ΠΈ ΠΏΡ€ΠΈΠ»Π°Π³Π°Π½Π΅Ρ‚ΠΎ Π½Π° ΠΏΠ°Ρ‡ΠΎΠ²Π΅.

БъвсСм наскоро сС появи ΠΈ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎ сС Ρ€Π°Π·Π²ΠΈΠ²Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΡŠΡ‚ mergiraf. Π’ΠΎΠ·ΠΈ инструмСнт, написан Π½Π° Rust (Π·Π°Π΅Ρ‚ Π΅ 21 MiB!), ΡΡŠΡ‰ΠΎ Π΅ Π±Π°Π·ΠΈΡ€Π°Π½ Π½Π° treesitter, ΠΊΠΎΠΉΡ‚ΠΎ Π²Π΅Ρ‡Π΅ сС Π΅ ΡƒΡ‚Π²ΡŠΡ€Π΄ΠΈΠ» ΠΊΠ°Ρ‚ΠΎ стандарт Π·Π° парсСри Π½Π° контСкстно-свободни Π³Ρ€Π°ΠΌΠ°Ρ‚ΠΈΠΊΠΈ Π² инструмСнтитС Π·Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°, ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ Π½Π° LLVM Π·Π° оптимизация Π½Π° нискоуровнСвитС прСдставяния Π½Π° инструкции. Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ ΠΊΠΎΠ½ΠΊΡƒΡ€Π΅Π½Ρ‚ΠΈΡ‚Π΅ си, mergiraf прСдоставя Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π΅ Π·Π° Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°Π½Π΅ Π½Π° diff-ΠΎΠ²Π΅, Π° Π·Π° Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΡ‡Π½ΠΎ Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π²Π°Π½Π΅ Π½Π° ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΠΈ ΠΏΡ€ΠΈ сливанС. Под ΠΊΠ°ΠΏΠ°ΠΊΠ°, mergiraf ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° рСализация Π½Π° Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΡŠΠΌ, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ Π² GumTree, Π·Π° Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°Π½Π΅ Π½Π° ΠΏΠ°Ρ‡ΠΎΠ²Π΅ ΠΈ рСализация Π½Π° Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΡŠΠΌ, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ Π² spork, Π°Π΄Π°ΠΏΡ‚ΠΈΡ€Π°Π½ΠΈ към структури treesitter, Π·Π° ΠΏΡ€ΠΈΠ»Π°Π³Π°Π½Π΅.

БСриализация Π½Π° ΠΏΠ°Ρ‡ΠΎΠ²Π΅ Π² Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅, ΠΊΠΎΠΈΡ‚ΠΎ ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° Π±ΡŠΠ΄Π°Ρ‚ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈ ΠΏΠΎ-късно, Π·Π° съТалСниС Π½Π΅ Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΠΈΡ€Π°Π½Π° (Π½ΠΎ Π΅ напълно вСроятно Π΄Π° бъдС Ρ€Π΅Π°Π»ΠΈΠ·ΠΈΡ€Π°Π½Π° Ρ‡Ρ€Π΅Π· парсинг Π½Π° Π»ΠΎΠ³ΠΎΠ²Π΅Ρ‚Π΅ Π½Π° ΡΡŠΠ±ΠΈΡ‚ΠΈΡ, Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°Π½ΠΈ ΠΎΡ‚ GumTree). Π”Ρ€ΡƒΠ³ пСрспСктивСн Π½Π°Ρ‡ΠΈΠ½ Π·Π° ΠΏΡ€ΠΈΠ»Π°Π³Π°Π½Π΅ Π½Π° различия ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС Ρ‡Ρ€Π΅Π· функционалността Π·Π° Ρ€Π΅Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ½Π³ Π½Π° LSP-ΡΡŠΡ€Π²ΡŠΡ€ΠΈΡ‚Π΅, ΠΊΠΎΠ΅Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΏΠΎΠΌΠΎΠ³Π½Π΅ Π·Π° ΠΎΡ‚ΠΊΡ€ΠΈΠ²Π°Π½Π΅ Π½Π° ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΠΈ Π½Π° Π½ΠΈΠ²ΠΎ цял ΠΏΡ€ΠΎΠ΅ΠΊΡ‚. Визуализацията сС ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ° само Π·Π° ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΠΈ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π½Π° Ρ€Π°Π±ΠΎΡ‚Π°: ΠΎΠ±Ρ‰ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π» "base.py" (ΠΎΡ‚ΡΡ‚ΡŠΠΏΠΊΠΈ Ρ‚Π°Π±ΠΎΠ²Π΅, излишСн Ρ€Π΅Π΄ Π² Π½Π°Ρ‡Π°Π»ΠΎΡ‚ΠΎ) foo = 1 def main(): print(foo + 2 + 3) "a.py" (ΠΎΡ‚ΡΡ‚ΡŠΠΏΠΊΠΈΡ‚Π΅ всС ΠΎΡ‰Π΅ са Ρ‚Π°Π±ΠΎΠ²Π΅, 2 излишни Ρ€Π΅Π΄Π° Π² Π½Π°Ρ‡Π°Π»ΠΎΡ‚ΠΎ вмСсто Π΅Π΄ΠΈΠ½, Π·Π° ΠΎΡ‚Π»Π°Π΄ΡŠΡ‡Π½ΠΈΡ ΠΏΠ΅Ρ‡Π°Ρ‚ Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π° icecream, Π΄ΠΎΠ±Π°Π²Π΅Π½ Π΅ клас "baz": from icecream import ic foo = 1 def main(): ic(foo + 2 + 3) клас baz: def __init__(self): """baz""" "b.py" (ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π°Ρ‚Π° "foo" Π΅ ΠΏΡ€Π΅ΠΈΠΌΠ΅Π½ΡƒΠ²Π°Π½Π° Π½Π° "bar", ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π΅Π½Π° с "black" слСд ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΡ‚Π΅, Π² Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ ΠΎΡ‚ΡΡ‚ΡŠΠΏΠΊΠΈΡ‚Π΅ са с ΠΏΡ€Π°Π·Π½ΠΈ символи ΠΈ ΠΈΠ·Π»ΠΈΡˆΠ½ΠΈΡ‚Π΅ Ρ€Π΅Π΄ΠΎΠ²Π΅ са изрязани): bar = 1 def main(): print(bar + 2 + 3) Π’ΠΈΠ·ΠΎΠ² .\/mergiraf merge .\/base.py .\/a.py .\/b.py -x a.py -y b.py -s base.py -o .\/res.py Π΄Π°Π²Π° слСдния Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ from icecream import ic bar = 1 def main(): ic(bar + 2 + 3) клас baz: def __init__(self): """baz""" (Π·Π° ΠΎΡ‚Π»Π°Π΄ΡŠΡ‡Π½ΠΈΡ ΠΏΠ΅Ρ‡Π°Ρ‚ Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π° "icecream", ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π°Ρ‚Π° "foo" Π΅ ΠΏΡ€Π΅ΠΈΠΌΠ΅Π½ΡƒΠ²Π°Π½Π° Π½Π° "bar", ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π΅Π½Π° с "black" слСд ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΡ‚Π΅, Π² Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ ΠΎΡ‚ΡΡ‚ΡŠΠΏΠΊΠΈΡ‚Π΅ са с ΠΏΡ€Π°Π·Π½ΠΈ символи ΠΈ ΠΈΠ·Π»ΠΈΡˆΠ½ΠΈΡ‚Π΅ Ρ€Π΅Π΄ΠΎΠ²Π΅ са изрязани, смСс ΠΎΡ‚ Ρ‚Π°Π±ΠΎΠ²Π΅ ΠΈ ΠΏΡ€Π°Π·Π½ΠΈ символи Π·Π° ΠΎΡ‚ΡΡ‚ΡŠΠΏ, Π½ΠΎ ΠΎΠ΄ΠΎΠ±Ρ€Π΅Π½ Π²ΠΈΠ΄).

Π’ΡƒΠΊ сС Π²ΠΈΠΆΠ΄Π° Π½Π΅Π΄ΠΎΡΡ‚Π°Ρ‚ΡŠΠΊ Π½Π° инструмСнта. Π‘Ρ‚ΠΈΠ»ΡŠΡ‚ Π½Π° Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ сС ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π° Π² Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ " .editorconfig ", ΠΈ Π³Π»ΠΎΠ±Π°Π»Π½ΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ Π² стилa, ΠΊΠ°Ρ‚ΠΎ смяна Π½Π° Ρ‚Π°Π±ΠΎΠ²Π΅ с ΠΏΡ€Π°Π·Π½ΠΈ символи ΠΈ ΠΏΡ€ΠΈΠ΅ΠΌΠ°Π½Π΅ Π½Π° стилa Π½Π° black-Π°, ΠΊΠ°ΠΊΡ‚ΠΎ Π΅ Π½Π°ΠΏΡ€Π°Π²Π΅Π½ΠΎ Π² "b.py", ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ ΡΡŠΠΏΡ€ΠΎΠ²ΠΎΠΆΠ΄Π°Ρ‚ ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ Π² " .editorconfig ". Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»Π½ΠΎ, Π·Π° ΠΏΠΎ-Ρ‚ΠΎΡ‡Π½ΠΎ ΠΏΡ€ΠΈΠ»Π°Π³Π°Π½Π΅ Π½Π° ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΈ ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚ΡŠΡ‚ трябва Π΄Π° ΠΈΠΌΠ° концСпция Π·Π° Π³Π»ΠΎΠ±Π°Π»Π΅Π½ стил "ΠΏΠΎ ΠΏΠΎΠ΄Ρ€Π°Π·Π±ΠΈΡ€Π°Π½Π΅" ΠΈ Π΄Π° ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠ·Π²Π»Π΅Ρ‡Π΅ настройки ΠΎΡ‚ " .editorconfig ".

Π˜Π·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ: opennet.ru

ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС с Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ πŸ”₯ ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС с Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ | ProHoster