Об'єднання і вікно редактора виводу об'єднання

У області редактора даних об'єднання (розташованому під областями вхідних даних) є інформаційний рядок з заголовком Вивід:, назвою файла і рядком [Змінено], який з'явиться, якщо вами було внесено якісь зміни. Зазвичай, у цьому рядку буде міститися певні дані, виведені інструментами автоматичного об'єднання, але часто у цій області з'являтимуться повідомлення про конфлікти.

!!! Ви не зможете зберегти дані, аж доки всі конфлікти не буде розв'язано !!! (Скористайтеся кнопками Перейти до попер./наст. нерозв'язаного конфлікту, щоб перевести перегляд до конфліктів, які ще не розв'язано.)

Якщо ви працюєте з двома файлами вхідних даних, кожна з відмінностей є конфліктом, який слід розв'язати вручну.

Якщо вхідних файлів буде три, перший з них вважатиметься базовим, а другий і третій — такими, що містять зміни. Якщо певний з рядків змінено лише у файлі B або C, але не у двох цих файлах, програма автоматично обере змінений варіант. Лише у випадках, коли і у B, і у C одночасно змінено однакові рядки, програма вважатиме ситуацію конфліктною і пропонуватиме розв'язати конфлікт вручну. Якщо зміни, внесені у B і C є тотожними, буде вибрано варіант C.

Стовпчик резюме

У області редактора виводу об'єднання також передбачено стовпчик резюме, розташований ліворуч. У цьому стовпчику буде показано літеру варіанта, з якого було взято рядок, або нічого, якщо всі у всіх трьох джерелах рядок є однаковим. Конфліктні рядки буде позначено символом знака питання («?»), а у самому рядку буде показано червоний запис «Конфлікт об'єднання». Оскільки порядкове розв'язання конфліктів є справою досить марудною, рядки буде впорядковано за групами з однаковими відмінностями і характеристиками конфліктів. Конфлікти, які полягають лише у розташуванні пробілів, буде відокремлено від інших конфліктів, щоб полегшити об'єднання файлів, де зміни у відступах було внесено до багатьох рядків.

Визначення поточної групи і синхронізація позиції об'єднання і перегляду відмінностей

Після наведення вказівника миші у стовпчику резюме будь-якої з областей на певну позицію і клацання лівою кнопкою миші програма відкриє у всіх вікнах фрагмент тексту на початку групи, до якої належить позначений клацанням рядок. Після цього група стане «поточною групою». Цю групу буде позначено Кольором тла поточного діапазону різниці (можна змінити за допомогою пункту Інтеграція діалогового вікна параметрів програми), а зліва від тексту буде показано чорну рамку.

Вибір вхідних даних з A, B або C для розв'язання поточного конфлікту і редагування

На панелі з кнопками, розташованій під смужкою меню, містяться три кнопки вибору вхідних даних, які позначено літерами A, B і C. Натисніть кнопку вибору вхідних даних, щоб вставити рядки (або вилучити рядки, якщо ці рядки вже було раніше вставлено) з відповідного джерела. Щоб позначити рядки з декількох вхідних джерел натисніть відповідні кнопки у потрібному порядку. Наприклад, якщо ви бажаєте, щоб рядкам з B було надано перевагу перед рядками з A у вихідних даних, спочатку натисніть B, а вже потім A.

Якщо ви використовуєте автоматичний перехід (позначено пункт «Автоматично перейти до наступного конфлікту за визначення джерела»), вам слід вимкнути його перед вибором рядків з декількох джерел або редагуванням рядків після вибору. Якщо ви цього не зробите, KDiff3 перейде до наступного конфлікту після вибору першого джерела даних.

Часто корисно напряму змінити вивід об'єднання. У перегляді резюме буде показано літеру «m» навпроти всіх рядків, які було змінено вручну. Якщо, наприклад, відмінності вирівняно таким чином, що простого вибору потрібного джерела буде недостатньо, ви можете позначити потрібний текст і скористатися звичайною дією з копіювання з вставленням, щоб розмістити потрібний фрагмент тексту у області виводу об'єднання.

Іноді, якщо певний рядок було вилучено або у результаті автоматично об'єднання, або редагування, і у групі більше не залишиться жодного рядка, програма показуватиме у відповідному рядку текст <Немає рядка джерела>. Цей рядок є лише заповнювачем для групи на випадок, якщо ви зміните свою думку і захочете знову позначити якийсь текст. Відповідний текст заповнювача не буде показано у збереженому файлі, його не буде включено до жодного з фрагментів, які ви копіюватимете і вставлятимете.

Якщо ви спробуєте скопіювати і вставити певний текст, що містить такий рядок, у буфері обміну даними буде лише рядок «<Конфлікт об'єднання>». Але будьте обережними, коли виконуєте подібне копіювання.

Вибір даних A, B або C для всіх конфліктів

Звичайне об'єднання починатиметься з автоматичного розв'язання простих конфліктів. Але у меню Об'єднання передбачено і деякі інші пункти для виконання типових завдань. Якщо ви бажаєте вибрати певне джерело даних для розв'язання більшості конфліктів, ви можете вказати джерело A, B або C всюди або лише для ще нерозв'язаних конфліктів або для нерозв'язаних конфліктів, що полягають у різній кількості пробілів. Якщо ви бажаєте вирішувати кожен з конфліктів окремо, ви можете позначити пункт Застосувати різницю до конфліктів. Якщо ви бажаєте повернутися до автоматичного вибору KDiff3, скористайтеся пунктом Автоматично розв'язувати прості конфлікти. Після вибору цього пункту KDiff3 виконає об'єднання повторно. Якщо використання певного пункту меню змінюватиме результати попереднього редагування, KDiff3 запитає у вас підтвердження, перш ніж виконувати відповідну дію.

Примітка

Зауваження: якщо ви обираєте одне з джерел для розв'язання конфліктах пробілів і позначили один з пунктів «Ігнорувати числа» або «Ігнорувати коментарі C/C++» на сторінці Diff діалогового вікна параметрів програми, зміни у числах або коментарях вважатимуться змінами у пробілах.

Автоматичне об'єднання за ключовими словами системи керування версіями і журналу

Значна кількість систем керування версіями підтримує особливі ключові слова (наприклад "$Date$", "$Header$", "$Author$", "$Log$" тощо). Під час синхронізації системи керування версіями змінюють ці рядки. Наприклад, "$Date$" перетвориться на "$Date: 2009/03/22 18:45:01 $". Оскільки цей рядок буде різним у кожній з версій файла, під час спроби об'єднання потрібне буде втручання користувача.

У KDiff3 передбачено автоматичне об'єднання таких елементів. Для простих рядків, які відповідатимуть значенню параметра «Формальний вираз автооб'єднання» у всіх файлах вхідних даних, KDiff3 обере рядок з B або, у разі доступності, з C. Крім того, потрібно, щоб відповідні рядки стояли поруч у області порівняння, а попередній рядок не містив конфліктів. Подібне автоматичне об'єднання можна виконати або негайно після запуску об'єднання (позначенням пункту Запустити автооб'єднання за формальними виразом на початку об'єднання»), або пізніше, за допомогою пункту меню Об'єднанняЗапустити автооб'єднання за формальними виразом на початку об'єднання.

Програмою підтримується і автоматичне об'єднання за журналом системи керування версіями. Автоматичне об'єднання за журналом можна виконати негайно після запуску об'єднання, якщо позначити пункт Об'єднувати за журналом керування версіями на початку об'єднання або пізніше за допомогою пункт меню Об'єднанняАвтоматично розв'язувати конфлікти у журналі.

Зазвичай, журнал системи керування версіями починається з рядка, що містить ключове слово «$Log$». Початок журналу має відповідати значенню параметра Початковий формальний вираз журналу. KDiff3 визначає, які з рядків належать до журналу, аналізуючи початкові символи, які передують ключовому слову «$Log$». Якщо такі самі «початкові коментарі» зустрічаються і у наступних рядках, ці рядки також буде включено до журналу.

Під час кожної транзакції система керування версіями записує унікальний рядок з відомостями щодо версії, дати і часу транзакції та коментарів користувача. З цих елементів утворюється окремий запис журналу. Цей розділ журналу збільшується під час кожної транзакції, найсвіжіші записи з'являтимуться у верхній частині журналу (після початкового рядка журналу).

Якщо під час розробки двоє або декілька розробників вивантажують свої версії одного файл, у журналі об'єднання міститимуться декілька записів, які вважатимуться конфліктними під час об'єднання гілок. Оскільки подібні об'єднання можуть бути досить марудною справою, у KDiff3 передбачено підтримку двох можливих стратегій: простої вставки інформації від обох розробників у верхню частину журналу або впорядкування інформації журналу за визначеним користувачем ключем.

Налаштувати спосіб одночасної вставки всіх записів простіше. Слід просто вказати KDiff3 метод визначення рядків, які належатимуть до одного запису журналу. У більшості систем керування версіями після кожного запису журналу додається порожній рядок. Якщо система керування версіями не додає порожніх рядків у інших випадках, подібні рядки можуть слугувати достатнім критерієм для KDiff3. Достатньо вказати порожнє значення для параметра Початковий формальний вираз елемента історії на сторінці Об'єднання діалогового вікна параметрів програми. Якщо використання критерію порожнього рядка є недостатнім, ви можете вказати формальний вираз, за яким можна визначити початок запису журналу.

Зауважте, що KDiff3 вилучатиме записи журналу, що повторюватимуться. Якщо запис журналу зустрічається декілька разів у журналі певного вхідного файла, у виведених даних залишиться лише один запис.

Якщо ви бажаєте впорядкувати журнал, вам слід вказати спосіб побудови ключа впорядкування. Скористайтеся круглими дужками у полі параметра Початковий формальний вираз елемента історії на сторінці Об'єднання діалогового вікна параметрів програми для групування частин формального виразу, який пізніше буде використано як ключ впорядкування. Після цього вкажіть у полі Порядок сортування початків записів за ключем відокремлений комами список чисел, які відповідають позиції групи у формальному виразі.

Оскільки зробити все правильно від початку не так уже і просто, ви можете випробувати та покращити формальний вираз і створення ключів у відповідному діалоговому вікні за допомогою натискання кнопки Перевірити ваші формальні вирази.

Приклад: припустімо журнал виглядає так:

/**************************************************************************
** HISTORY:    $Log: \toms_merge_main_view\MyApplication\src\complexalgorithm.cpp $
**
**     \main\integration_branch_12   2 Apr 2001 10:45:41   tom
**  Merged branch simon_branch_15.
**
**     \main\henry_bugfix_branch_7\1   30 Mar 2001 19:22:05   henry
**  Improved the speed for subroutine convertToMesh().
**  Fixed crash.
**************************************************************************/

Початковому рядку журналу відповідатиме формальний вираз ".*\$Log.*\$.*". Після цього рядка йдуть записи журналу.

Рядок з записом ключового слова «$Log$» починається з двох символів «*», за якими слідує пробіл. KDiff3 вважає перший непробільний рядок «початковим коментарем» і припускає, що журнал завершується першим же рядком без такого коментаря. У нашому прикладі останній з рядків завершується фрагментом тексту, який також починається з двох символів «*», але замість символу пробілу за ними слідують додаткові символи «*». Отже цей рядок є кінцевим рядком журналу.

Якщо впорядкування журналу не потрібне, формальний вираз початку запису журналу може виглядати так (рядок було розбито на два через обмеження на довжину):

\s*\\main\\\S+\s+[0-9]+ (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)
 [0-9][0-9][0-9][0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9]\s+.*

Докладніше про формальні вирази можна дізнатися з документації щодо формальних виразів. Зауважте, що «\s» (з маленьким «s») відповідає будь-якій кількості пробілів, а «\S» (з великим «S») відповідає будь-якій послідовності символів, що не містить пробілів. У нашому прикладі початок запису журналу містить спочатку інформацію про версію з формальним виразом «\\main\\\S+», дату, що складається з дня «[0-9]+», місяця «(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)» і року «[0-9][0-9][0-9][0-9]», час у форматі «[0-9][0-9]:[0-9][0-9]:[0-9][0-9]» і нарешті назву облікового запису розробника «.*».

Зауважте, що символи «початкового коментаря» (у нашому прикладі «**») буде попередньо вилучено KDiff3 ще перед порівнянням, отже формальний вираз починається з пошуку жодного або іншої кількості символів пробілу «\s*». Оскільки символи коментаря можуть бути різними у різних файлах (наприклад, у C/C++ використовуються символи коментування, відмінні від тих, які використовуються у скриптах Perl), KDiff3 сам визначає початкові символи коментаря, отже вам не потрібно вказувати їх у формальному виразі.

Якщо вам потрібне впорядкування журналу, програмі доведеться обчислити ключ впорядкування. Для цього слід згрупувати відповідні частини формального виразу у дужках (додаткові дужки можна і не прибирати, якщо ви захочете вимкнути впорядкування журналу):

\s*\\main\\(\S+)\s+([0-9]+) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)
 ([0-9][0-9][0-9][0-9]) ([0-9][0-9]:[0-9][0-9]:[0-9][0-9])\s+(.*)

Тепер у дужках містяться: 1. інформація про версію, 2. день, 3. місяць, 4. рік, 5. час, 6. назва облікового запису. Але якщо нам потрібне впорядкування за часом і датою, доведеться побудувати ключ впорядкування за допомогою елементів у іншій послідовності: спочатку рік, далі місяць, день, час, інформація про версію і назва облікового запису. Отже, порядок рядків має бути таким: «4,3,2,5,1,6».

Оскільки назви місяців не є гарним критерієм впорядкування (наприклад, «Apr» (квітень) буде першим), KDiff3 проаналізує послідовність, у якій було вказано назви, а потім використає замість назв відповідні номери («Apr»->«04»). Якщо буде знайдено якесь число, програма перетворить його на 4-цифрове значення за допомогою додавання початкових нулів, а потім застосує впорядкування. Нарешті, остаточний ключ впорядкування для початкового рядка першого запису журналу виглядатиме так:

2001 04 0002 10:45:41 integration_branch_12   tom

Докладніші відомості можна отримати з розділу Параметри об'єднання.