mergiraf — AST-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ инструмСнт для трёхстороннСго слияния Π² Git

ΠžΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½ Ρ€Π΅Π»ΠΈΠ· ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° mergiraf 0.4, Ρ€Π°Π·Π²ΠΈΠ²Π°ΡŽΡ‰Π΅Π³ΠΎ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ для Git с Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ возмоТности трёхстороннСго слияния. Mergiraf ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Π²ΠΈΠ΄ΠΎΠ² ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΠΎΠ² ΠΏΡ€ΠΈ слиянии ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… языков программирования ΠΈ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΎΠ² Ρ„Π°ΠΉΠ»ΠΎΠ². Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΊΠ°ΠΊ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ² mergiraf для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΠΎΠ², Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‰ΠΈΡ… ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ со ΡˆΡ‚Π°Ρ‚Π½Ρ‹ΠΌ Git, Ρ‚Π°ΠΊ ΠΈ Π·Π°ΠΌΠ΅Π½Π° Π² Git ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° слияний для Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ возмоТностСй Ρ‚Π°ΠΊΠΈΡ… ΠΊΠΎΠΌΠ°Π½Π΄, ΠΊΠ°ΠΊ merge, revert, rebase ΠΈ cherry-pick. Код распространяСтся ΠΏΠΎΠ΄ Π»ΠΈΡ†Π΅Π½Π·ΠΈΠ΅ΠΉ GPLv3. Π’ Π½ΠΎΠ²ΠΎΠΉ вСрсии Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° языков Python, TOML, Scala ΠΈ Typescript, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€ΠΎΠ²Π΅Π΄Π΅Π½Π° оптимизация ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ.

НиТС прСдставлСно ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΠ΅ описаниС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ, Ρ€Π΅ΡˆΠ°Π΅ΠΌΡ‹Ρ… ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ mergiraf:

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ΅ обСспСчСниС являСтся ярким ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΌ Ρ‡Ρ€Π΅Π·Π²Ρ‹Ρ‡Π°ΠΉΠ½ΠΎ слоТной систСмы. Π‘Π»ΠΎΠΆΠ½Ρ‹Π΅ систСмы ΠΈΠΌΠ΅ΡŽΡ‚ ΠΎΠ΄Π½ΠΎ ΠΎΠ±Ρ‰Π΅Π΅ свойство — ΠΎΠ½ΠΈ Π‘Π›ΠžΠ–ΠΠ« — ΠΈ Π²Ρ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΎΠΆΠΈΠ΄Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎΠ΅ слоТноС ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ½Π΅Ρ‚ само собой, случайно. ВмСсто этого эти систСмы ΡΠ²ΠΎΠ»ΡŽΡ†ΠΈΠΎΠ½ΠΈΡ€ΡƒΡŽΡ‚ со Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ, шаг Π·Π° шагом, ΠΈ каТдая мутация Ρ‚Ρ‰Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ провСряСтся Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΌ этапС. Для достиТСния этого Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ Ρ…ΠΎΡ€ΠΎΡˆΠΎ опрСдСлённая структура ΠΈ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ инструмСнты. Π­Π²ΠΎΠ»ΡŽΡ†ΠΈΡŽ любой слоТной систСмы ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π² Π²ΠΈΠ΄Π΅ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½Π½ΠΎΠ³ΠΎ Π΄Π΅Ρ€Π΅Π²Π°, Π³Π΄Π΅ ΠΊΠΎΡ€Π΅Π½ΡŒ прСдставляСт собой пустоС мноТСство Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, Π° ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΡƒΠ·Π΅Π» — Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ корня — являСтся Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ примСнСния ΠΌΡƒΡ‚Π°Ρ†ΠΈΠΈ ΠΊ своСму Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŽ.

Π’ контСкстС ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚ΠΎΠ² ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΡƒΠ·Π΅Π» называСтся «Π²Π΅Ρ€ΡΠΈΠ΅ΠΉ», ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π΅ΠΉ собой ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈ Π°Π½Ρ‚ΠΈΡ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. Π›ΡŽΠ±ΠΎΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ этого Π½Π°Π±ΠΎΡ€Π° считаСтся ΠΌΡƒΡ‚Π°Ρ†ΠΈΠ΅ΠΉ, Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΉ Ρ€Π΅Π±Ρ€ΠΎ Π² нашСм Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½Π½ΠΎΠΌ ацикличСском Π³Ρ€Π°Ρ„Π΅. Π­Ρ‚ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΠΎ своСй сути абстрактны; ΠΎΠ½ΠΈ Π½Π΅ ΠΎΡ‚Ρ€Π°ΠΆΠ°ΡŽΡ‚ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ способы функционирования физичСских систСм, Π° скорСС Π΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΡƒΡŽΡ‚, ΠΊΠ°ΠΊ Ρ€Π°Π·ΡƒΠΌΠ½Ρ‹Π΅ Π°Π³Π΅Π½Ρ‚Ρ‹ Π²ΠΎΡΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΡΡ‚ΡŒ этих систСм. Π§Ρ‚ΠΎΠ±Ρ‹ пСрСвСсти ΠΈΠ΄Π΅ΠΈ Π² ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌ ΠΌΠΈΡ€Π΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π·Π°ΡΡƒΡ‡ΠΈΡ‚ΡŒ Ρ€ΡƒΠΊΠ°Π²Π° ΠΈ Π½Ρ‹Ρ€Π½ΡƒΡ‚ΡŒ Π² *достаточно* Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²Ρ‹Π΅ Π΄Π΅Ρ‚Π°Π»ΠΈ, Π½Π° языкС ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Ρ€Π°Π·ΠΈΡ‚ΡŒ ΠΈ ΠΎΠ±ΡŠΡΡΠ½ΠΈΡ‚ΡŒ, ΠΊΠ°ΠΊ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎ всё Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚. Π’ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ ПО эти Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²Ρ‹Π΅ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ прСдставлСны исходным ΠΊΠΎΠ΄ΠΎΠΌ.

Π§Ρ‚ΠΎΠ±Ρ‹ постСпСнно привСсти исходный ΠΊΠΎΠ΄ Π² состояниС, ΠΏΡ€ΠΎΡΠ²Π»ΡΡŽΡ‰Π΅Π΅ Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅, ΠΈ Π·Π°Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ Π΅Π³ΠΎ Ρ‚ΡƒΠ΄Π° ΠΏΡ€ΠΈΠ²Π΅Π»ΠΈ, программисты ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ свою Ρ€Π°Π±ΠΎΡ‚Ρƒ Π² Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Ρ… snapshot-ΠΎΠ² ΠΈ changest-ΠΎΠ². Snapshot прСдставляСт собой ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½ΠΎΠ΅ состояниС ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π° со всСми Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²Ρ‹ΠΌΠΈ дСталями, Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ changeset ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ ΠΌΠ΅ΠΆΠ΄Ρƒ snapshot-Π°ΠΌΠΈ. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ snapshot-Ρ‹ ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°ΡŽΡ‚ΡΡ ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½Ρ‹Ρ… changeset-ΠΎΠ² ΠΊ ΠΈΡ… родитСлям, поэтому эти snapshot-Ρ‹ ΠΏΠΎΡ‡Ρ‚ΠΈ всСгда ΠΌΠ°Ρ€ΠΊΠΈΡ€ΡƒΡŽΡ‚ Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°ΡŽΡ‚ changeset-Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΡ… создали, поэтому эти Ρ‚Π΅Ρ€ΠΌΠΈΠ½Ρ‹ часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ взаимозамСняСмо.

Иногда ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ снимки, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Π΅ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΎΠ² — слияния ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ². Π‘ Π½ΠΈΠΌΠΈ слоТно Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ, поэтому ΠΈΡ… ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΈΠ·Π±Π΅Π³Π°ΡŽΡ‚. Π‘ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ систСмы контроля вСрсий с ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌ исходным ΠΊΠΎΠ΄ΠΎΠΌ, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ Git, ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ вСсьма Π±Π°Π·ΠΎΠ²Ρ‹Π΅ возмоТности для управлСния Ρ€Π°Π±ΠΎΡ‡ΠΈΠΌΠΈ процСссами Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ. Они ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ снимки Π² Π²ΠΈΠ΄Π΅ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½Π½Ρ‹Ρ… ацикличСских Π³Ρ€Π°Ρ„ΠΎΠ², Π°Π½Π½ΠΎΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΡ… коммСнтариями ΠΈ ΠΏΡ€ΠΈ нСобходимости ΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΈΡ… порядок.

Π­Ρ‚Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ позволяСт Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌ ΠΏΠΈΡΠ°Ρ‚ΡŒ сСмантичСски Π·Π½Π°Ρ‡ΠΈΠΌΡƒΡŽ ΠΈΡΡ‚ΠΎΡ€ΠΈΡŽ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°, Ρ‡Ρ‚ΠΎ ΠΈΠΌΠ΅Π΅Ρ‚ Ρ€Π΅ΡˆΠ°ΡŽΡ‰Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ для ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ ΠΈ ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ² Π½Π° вопросы Π²Ρ€ΠΎΠ΄Π΅ «Π—Π°Ρ‡Π΅ΠΌ Π±Ρ‹Π»Π° Π²Π²Π΅Π΄Π΅Π½Π° эта низкоуровнСвая Π΄Π΅Ρ‚Π°Π»ΡŒ (Π½Π°ΠΏΡ€., пСрСмСнная)?», «Π‘колько ΠΏΡ€ΠΎΡ†Π΅Π½Ρ‚ΠΎΠ² ΠΏΡ€ΠΈΠ±Π»ΠΈΠ·ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΌΠΎΠΉ Π²ΠΊΠ»Π°Π΄ Π² этот ΠΏΡ€ΠΎΠ΅ΠΊΡ‚?», «ΠšΠΎΠ³ΠΎ Π²Π·Π»ΠΎΠΌΠ°Π»ΠΈ внСдрСния Π·Π°ΠΊΠ»Π°Π΄ΠΊΠΈ ΠΈ ΠΊΠΎΠ³Π΄Π°?», «ΠšΠ°ΠΊΠΎΠ΅ Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²ΠΎΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ сломало эту Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ (хотя Π²Ρ€ΠΎΠ΄Π΅ Π±Ρ‹ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ, ΠΌΡ‹ всё ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠ»ΠΈ!?)»

БистСмы контроля вСрсий Π΄ΠΎΠΏΠΎΠ»Π½ΡΡŽΡ‚ это ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠ΅ΠΉ Π²Π΅Ρ‚ΠΊΠΈ — Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²ΠΎΠ΅ понятиС, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ просто Π½Π΅ΠΏΡ€Π΅Ρ€Ρ‹Π²Π½Ρ‹ΠΉ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²ΠΎΠΉ истории ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°, сСмантичСски Π·Π½Π°Ρ‡ΠΈΠΌΡ‹ΠΉ для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°. Π’Π΅Ρ‚ΠΊΠΈ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΈΠ½ΠΎΠ³Π΄Π° ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ нСсколько Π²Π΅Ρ‚ΠΎΠΊ для Ρ€Π°Π·Π½Ρ‹Ρ… ΠΊΠ°Π½Π΄ΠΈΠ΄Π°Ρ‚ΠΎΠ² Π² Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΎΠ΄Π½ΠΎΠΉ ΠΈ Ρ‚ΠΎΠΉ ΠΆΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ€Π°Π±ΠΎΡ‡ΠΈΠ΅ процСссы с Π²Π΅Ρ‚Π²Π»Π΅Π½ΠΈΠ΅ΠΌ (ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ фактичСски мСйнстрим ΠΈ стандарт Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π²Π΅Π·Π΄Π΅ ΠΈ повсСмСстно), ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ эффСктивно ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΈΠΌΠΈ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΡƒΡŽΡ‰ΠΈΠΌΠΈ Π²Π΅Ρ‚ΠΊΠ°ΠΌΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°, каТдая ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… отличаСтся ΠΏΠΎ стСпСни готовности ΠΈΠ»ΠΈ качСству. Π­Ρ‚ΠΎ позволяСт Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌ ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ своих ΠΈ Ρ‡ΡƒΠΆΠΈΡ… Ρ‚Ρ€ΡƒΠ΄ΠΎΠ² Π±Π΅Π· пСрСнабивания всСго Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·.

ΠžΠ±Ρ‹Ρ‡Π½ΠΎ дСлаСтся основная Π²Π΅Ρ‚ΠΊΠ°, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π°Ρ «ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ» ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚, ΠΎΡ‚ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ вСтвятся Π±ΠΎΠΊΠΎΠ²Ρ‹Π΅ Π²Π΅Ρ‚ΠΊΠΈ для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ рСгулярно (Π² ΠΈΠ΄Π΅Π°Π»Π΅ — послС ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΌΠΈΡ‚Π°) ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ΡΡ с основной Π²Π΅Ρ‚ΠΊΠΎΠΉ, Ρ‡Ρ‚ΠΎ позволяСт Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с наисвСТайшСй вСрсиСй ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π° ΠΈ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ Π²Π½Π΅Π΄Ρ€ΡΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ½ΠΈ Π² Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Ρ€Π°Π·Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚, дСтСктируя ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹, ΠΏΡ€ΠΎΠΈΡΡ‚Π΅ΠΊΠ°ΡŽΡ‰ΠΈΠ΅ ΠΎΡ‚ дСйствий Π΄Ρ€ΡƒΠ³ΠΈΡ… Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ², ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°Π½ΡŒΡˆΠ΅.

ΠŸΡ€ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ΅ комбинирования Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… snapshot-ΠΎΠ² (Ρ‡Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ просто нахоТдСния ΠΎΠ±Ρ‰Π΅Π³ΠΎ ΠΏΡ€Π΅Π΄ΠΊΠ°, ΠΈ примСнСния changesetΠΎΠ², ΠΈΡ… ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°ΡŽΡ‰ΠΈΡ…, ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΠΎΠ²Π΅Ρ€Ρ… Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ, эта опСрация называСтся rebase, слияниС ΠΆΠ΅ — это ΠΏΠΎΡ‡Ρ‚ΠΈ ΠΊΠ°ΠΊ rebase, просто структурируСт Π³Ρ€Π°Ρ„ ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ² ΠΏΠΎ-Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ, Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Ρ‡Π΅Π³ΠΎ ΠΈΠΌ становится Π½Π΅ΡƒΠ΄ΠΎΠ±Π½ΠΎ ΠΌΠ°Π½ΠΈΠΏΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, поэтому ΠΎΡ‚ слияний ΡΡ‚Π°Ρ€Π°ΡŽΡ‚ΡΡ ΠΎΡ‚ΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ Π² ΠΏΠΎΠ»ΡŒΠ·Ρƒ rebase-ΠΎΠ²) Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹. Π‘ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ систСмы контроля вСрсий (VCS) ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠ΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ объСдинСния ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ просто Ρ€Π°Π·Π±ΠΈΠ²Π°ΡŽΡ‚ Ρ„Π°ΠΉΠ»Ρ‹ Π½Π° ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ строки, Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽΡ‚ ΠΊΠ°ΠΆΠ΄ΡƒΡŽ строку ΠΊΠ°ΠΊ символ, Π° Ρ„Π°ΠΉΠ»Ρ‹ — ΠΊΠ°ΠΊ ΠΈΡ… ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ, ΠΈ Π·Π°Ρ‚Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ для ΠΈΡ… объСдинСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€ΠΎΠ΄ΠΎΠΌ ΠΈΠ· Π±ΠΈΠΎΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΠΊΠΈ.

К соТалСнию, Ρ‚Π°ΠΊΠΎΠ΅ построчноС прСдставлСниС исходного ΠΊΠΎΠ΄Π° Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ Π½ΠΈΡ‡Π΅Π³ΠΎ ΠΎΠ±Ρ‰Π΅Π³ΠΎ с Π΅Π³ΠΎ содСрТаниСм. ЕдинствСнноС Π΅Π³ΠΎ достоинство — ΠΎΠ½ΠΎ простоС ΠΈ ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½ΠΎΠ΅. НСсоотвСтствиС Π²Π΅Π΄Ρ‘Ρ‚ ΠΊ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Π°ΠΌ ΠΏΡ€ΠΈ, являясь постоянным источником Π³ΠΎΠ»ΠΎΠ²Π½ΠΎΠΉ Π±ΠΎΠ»ΠΈ для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ². Π Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΠΎΠ² Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ ΠΎΡ‚ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° Ρ‚Ρ‰Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ изучСния ΠΎΠ±Π΅ΠΈΡ… вСрсий ΠΊΠΎΠ΄Π°, ΠΏΡ€ΠΈΡ‡Ρ‘ΠΌ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ€Π°Π·Π΄Π΅Π»ΠΎΠ², ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π΅Π½Π½Ρ‹Ρ… построчным Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠΌ сравнСния ΠΊΠ°ΠΊ «ΠΈΠ·ΠΌΠ΅Π½Ρ‘Π½Π½Ρ‹Π΅» ΠΈΠ»ΠΈ «ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΡƒΡŽΡ‰ΠΈΠ΅», Π½ΠΎ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΈ всСго ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°.

Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΠ½ΡΡ‚ΡŒ измСнСния, Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½Ρ‘Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ ΠΈ ΡƒΡΡ‚Ρ€Π°Π½ΠΈΡ‚ΡŒ Π»ΡŽΠ±Ρ‹Π΅ нСсоотвСтствия. ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ прибавляСтся, ΠΊΠΎΠ³Π΄Π° построчный инструмСнт Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΠ΅Ρ‚ измСнСния, Ρ‡Ρ‚ΠΎ часто случаСтся ΠΏΡ€ΠΈ ΠΊΡ€ΡƒΠΏΠ½Ρ‹Ρ… измСнСниях, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ ΠΏΠ΅pΠ΅Ρ„ΠΎpΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π°. Если ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ измСнСния Π½Π΅ удаётся ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΊ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½Ρ‘Π½Π½ΠΎΠΌΡƒ ΠΊΠΎΠ΄Ρƒ, ситуация прСвращаСтся Π² ΠΏΠΎΠ»Π½Ρ‹ΠΉ ΠΊΠΎΡˆΠΌΠ°Ρ€. НС смотря Π½Π° ΡƒΠΆΠ°ΡΠ°ΡŽΡ‰ΠΈΠ΅ случаи, Π² Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв построчный Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, особСнно Ссли Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎ ΡΡ‚Π°Ρ€Π°ΡŽΡ‚ΡΡ Π½Π΅ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π΅ΠΌΡƒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹. Один ΠΈΠ· способов ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΉ ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ — это ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ исходников инструмСнтами ΠΊΠ°Π½ΠΎΠ½ΠΈΠΊΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, Ρ‚Π°ΠΊΠΈΠΌΠΈ ΠΊΠ°ΠΊ 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.

CСриализация ΠΏΠ°Ρ‚Ρ‡Π΅ΠΉ Π² Ρ„Π°ΠΉΠ»Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½Ρ‹ ΠΏΠΎΡ‚ΠΎΠΌ, ΠΊ соТалСнию, Π½Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° (Π½ΠΎ Π²ΠΏΠΎΠ»Π½Π΅ вСроятно, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° ΠΏΡƒΡ‚Ρ‘ΠΌ парсинга Π»ΠΎΠ³ΠΎΠ² событий, Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Ρ… 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) class 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) class baz: def __init__(self): «»»baz»»» (для ΠΎΡ‚Π»Π°Π΄ΠΎΡ‡Π½ΠΎΠΉ ΠΏΠ΅Ρ‡Π°Ρ‚ΠΈ задСйствована Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° «icecream», пСрСмСнная «foo» ΠΏΠ΅Ρ€Π΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π° Π² «bar», ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ «black» послС ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ, Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ отступы — ΠΏΡ€ΠΎΠ±Π΅Π»Π°ΠΌΠΈ ΠΈ лишниС строки Π²Ρ‹Ρ€Π΅Π·Π°Π½Ρ‹, смСсь Ρ‚Π°Π±ΠΎΠ² ΠΈ ΠΏΡ€ΠΎΠ±Π΅Π»ΠΎΠ² для отступа, Π½ΠΎ Ρ€Π°Π·Ρ€Π΅ΡˆΡ‘Π½Π½Ρ‹ΠΉ Π²ΠΈΠ΄).

Π’ΡƒΡ‚ ΠΆΠ΅ Π²ΠΈΠ΄Π΅Π½ нСдостаток инструмСнта. Π‘Ρ‚ΠΈΠ»ΡŒ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ конфигурируСтся Π² Ρ„Π°ΠΉΠ»Π°Ρ… «.editorconfig», ΠΈ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Π΅ измСнСния стиля, Π²Ρ€ΠΎΠ΄Π΅ смСны Ρ‚Π°Π±ΠΎΠ² Π½Π° ΠΏΡ€ΠΎΠ±Π΅Π»Ρ‹ ΠΈ принятия стиля black-Π°, ΠΊΠ°ΠΊ Π±Ρ‹Π»ΠΎ сдСлано Π² «b.py», ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΡΠΎΠΏΡ€ΠΎΠ²ΠΎΠΆΠ΄Π°ΡŽΡ‚ΡΡ измСнСниями Π² «.editorconfig». ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ для Π±ΠΎΠ»Π΅Π΅ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠ³ΠΎ примСнСния ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Ρ… ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ инструмСнт Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΡŽ для глобального стиля «ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ», ΠΈ ΡƒΠΌΠ΅Ρ‚ΡŒ ΠΏΠΎΠ΄Ρ‚ΡΠ³ΠΈΠ²Π°Ρ‚ΡŒ настройки ΠΈΠ· «.editorconfig».

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