JavaRush/Курсы/Java Collections/Системы контроля версий

Системы контроля версий

Открыта

— Привет, Амиго!

— Привет!

— Сегодня я расскажу тебе о системах контроля версий.

Как ты уже, наверное, знаешь, программы часто бывают очень большими и пишутся очень долго. Иногда десятки человек могут писать программу годами.

Проекты с миллионом строк кода – это реальность.

— Ничего себе.

— Это все очень сложно. Люди часто мешают друг другу, часто меняют один и тот же код и т.д. и т.п.

Чтобы внести порядок в эту неразбериху, программисты начали пользоваться системами контроля версий для кода своей программы.

Система контроля версий – это программа, представленная в виде клиента и сервера.

На сервере программа хранит данные (код, который пишут программисты), а программисты, с помощью программ-клиентов, добавляют или меняют его.

Основное ее отличие от просто программ, которые позволяют распределённую работу с документами, это то, что она хранит все предыдущие версии всех документов (файлов с кодом).

— А можно больше подробностей. Как это все работает?

— Вот представь, что ты – программист и хочешь внести небольшие изменения в исходный код программы, который хранится в репозитории (хранилище) на сервере.

Для этого тебе надо:

1) Залогиниться на сервер (Login).

2) Скопировать последнюю версию всех файлов к себе на компьютер – команда Checkout.

3) Внести изменения в нужные файлы.

4) Запустить программу локально и проверить, что она компилируется и работает.

5) Отправить свои «изменения» на сервер – команда Commit.

— В общем ясно.

— Но и это еще не все. Вот представь, что ты пришел утром на работу, а в Индии уже обед и твои индийские коллеги уже что-то поменяли, и закоммитили свои изменения в ваш репозиторий (хранилище) на сервере.

Тебе же надо работать с последней актуальной версией данных. Тогда ты выполняешь команду Update.

— А в чем ее отличие от Checkout?

— Checkout предназначена для копирования всех файлов репозитория, а команда Update – только для тех файлов, которые обновились на сервере, со времен последней твоей команды Checkout/Update.

Вот как примерно это работает:

Checkout:

Системы контроля версий - 1

Теперь допустим, мы изменили файл B и хотим залить его на сервер. Для этого надо использовать команду Commit:

Системы контроля версий - 2

А вот как работает команда Update:

Системы контроля версий - 3

— Как интересно. А есть еще команды?

— Да, и довольно много. Но они могут быть разные в зависимости от того, какую именно программу контроля версий ты выберешь. Поэтому я стараюсь рассказывать только общие принципы.

Есть еще такая операция, как мэрджинг – объединение двух документов. Допустим, два программиста одновременно меняли один и тот же файл. Тогда программа на сервер не даст обоим его закоммитить. Кто первый – тот и прав.

— А что делать второму?

Второму предложат сделать Update, чтобы забрать к себе последние изменения с сервера. Это кстати хороший стиль – перед коммитом делать Update

Затем, во время исполнения операции Update, программа-клиент попробует объединить локальные изменения с изменениями, полученными с сервера.

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

Такое часто случается, когда например, оба программиста добавили что-то в конец файла.

— Ясно. Разумно, в общем.

— И еще одна вещь – ветки.

Представь, что двум программистам из команды дали задание переписать один модуль. Или, ещё лучше – написать его заново. Пока этот модуль закончен не будет, программа не сможет работать, а может быть даже и компилироваться.

— Что же делать?

— Для этого в репозиторий добавили ветки (branches). Т.е. грубо говоря – разделили репозиторий на две части. Но не по файлам или директориям, а по версиям.

Представь, что электричество так и не было открыто, и роботы не были бы изобретены. Тогда не было бы трех освободительных войн, и вся история людей прошла бы по совсем иному пути.

Такой путь – это и есть альтернативная ветка истории.

Или можешь просто попробовать представить, что ветка – это просто копия репозитория. Т.е. в какой-то момент, мы клонировали репозиторий на сервере и у нас кроме главного (который часто называют trunk – ствол) появился еще один – branch (ветка).

— Ну, так вроде понятнее.

А почему нельзя было просто сказать, что мы скопировали репозиторий?

— Это не есть копирование в чистом виде.

Такие ветки можно не только отделять от ствола (trunk), но и присоединять к нему.

— Т.е. можно какую-то работу выполнить в ветке, а когда она будет закончена – добавить репозиторий-ветку к репозиторию-стволу?

— Ага.

— И что при этом станет с файлами?

— Файлы смерджатся (объединятся).

— Ну, звучит круто, надеюсь так же круто и работает.

— А то. Ладно, давай делать перерыв.

Вот тут очень много полезной информации.

Комментарии (33)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
23 декабря 2024, 10:49
кто это писал? информация совершенно не верная, только запутает в будущем тех, кто впервые это изучает. Например, чтобы скачать весь репозиторий к себе нужна команда clone, а затем такие команды как pull и fetch , а не checkout(команда смены ветки) для выгрузки информации на сервер нужна команда push, а commit создает точку на ветке , где будут сохранены все текущие изменения
Артём Сёмкин
Уровень 47
23 апреля 2025, 07:52
билабол.....
Kurama
Уровень 50
29 января 2023, 20:28
Пока всё очень понятно
SomeBody098веник в бане
13 октября 2024, 17:32
пока... 😈
Anonymous #3062817
Уровень 47
16 ноября 2022, 18:14
Основное ее отличие от просто программ,
 которые позволяют распределённую
работу с документами, это то, что она
хранит все предыдущие версии всех
документов (файлов с кодом).
Что тут сказано раз 10 прочитал и не понял
Виктор
Уровень 1
7 декабря 2022, 18:55
я так понимаю имеется в виду следующее: представьте, что у вас есть документы на гугл-диске, вы и кто-то еще можете одновременно с ними работать, даже с одним и тем же. Круто да? Но вы не можете вернуться к состоянию документа, например на 1- дней назад. у вас есть только здесь и сейчас. То есть, если кто-то что-то вам испортил вы не сможете вернуть испорченное без резервной копии. Система контроля версий позволяет сделать "снимок" вашего документа на определенный момент, который по своей сути является точкой восстановления, и потом вернуться к этому "снимку". При этом вы как и в первом случае работаете сообща с документами. Ну и дополнительные плюшки типа ветвления, объединения веток и так далее.
IwanIV
Уровень 41
28 декабря 2021, 13:25
За Git и контроль версий надо было рассказывать в начале курса, когда рассказывали про Идею.
wokku
Уровень 51
17 июля 2023, 15:53
На кой эти знания в начале?
Ars
Уровень 41
21 ноября 2021, 14:20
Перевод trunk как ствол - очень странный перевод...
SchlechtGut
Уровень 2
30 ноября 2021, 15:32
ствол дерева это же trunk, логично получается
aleksdenni
Уровень 37
9 сентября 2021, 19:52
Раз все оставляют ссылки то и я оставлю введение в гит 😸
Иван
Уровень 1
21 декабря 2020, 15:43
Могу посоветовать неплохой курс по GIT на GeekBtains "Git. Базовый курс" - он абсолютно бесплатный, состоит из 13 уроков, объясняют все с самого нуля (включая установку и настройку GIT) - вполне полезно, я считаю)
15 июля 2021, 10:03
Отличный курс, тоже его прошел
Raphael
Уровень 41
10 декабря 2020, 07:04
Stepan A.
Уровень 1
16 июня 2020, 09:06
Edward Northwind
Уровень 37
18 января 2023, 18:22
Вот бы кто что-то подобное для регулярных выражений сделал. А то они нужны раз в 100 лет, но когда нужны — уже ничего не помнишь и нужно с нуля начинать.
ivan дворник
9 июля 2023, 17:43
Vorlock
Уровень 31
22 января 2020, 02:55
5) Отправить свои «изменения» на сервер – команда Commit. если говорить в рамкам git - то это не верное утверждение. на сервер отправляет команда push. а commit добавляет внесенные изменения в local area.
alex
Уровень 41
25 апреля 2020, 07:59
тут говориться не про конкретную систему а в общем, в следующей лекции будет уже про гит