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

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

Java Collections
5 уровень , 1 лекция
Открыта

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

— Привет!

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

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

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

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

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

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

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

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

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

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

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

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

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), но и присоединять к нему.

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

— Ага.

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

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

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

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

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

Комментарии (35)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
23 декабря 2024
кто это писал? информация совершенно не верная, только запутает в будущем тех, кто впервые это изучает. Например, чтобы скачать весь репозиторий к себе нужна команда clone, а затем такие команды как pull и fetch , а не checkout(команда смены ветки) для выгрузки информации на сервер нужна команда push, а commit создает точку на ветке , где будут сохранены все текущие изменения
Артём Сёмкин Уровень 47
23 апреля 2025
билабол.....
Kurama Уровень 50
29 января 2023
Пока всё очень понятно
SomeBody098 Уровень 51
13 октября 2024
пока... 😈
Anonymous #3062817 Уровень 47
16 ноября 2022

Основное ее отличие от просто программ,
 которые позволяют распределённую 
работу с документами, это то, что она 
хранит все предыдущие версии всех 
документов (файлов с кодом).
Что тут сказано раз 10 прочитал и не понял
Виктор Уровень 1
7 декабря 2022
я так понимаю имеется в виду следующее: представьте, что у вас есть документы на гугл-диске, вы и кто-то еще можете одновременно с ними работать, даже с одним и тем же. Круто да? Но вы не можете вернуться к состоянию документа, например на 1- дней назад. у вас есть только здесь и сейчас. То есть, если кто-то что-то вам испортил вы не сможете вернуть испорченное без резервной копии. Система контроля версий позволяет сделать "снимок" вашего документа на определенный момент, который по своей сути является точкой восстановления, и потом вернуться к этому "снимку". При этом вы как и в первом случае работаете сообща с документами. Ну и дополнительные плюшки типа ветвления, объединения веток и так далее.
Дмитрий Рыбин Уровень 41
1 февраля 2022
IwanIV Уровень 41
28 декабря 2021
За Git и контроль версий надо было рассказывать в начале курса, когда рассказывали про Идею.
wokku Уровень 51
17 июля 2023
На кой эти знания в начале?
Ars Уровень 41
21 ноября 2021
Перевод trunk как ствол - очень странный перевод...
SchlechtGut Уровень 51
30 ноября 2021
ствол дерева это же trunk, логично получается
aleksdenni Уровень 37
9 сентября 2021
Раз все оставляют ссылки то и я оставлю введение в гит 😸
Иван Уровень 41
21 декабря 2020
Могу посоветовать неплохой курс по GIT на GeekBtains "Git. Базовый курс" - он абсолютно бесплатный, состоит из 13 уроков, объясняют все с самого нуля (включая установку и настройку GIT) - вполне полезно, я считаю)
15 июля 2021
Отличный курс, тоже его прошел