Страниц: [1] 2
  Печать  
Автор Тема: Система контроля версий Git  (Прочитано 1386 раз)
da-nie
Full Member
***
Offline Offline

Сообщений: 167



Просмотр профиля
« : Июня 24, 2017, 07:29:07 pm »

Как это ни странно, но я никогда не работал с системами контроля версий. Ну просто я не программист и не инженер-программист, а просто инженер, хотя и 80% времени я занимаюсь именно разработкой и сопровождением ПО стендового оборудования, ПО систем, ПО обработки данных и 20% электроникой. И в моей конторе для ПО ничего подобного не применяется. Да и программы пишут 1-2 человека, не более. Максимум, что по ПО очень хочет руководство, так это класть в архив (у нас применяется система Windchill ) бредовые документы типа "Методики тестирования ПО" и оформление всяких "Руководство оператора" и "Описание программы". В целом, обычный ГОСТ на ЕСПД, устаревший в прошлом веке (поверите ли, до 2014 мы прикладывали к исходникам в архиве файл, где писали, что кодировка в программе КОИ-8 - того требовали  внутренние документы предприятия, основанные на лохматом ГОСТ'е. Конечно, кодировка была совсем другая. Smiley Но файл обязан был быть.). Собственно, решил я попробовать систему GIT. И сразу появились вопросы, которые книжка, если и описывает, то, наверное, где-то ближе к концу.
А вопросы вот какие:
1) Если мы с гипотетическим Васей пишем программу вместе и Вася решил добавить в интерфейс новую кнопку, он меняет некий файл, где добавляет новый функционал. А в это время я тоже решил сделать другую кнопку и в том же файле у себя тоже пишу свой функционал. Как нам слить функционалы вместе? Shocked Это разве не две разные ветки программы получатся? Или система контроля версий обладает ИИ и способна понять, как объединить совершенно разный код? Этот вопрос родился из того, что я не понимаю, как на GitHub разные люди тянут программу каждый в свою сторону (с Васей-то мы договоримся менять только свои части.).
2) Тот же вопрос, только Вася взял и удалил некоторые классы. А я на своей копии (которую я сделал по git clone) с ними работаю. Возвращаю их обратно в репозиторий (git add) и... бардак в репозитории?

Я в принципе не понимаю, как несколько человек могут одновременно править один и тот же файл. Может, кто-нибудь сможет объяснить концепцию всех этих систем при совместной разработке? Или требуется, чтобы каждый правил только свой файл, а при смене концепции делать бранч?

Спасибо. Smiley
« Последнее редактирование: Июня 24, 2017, 08:07:55 pm от da-nie » Записан

И день и ночь в пути
darkelf
QOR.Moderator
*****
Offline Offline

Сообщений: 256


Просмотр профиля
« Ответ #1 : Июня 26, 2017, 12:59:35 pm »

К сожалению по Git подсказать не могу, у нас используется Subversion так-же известный как svn. Они, в принципе, похожи, но в многих практических вопросах могут отличаться, так-что я не уверен, насколько опыт работы с svn может быть применим к Git.
Записан
da-nie
Full Member
***
Offline Offline

Сообщений: 167



Просмотр профиля
« Ответ #2 : Июня 26, 2017, 04:49:47 pm »

А как в subversion подобные вопросы решаются? Smiley Суть-то у всех этих систем одна и та же.
Записан

И день и ночь в пути
darkelf
QOR.Moderator
*****
Offline Offline

Сообщений: 256


Просмотр профиля
« Ответ #3 : Июня 26, 2017, 05:55:58 pm »

А как в subversion подобные вопросы решаются? Smiley Суть-то у всех этих систем одна и та же.
Хорошо решаются.

Для того, чтобы записать в репозиторий сначала надо забрать изменения, сделанные после того, как Вы последний раз их забирали из репозитория. Вам система контроля версий не даст записать свои локальные изменения из рабочей копии пока Вы не обновите её до того, что есть в репозитории. Если Вы с гипотетическим Васей редактировали разные файлы или даже один и тот-же файл, но в разных, не пересекающихся местах, то система контроля версий автоматически объединит Ваши изменения. Если Вы редактировали одно и то же место, то svn даст возможность выбрать или Вашу правку, или Васину, или вообще написать свой вариант.
Записан
lastcross
Full Member
***
Offline Offline

Сообщений: 224


Просмотр профиля
« Ответ #4 : Июня 26, 2017, 06:59:55 pm »

Если Вы с гипотетическим Васей редактировали разные файлы или даже один и тот-же файл, но в разных, не пересекающихся местах, то система контроля версий автоматически объединит Ваши изменения.

Есть одно забавное "но" - не всегда объединение автоматическое (в отсутствии обнаруженных конфликтов) может дать правильный с точки зрения компиляции код. Пример - это внесение исправлений ( например в базовом классе изменения сигнатуры методов) и добавление другим участником правок кода на базе старой сигнатуры. Если правки не будут пересекаться - контроль версий не увидит конфликтов, но результирующий последний коммит без правок - не скомпилируется

Это как бы, дополнение к Вашему комментарию и акцентирование внимания на том, что контроль версий обнаруживает конфликты уровня физического пересечения правок (изменений текстового файла), а не синтаксического.
« Последнее редактирование: Июня 26, 2017, 07:06:18 pm от lastcross » Записан
da-nie
Full Member
***
Offline Offline

Сообщений: 167



Просмотр профиля
« Ответ #5 : Июня 26, 2017, 07:05:16 pm »

Цитировать
Вам система контроля версий не даст записать свои локальные изменения из рабочей копии пока Вы не обновите её до того, что есть в репозитории.
...
Если Вы редактировали одно и то же место, то svn даст возможность выбрать или Вашу правку, или Васину, или вообще написать свой вариант.

Занятно. Cool То есть, если Вася стёр тот фрагмент, который есть у меня, то система предложит варианты слияния? А что является единицей "места"? Вот в формуле Вася вписал знак минус, а я у себя поменял в этой же формуле имя коэффициента. Это одно и то же место или разные? Как они делятся?

Цитировать
При не пересечении кода - контроль версий не увидит конфликтов, но результирующий последний коммит без правок - не скомпилируется

Понятно. Значит, формально требуется координатор. Иначе мы с Васей разорвём программу на лоскуты.
Записан

И день и ночь в пути
lastcross
Full Member
***
Offline Offline

Сообщений: 224


Просмотр профиля
« Ответ #6 : Июня 26, 2017, 08:05:50 pm »

Занятно. Cool То есть, если Вася стёр тот фрагмент, который есть у меня, то система предложит варианты слияния? А что является единицей "места"? Вот в формуле Вася вписал знак минус, а я у себя поменял в этой же формуле имя коэффициента. Это одно и то же место или разные? Как они делятся?
Ну очевидно же, один из простых вариантов (для большинства текстовых файлов) - это пересечение в позиции (по строчной или даже посимвольной - от начал файла). Если одни изменения пересекаются с изменениями другого по позиции - значит автоматически система не сможет сама решить конфликт, она делегирует это решение последнему из (кто внес изменения и получил конфликт). Как он будет решать этот кофликт (в чью пользу) - это уже организационный момент и лежит вне GIT-компетенции ))

Цитировать
Понятно. Значит, формально требуется координатор. Иначе мы с Васей разорвём программу на лоскуты.

В большинстве случаев достаточно брать за правило - после любого мержа, перед пушем -  собирать на своей стороне проект.
Записан
da-nie
Full Member
***
Offline Offline

Сообщений: 167



Просмотр профиля
« Ответ #7 : Июня 26, 2017, 08:43:24 pm »

Цитировать
Ну очевидно же, один из простых вариантов (для большинства текстовых файлов)

Я почему спрашиваю, есть всякие сравниватели файлов типа Beyond Compare. Там сравнение несколько сложнее и фрагменты разыскивает весьма эффективно (даже если их переставили местами).
А в моём примере с формулой мы с Васей не пересеклись по координатам символов. Следовательно, я так понимаю, что в формуле поменяется и знак (от Васи) и имя коэффициента (от меня). Прикольно будет, если это окажется ошибочная формула. Smiley Помнится, из-за ошибки в формуле (руководство было уверено, что это уже реализовано, но нет) в Роскосмосе была авария аппарата (уже не помню, какого). И кого-то там посадили за это.  Roll Eyes
Записан

И день и ночь в пути
darkelf
QOR.Moderator
*****
Offline Offline

Сообщений: 256


Просмотр профиля
« Ответ #8 : Июня 26, 2017, 09:25:49 pm »

А в моём примере с формулой мы с Васей не пересеклись по координатам символов. Следовательно, я так понимаю, что в формуле поменяется и знак (от Васи) и имя коэффициента (от меня).
В svn сравнение идёт строками, так-что такой вариант Вам не грозит.
Записан
ob1
Hero Member
*****
Offline Offline

Сообщений: 629


What has two thumbs up and doesn't give a crap?


Просмотр профиля WWW
« Ответ #9 : Июня 27, 2017, 11:10:54 am »

Что мешает взять Git в лапки и смоделировать все неясные моменты?
Записан
da-nie
Full Member
***
Offline Offline

Сообщений: 167



Просмотр профиля
« Ответ #10 : Июня 27, 2017, 12:02:20 pm »

Цитировать
Что мешает взять Git в лапки и смоделировать все неясные моменты?

Командная строка. Smiley И отсутствие опыта работы с такими системами. Вот взял я книжку "Pro Git". Автор сразу работает с удалённым репозиторием - сделайте, говорит, git clone. А у меня-то локальная машина. Также автор почему-то не раскрыл тайну, как добавить каждый проект в git - пишет, наберите git init. Набрал. И что? Ну тут мне хоть рассказали, что git init нужно делать внутри каждого проекта. Ну и так далее.
Записан

И день и ночь в пути
lastcross
Full Member
***
Offline Offline

Сообщений: 224


Просмотр профиля
« Ответ #11 : Июня 27, 2017, 12:47:47 pm »

Вот взял я книжку "Pro Git". Автор сразу работает с удалённым репозиторием - сделайте, говорит, git clone. А у меня-то локальная машина.
Разве? Первый же пункт - "Создание Git-репозитория" вполне все хорошо объясняется.
Записан
da-nie
Full Member
***
Offline Offline

Сообщений: 167



Просмотр профиля
« Ответ #12 : Июня 27, 2017, 01:34:22 pm »

На самом деле, из первой же главы вообще не понятно, как разделять проекты и как добавлять файлы. Там просто не написано этого.
Цитировать
Если вы хотите добавить под версионный контроль существующие файлы (в отличие от пустого каталога), вам стоит проиндексировать эти файлы и осуществить первую фиксацию изменений. Осуществить это вы можете с помощью нескольких команд git add указывающих индексируемые файлы, а затем commit:
Делаем git add - а add чего? Где git возьмёт файлы? Не написано. К тому же оказалось, что файлы должны быть в каталоге git - иначе он их не видит, даже если перейти в выбранный внешний каталог.
Записан

И день и ночь в пути
lastcross
Full Member
***
Offline Offline

Сообщений: 224


Просмотр профиля
« Ответ #13 : Июня 27, 2017, 05:58:14 pm »

На самом деле, из первой же главы вообще не понятно, как разделять проекты и как добавлять файлы. ...
Делаем git add - а add чего? Где git возьмёт файлы? Не написано. К тому же оказалось, что файлы должны быть в каталоге git - иначе он их не видит, даже если перейти в выбранный внешний каталог.
Странно, но у меня вопросов не возникло (возможно по причине используемых ранее других контроль-версионных продуктов). Как бы было очевидно - контроль версий не имеет понятия ни о каком "проекте" (какому бы этот проект языку не относился или как бы не конфигурировался). Контроль версий работают с файлами в первую очередь. Ведь под их контролем может быть не только проект, а и набор несвязанных ресурсов/документов и тд. Другими словами - очевидно что под понятием "проектный каталог" имелся ввиду верхнего уровня каталог, в котором (и в подкаталогах которого) будут находится файлы которые и собираетесь поместить в репозиторий (дерево индексации). Как минимум это умолчательное поведение. И как правило оно же и накладывает отпечаток на формирование структуры каталогов в проектах.
Ну а дальше:

1) Ваша работа с git - это периодическое изменение, переиндексация состояния репозитория. Первичная индексация - git init, которая заставит его сформировать пустое дерево индексации начиная с указаного каталога (от имени которого вы выполнили эту команду)
2) Команды git add - заставят переиндексировать его состояние. У этой команды есть куча аргументов, но есть и такие которые укажут какие именно файлы нужно "добавить" (попытаться проиндексировать) или же сделать индексацию по всему дереву (от каталога и подкаталогов). Если окажется что состояние не изменилось (все файлы уже есть в репозитории или же не менялись и т.д.) - то переиндексации не будет. Если найдутся - он уведомит и сделает прериндексацию изменив состояние репозитория.
Записан
da-nie
Full Member
***
Offline Offline

Сообщений: 167



Просмотр профиля
« Ответ #14 : Июня 27, 2017, 08:08:53 pm »

Цитировать
Контроль версий работают с файлами в первую очередь.

Верно. Но просто файловая помойка неудобна. Если я потом сделаю clone, он мне отправит весь мой каталог разработки, а это примерно 4 ГБайта. И я такому клонированию не обрадуюсь. Smiley Поэтому первый же вопрос появляется, как разграничить проекты. Но автор книжки про этот вопрос забыл. Кстати,я так и не понял, могу ли я на локальной машине (т.е. не используя URL) клонировать репозиторий или нет? Типа git clone myproject.git.  Вроде бы нет - нужно поднимать сервер. И я также не понял, откуда берётся этот файл с расширением .git в репозитории (например, в сетевом). Изначально-то его нет в каталогах git, даже с созданным и инициализированным проектом. Но, возможно, я просто ещё не дочитал до нужного места.

Цитировать
Если найдутся - он уведомит и сделает прериндексацию изменив состояние репозитория.

Да. Но вот чтобы понять, как наши с Васей правки будут конфликтовать, придётся с консолью разбираться основательно. Надо попробовать поставить графическую оболочку. С git у меня ещё проблема одна - ему в текущей версии минимум Vista нужна. А у меня XP и обновлять я не планирую. Portable-версия запускается, но частенько не находит нужного в штатных dll Windows XP (что-то там с функцией синхронизации чего-то выскакивает). Но вроде как всё равно работает.
Записан

И день и ночь в пути
Страниц: [1] 2
  Печать  
 
Перейти в: