Найти тему
Журнал «Код»

Мальчик заливает на FTP, мужчина поднимает Git

Оглавление

Зачем нужен кон­троль вер­сий и что делать, если ваши дру­зья его исполь­зу­ют.

Кон­троль вер­сий — мега­по­лез­ная вещь, когда речь идёт о про­грам­ми­ро­ва­нии в коман­де. Сего­дня пока­жем, что это и как при­мер­но поль­зо­вать­ся.

Зачем нужна система контроля версий

Допу­стим, у нас есть про­грам­мист Вася, кото­рый пишет весь код у себя на ком­пью­те­ре. Вася — про­дви­ну­тый про­грам­мист, поэто­му перед каж­дым боль­шим изме­не­ни­ем дела­ет пол­ную резерв­ную копию все­го кода. Так он не боит­ся что-то поло­мать: все­гда мож­но отка­тить­ся на преды­ду­щую вер­сию. Резерв­ные копии он хра­нит на отдель­ной флеш­ке. Если сго­рит ком­пью­тер, флеш­ка оста­нет­ся.

Ско­ро Вася пони­ма­ет, что сле­дить за изме­не­ни­я­ми в коде слож­но: он не пом­нит, что меня­лось от вер­сии к вер­сии. Вася запи­сы­ва­ет изме­не­ния в блок­нот, но это ско­ро пере­ста­ёт рабо­тать: блок­нот не видит кон­крет­ные кус­ки про­грам­мы и не может пока­зать, в каких кон­крет­но местах что поме­ня­лось.

Через пару меся­цев с блок­но­том Вася пони­ма­ет: надо что-то менять. Он идёт в интер­нет и чита­ет ста­тью про систе­мы кон­тро­ля вер­сий (СКВ).

Что это такое

Систе­мы кон­тро­ля вер­сий — это шту­ки, кото­рые помо­га­ют раз­ра­бот­чи­кам ори­ен­ти­ро­вать­ся в коде и нахо­дить отсле­жи­вать изме­не­ния. СКВ могут вер­нуть нуж­ные фай­лы в исход­ное состо­я­ние или пока­зать вам толь­ко те изме­не­ния, кото­рые вы сде­ла­ли за опре­де­лён­ное вре­мя.

При­мер­ный сце­на­рий: в про­шлую пят­ни­цу Вася напил­ся и ночью кодил пья­ным. Утром в суб­бо­ту при­шли его дру­зья, он пока­зал им свой код, и один из тим­ли­дов сел пере­пи­сы­вать его систе­му запро­сов к базе дан­ных. Потом в вос­кре­се­нье у него было сви­да­ние с девуш­кой, и она пока­за­ла ему, что мож­но исполь­зо­вать дру­гой обра­бот­чик оши­бок.
В поне­дель­ник Вася понял, что не всё из того, что про­изо­шло на выход­ных, долж­но остать­ся в ито­го­вом коде. Он откры­ва­ет СКВ и видит все изме­не­ния, раз­ло­жен­ные по вре­ме­ни, с под­свет­кой:
«Ага, тут я кодил пья­ным. Вот место, кото­рое я пере­пи­сал. Нор­маль­но. Надо толь­ко поме­нять назва­ния пере­мен­ных».
«Это мои дру­зья коди­ли. Сно­сим всё, чер­то­вы пижо­ны».
«А новый обра­бот­чик оши­бок хорош. Возь­му этот код в дру­гие про­ек­ты».

СКВ пря­мо пока­зы­ва­ет: «Тогда-то было сде­ла­но такое-то изме­не­ние, вот, посмот­ри».

Как реализована

Сей­час есть три прин­ци­пи­аль­ных моде­ли реа­ли­за­ции СКВ: локаль­ная, цен­тра­ли­зо­ван­ная и рас­пре­де­лен­ная.

Самая про­стая реа­ли­за­ция СКВ — локаль­ная. Это зна­чит, что все изме­не­ния и резерв­ные копии хра­нят­ся у вас на ком­пью­те­ре в спе­ци­аль­ной базе дан­ных. Вы не зави­си­те от интер­не­та, пол­но­стью кон­тро­ли­ру­е­те код и може­те раз­ра­ба­ты­вать сек­рет­ные вещи.

СКВ послож­нее — цен­тра­ли­зо­ван­ная. Их при­ду­ма­ли, что­бы несколь­ко про­грам­ми­стов мог­ли рабо­тать над одним про­ек­том не мешая друг дру­гу. Такая систе­ма кон­тро­ля вер­сий состо­ит из сер­ве­ра, на кото­ром нахо­дит­ся репо­зи­то­рий, и рабо­чих стан­ций, кото­рые под­клю­ча­ют­ся к сер­ве­ру для рабо­ты над фай­ла­ми. Репо­зи­то­рий — это место, где хра­нят­ся все нуж­ные фай­лы, про­ще гово­ря — пап­ка со все­ми рабо­чи­ми фай­ла­ми по про­ек­ту.

Когда над одним фай­лом или моду­лем рабо­та­ют несколь­ко про­грам­ми­стов, сер­вер смот­рит, какие изме­не­ния вно­сит каж­дый про­грам­мист, и если они дела­ют раз­ные вещи в одном и том же месте — выда­ёт сооб­ще­ние или бло­ки­ру­ет рабо­ту одно­го из них. Типа: «Вы исправ­ля­е­те один и тот же кусок кода, оксти­тесь».

Мож­но сде­лать так, что каж­дый ска­чи­ва­ет себе рабо­чую копию все­го репо­зи­то­рия, рабо­та­ет в нём, а в кон­це дня отправ­ля­ет его обрат­но на сер­вер. Сер­вер смот­рит, мож­но ли объ­еди­нить эти фай­лы без оши­бок, и если нет — пока­зы­ва­ет кон­фликт­ные места, где два про­грам­ми­ста напи­са­ли в одном месте раз­ный код.

С такой орга­ни­за­ци­ей уже мож­но рабо­тать коман­дой над одним про­ек­том, но в ней есть одно сла­бое место — сер­вер. Если он вый­дет из строя, коман­да поте­ря­ет про­ект.

Рас­пре­де­лён­ные СКВ реша­ют эти про­бле­мы так: каж­дый раз­ра­бот­чик полу­ча­ет не про­сто несколь­ко нуж­ных для рабо­ты фай­лов, а весь репо­зи­то­рий цели­ком. Если сер­вер вый­дет из строя, он про­сто возь­мёт пол­ный репо­зи­то­рий у любо­го про­грам­ми­ста и ска­ча­ет его себе. Точ­но так же и с осталь­ны­ми чле­на­ми коман­ды — если что-то пошло не так, все­гда мож­но взять акту­аль­ные фай­лы у дру­гих.

Сов­мест­ная рабо­та тоже ста­ла про­ще: все про­грам­ми­сты рабо­та­ют над сво­им кодом, а потом отправ­ля­ют изме­не­ния на сер­вер. Но они не попа­да­ют сра­зу в репо­зи­то­рий, а ждут одоб­ре­ния глав­но­го раз­ра­бот­чи­ка или ответ­ствен­но­го за про­дукт. Если он одоб­ря­ет запрос на добав­ле­ние кода — этот код ста­но­вит­ся частью репо­зи­то­рия и сра­зу досту­пен для ска­чи­ва­ния дру­ги­ми участ­ни­ка­ми. Таких запро­сов на добав­ле­ние может быть мно­го, поэто­му нуж­но посто­ян­но про­ве­рять, что же имен­но дела­ет новый код и нуж­но ли его добав­лять в про­ект.

Причем тут Git

Git — это очень попу­ляр­ная систе­ма кон­тро­ля вер­сий. Её при­ду­мал в 2005 году Линус Торвальдс, раз­ра­бот­чик ядра Linux, что­бы вме­сте с това­ри­ща­ми рабо­тать над новой опе­ра­ци­он­ной систе­мой.

Основ­ное пре­иму­ще­ство Git — ско­рость рабо­ты, про­сто­та и рабо­та с боль­ши­ми про­ек­та­ми. В отли­чие от дру­гих систем кон­тро­ля вер­сий, Git не запи­сы­ва­ет изме­не­ния к каж­до­му фай­лу, а как бы фото­гра­фи­ру­ет весь про­ект цели­ком.

Сам по себе Git — это инстру­мент для команд­ной стро­ки, у него нет гра­фи­че­ско­го интер­фей­са. Но у него доволь­но мно­го при­ло­же­ний с гра­фи­че­ским интер­фей­сом, и в них всё быва­ет доволь­но кра­си­во. На сай­те Git есть ссыл­ки на попу­ляр­ные кли­ен­ты:

Git — не един­ствен­ная систе­ма кон­тро­ля вер­сий, но доволь­но рас­про­стра­нён­ная.
Git — не един­ствен­ная систе­ма кон­тро­ля вер­сий, но доволь­но рас­про­стра­нён­ная.

Не путать с GitHub — это онлайн-сервис, кото­рый осно­ван на тех­но­ло­гии Git. Он хра­нит репо­зи­то­рии в интер­не­те, авто­ма­ти­че­ски син­хро­ни­зи­ру­ет их с репо­зи­то­ри­я­ми у раз­ра­бот­чи­ков, сле­дит за обнов­ле­ни­я­ми кода, поз­во­ля­ет редак­ти­ро­вать код пря­мо в репо­зи­то­рии и копи­ро­вать себе чужие репо­зи­то­рии. Ещё там есть встро­ен­ный тре­кер задач, систе­ма уве­дом­ле­ний, форум, пере­пис­ка меж­ду поль­зо­ва­те­ля­ми и ком­мен­та­ри­я­ми. А всё пото­му, что GitHub заду­мы­вал­ся как соци­аль­ная сеть для про­грам­ми­стов.

Подписывайтесь на наш канал, чтобы уметь сделать правильный выбор!