1. Git이란?
개발자라면 Git을 모를 수가 없을 것이다. 사이드 프로젝트에서든 실무에서든 개발 프로젝트에서는 Git 없이는 개발과 협업이 거의 불가능할 정도로 개발자에게는 필수적인 Tool이다.
Git은 형상 관리 도구(버전 관리 시스템) 중 하나로 소프트웨어를 개발하는 집단에서 코드를 효과적으로 관리할 수 있게 도와주는 무료이자 공개 소프트웨어다. 한 마디로 Git은 여러명의 개발자가 하나의 소프트웨어를 개발할 때 소스코드를 관리를 하기 위해서 사용한다고 생각하면 된다.
(1) Git의 필요성
위에 언급한 것과 같이 Git은 여러명의 개발자가 하나의 소프트웨어를 개발 할 때 소스코드 관리를 위해서 사용한다고 하는 데 그렇다면 어떤 점의 이유 때문에 Git과 같은 버전 관리 시스템을 사용해야할까?
이 글을 읽는 독자라면 고등학교, 대학교, 동아리 등의 집단에서 혼자서 PPT와 같은 산출물을 만드는 것이 아닌 여러명이서 만든 경험이 반드시 있을 것이다. 이 과정에서 발표_20230531.ppt 파일을 만들었다가 팀원의 피드백으로 글자 사이즈를 바꾸어 발표_20230531(1)을 만들고, 잘못된 내용이 있어 발표_완성_20230531, 발표_완성_완성_20230531... 이렇게 무수하게 많은 파일을 만들어본 경험이 있을 것이다. 이 중에서는 또한 여러명이서 만든 PPT를 하나의 산출물로 만들기 위해서 합치는 과정에서 문제를 겪은 자도 분명히 있을 거다.
자 그렇다면 이제 우리의 상황에 맞게 예시를 들어보자. 팀원 3명과 함께 하나의 웹 프로젝트를 만들게 되었다. 그렇다면 각자 작업을 하고 코드는 어떻게 합칠 것인가? 분명 같은 이름의 파일에서 작업하여 작업 내용이 중복되거나 혹은 누락 하는 등의 문제가 반드시 발생할 것이다. 하나의 코드에서 잘못되면 무수히 많은 버그를 발생시키는 소프트웨어를 개발하는 과정에서는 이러한 문제를 방지하는 것이 매우 중요하다. 아무리 잘 짠 코드여도 합치는 데 문제가 있으면 의미가 없다.
이 때 이러한 과정을 도와주는 도구가 버전 관리 시스템, Git이다. Git은 서로의 작업을 공유할 수 있게 하고 이력을 관리하여 버그 및 수정 사항을 쉽게 체크하고 코드를 합치는 과정을 편하게 한다. 또한 브랜치라는 flow와 Commit이라는 작업 단위를 이용하여 버그가 발생하였을 경우 쉽게 대응이 가능하면서 협업이 간단해지는 매우 많은 장점이 있다. 개발자에게 Git은 선택이 아닌 필수요소다.
(2) Commit
commit과 Branch는 버전 관리 시스템의 가장 기본적인 구성 요소 중 하나이다. 먼저 Commit에 대해서 알아보자.
commit은 Git에서 관리 할 수 있는 단위라고 생각하면 된다. 개발자는 자신의 컴퓨터에서 IDE나 Text Editor 등을 이용하여 코드를 작성하고 commit을 할 수 있다. commit은 작업 단위로도 구성하기에 하나의 작업에 하나의 commit을 하는 것이 일반적이며, 그 안에는 수정한 파일 및 내용과 수정한 자, 그리고 수정 일시가 포함되어있다.
만약 내가 Login을 하는 코드를 개발을 하고 commit을 하면 Login을 하기 위하여 작성한 코드와 수정한 자(본인), 수정 시간을 제출(저장)한다고 생각하면 편하다. 그 제출한 commit은 같이 작업하고 있는 작업자들도 확인할 수 있어 다른 사람이 언제 어느 부분을 수정했는 지 간단하게 확인할 수 있다.
commit을 할 때는 내가 어떤 내용을 작업 했는 지에 대한 메세지도 작성할 수 있다. 이 때는 보통 작업한 이력에 따라 작성하게 되며 필자는 feat(추가 기능), fix(버그 수정), doc(문서 수정) 등을 자주 애용한다.
(3) Branch
Git에서 commit은 작업 단위라고 하면 branch는 하나의 flow 흘러가는 흐름이다. branch는 한국어로 직역하면 나뭇가지인데, 이에 따라 나뭇가지에서 다른 나뭇가지가 파생될 수 있고, 또 그 나뭇가지에서 새로운 나뭇가지가 파생될 수 있는 것이 특징이다.
실제로 서비스를 운영하게되면 작업자가 수정한 내용을 바로바로 Live(실제 서비스)에 반영하지 않는다. 개인이 작업한 내용들은 철저하게 branch를 이용하여 작업 이력을 관리하게된다. branch는 쉽게 생각해서 하나의 용도라고 생각하면 된다. Live에 반영될 코드만 들어간 Master Branch, Live 직전에 Test를 진행할 코드가 들어간 Test Branch, 개발자들이 개발 단계에서 사용하는 Develop Branch, 개인의 작업을 진행할 때 사용하는 Featuer Branch 등 많은 단계를 거쳐간다.
일반적인 순서로는 개발자가 작업을 할당 받으면 develop branch(개발 단계 코드)로 부터 자신의 작업을 진행할 branch를 생성한다. 그리고 작업이 마무리되면 develop branch에 합치고(merge) 삭제하는 과정을 거쳐가고 develop branch의 코드는 엄격한 Test 후에 실 서비스인 Master branch에 병합된다.
이 때 Branch를 만들게 되면 다른 Branch에 대해서 독립적이기에 버그 수정이나 새로운 기능을 테스트하기에 매우 용이하다. 또한 Pull Request 등을 이용하여 Code Review도 쉽게 진행할 수 있고 이에 따른 개발자에게 좋은 작업 경험을 제공해준다.
(4) Remote Repository, Github
여태까지 Git에 대한 간단한 구성 원리와 필요성에 대해서 이야기 하였고, 개발자들의 협업을 위해 사용하는 버전 관리 시스템 중 하나가 Git이라고 하였는 데, 그러면 우리가 Git을 통해 관리하는 코드들은 과연 어디에 저장이 될까?? Git을 이용하여 코드를 관리하는 것과 코드를 저장하는 것 이것은 매우 다른 주제의 이야기다.
Git은 commit, branch 등을 통하여 개발자들에게 협업에 있어서 좋은 개발 경험을 제공하는 것은 맞지만, 그것을 저장할 공간을 제공해주지 않는다.(정확히는 Local Repository는 제공이 되지만, Cloud의 Remote Repository는 제공하지 않는다.) 따라서 우리가 Git을 통해서 버전 관리되는 소스코드를 저장할 공간이 필요한데, 이는 보통 Cloud와 같은 곳에 저장하며 이러한 서비스를 제공하는 대표적인 서비스가 Github과 Bitbucket, Git Lab 등이 있다.
Github, Bitbucket 등의 Cloud 서비스는 Git을 이용하여 관리하는 소스코드들을 저장하는 공간을 제공한다. 이는 Git이 소스 코드를 버전관리 할 수 있는 서비스를 제공하는 것과는 다른 것이다. 반드시 구별해야한다.
Git은 단순하게 버전 관리가 되지 않는다. 위의 이미지를 보면 Working Directory, Staging Area, Local Repository, Remote Repository가 있다. 간단하게 글로 적자면 작업자가 작업하는, 작업자 컴퓨터에 존재하는 프로젝트의 위치를 Working Directory라고 하며, 여기서 작성한 코드들을 Staging Area라고 하는 공간에 업로드 할 수 있다.(commit이 아님) 여기서부터 각 파일에 대한 버전 관리가 시작된다고 생각하면 된다. 그 후에 commit 단위를 통하여 Local Repository(로컬 저장소)에 작업 이력을 저장하게 되며, Github와 같은 Remote Repository(원격 저장소)에 코드를 올리면 끝이다.
코드를 올리는 것을 PUSH라고 하는 데, 내가 PUSH한 코드는 타 개발자가 PULL을 하여 Remote Repository로부터 Local Repository에 내가 작업한 이력을 가져올 수 있다.
Github와 같은 곳에서 소스코드를 관리하면 어디에서든 Clone(복사) 기능을 사용하여 Remote Repository에 있는 소스코드를 다운받아서 작업한 후 PUSH 하는 등의 작업이 가능하다.
'CS > Git' 카테고리의 다른 글
[Git] 브랜치(branch) (0) | 2022.06.07 |
---|---|
[Git] 버전 관리 (0) | 2022.06.07 |
[Github] Github 사용하기 (0) | 2022.05.07 |