
여러 명이서 프로젝트를 할 때에 GitHub를 접해보거나 실제로 사용해본 경험이 있으실 것입니다.
GitHub는 Git으로 관리하는 프로젝트를 올려둘 수 있는 사이트를 말하는데, 오늘은 이 Git이 무엇인지에 대해서 알아보도록 하겠습니다.
🧐 Git?
Git은 한 줄로 정리하자면, 버전 관리 시스템입니다.
쉽게 말하면, 말 그대로 '버전'을 관리할 수 있는 수단입니다. 수정 사항이나, 업데이트 사항 등을 그때 그때 바로 반영 할 수 있도록 하는 시스템을 말합니다.
그렇다면 버전 관리라는 것은 무엇일까요?
🧐 버전이란?
버전은 이전과 약간씩은 다른 변화을 구분하는 표시입니다.
🧐 버전 관리는 왜 해야할까?
프로그램이 아주 가볍다면 모를까 실제 실무에서 사용하는 프로그램이나 시스템들은 매우 복잡하고 한 번에 모두 완성되는 것이 아닙니다. 이전의 것들에 조금씩 추가해가면서 완성이 됩니다. (만약 한 번에 완성시키려고, 버전 하나만 고집해서 올린다면 오류가 발생했을 때, 어디서 어떻게 발생했는지 찾기가 매우 어렵겠지요?...)
이러한 개발의 과정에서 실수가 있었고 특정 기능이 동작하지 않거나 테스트가 통과되지 않는다면 우리는 어떻게 해야 할까? 이전에 있던 코드로 다시 일일이 돌려놔야 할 것입니다. 그러면 우리 머리 속에서는 이전 것을 저장해두면 좋지 않을까? 라는 생각이 자연스럽게 들 것이고 이를 구현한 것이 버전 관리 시스템입니다.
🧐 버전 관리 시스템(Version Control System)
같은 파일에 대해서 어떤 날짜마다 수정했을 때, 파일_20231219, 파일20231220 등 다른 네이밍을 통해 이전 것에 더한 파일들을 만들어봤던 경험이 있을 것입니다. 그런데 이렇게 다른 이름으로 저장함으로써, 생기는 문제가 무엇일까요?
이전 버전에 대한 정보를 계속 저장하다 보면 용량이 점점 늘 것이고, 혼자 작업한다면 괜찮겠지만, 여러 명이서 같이 작업할 때에는 파일명을 어떤 방식으로 지어야하는지도 정해야하고, 그 정한 규칙을 지켜야할 것입니다.
이는 매우 번거롭고, 비효율적입니다. 이로 인해 탄생한 버전 관리 시스템(VCS)의 종류에 대해 알아보겠습니다.
🚀 집중형
집중한다는 말 그대로 모든 소스 코드가 한 곳에 집중되어 있는 형태입니다.
하나의 메인 중앙 서버에서 개발 구성원의 모든 소스 코드를 통합적으로 관리합니다. (이로 인해서 클라이언트-서버 모델이라고도 함.)
장점은 저장소 하나로 관리하기 때문에 시스템 운영이 쉬울 수 있습니다.
단점으로는, 중앙 저장 서버에 문제가 생기면 모든 개발자가 접근하기 어려운 상황이 일어날 수 있다. 또한 여러 개발자가 동시에 접근하면 충돌이 일어날 수 있으니 순서를 지켜서 접근하는 방식을 사용해야 할 것이다.
장단점 모두 존재하지만, 집중형 버전 관리 시스템은 단점이 너무 크기 때문에 잘 사용하지 않습니다.
🚀 분산형
분산형 시스템은 저장소가 분산되어 여러 개 있는 시스템입니다.
여러 저장소에 각 버전별 소스를 개별 보관하고, 각 개발자에게 공유 가능한 저장소 Clone(사본)을 제공합니다. 서버는 단지 각 저장소 자료를 동기화하고 중개하는 역할만 합니다.
장점으로는 메인 서버에 문제가 생기더라도 개발을 진행할 수 있으며 메인 서버의 데이터가 유실되더라도 로컬 저장소에 저장된 데이터로 복구시키기가 용이합니다. 또한, 여러 명이 동시 작업을 할 수 있다는 장점이 있습니다.
단점으로는 시스템에 익숙해지는 데 시간이 걸린다는 단점이 있습니다. (Git Bash 명령어 사용법 숙지 등)
분산형 버전 관리 시스템이 제공하는 장점이 매우 크기 때문에 일반적으로 분산형 버전 관리 시스템을 사용합니다.
이 글의 주제인 깃(Git) 또한 대표적인 분산형 버전 관리 시스템에 해당합니다.
🧐 깃(Git)을 사용하는 이유
우선 앞서 언급했던 것처럼 쉬운 버전관리가 가능합니다.
개발자로서, 수 많은 코드들을 다루고 다른 개발자들과 협업을 진행하다 보면 잦은 업데이트 사항이 생기기 마련입니다. 그럴 때마다 파일 명을 달리하여 새로 저장 해야 한다면? 한 프로젝트 당 코드 파일만 수 십, 수 백 수 천개가 될 수도 있습니다.
📌 깃을 사용하면 굳이 이러한 번거로운 과정 없이도 다른 개발자들과 손 쉽게 코드를 주고 받을 수 있으며, 여러 명이 동시에 한 코드를 가지고 작업하는 병렬적인 작업의 진행이 가능하다.
A라는 개발자가 코드를 작성하여 B에게 넘겨주고, B가 그 코드를 받아서 진행 한 뒤 C에게 넘겨주는 귀찮은 과정이 필요 없어진 것입니다. 여러 브랜치를 형성해 작업한 뒤, 마지막에 합치는 방식을 통해 효율적인 작업이 가능합니다.
또한, 메인 서버에 반영한 버전에 오류가 생겼을 때, 쉽게 이전 버전으로 이동할 수 있으며 다시 원래의 버전으로 돌아오는 것 또한 자유롭습니다.
그리고, 깃(Git)은 분산 버전 관리 시스템이기 때문에 인터넷이 연결 되어 있지 않은 상황에서도 개발이 가능하며, 도중에 이상이 생겨 저장소가 날라가버린다고 해도 쉽게 복구할 수 있습니다.
정리하면 다음과 같습니다.
- 대표적인 분산형 버전 관리 시스템. 원격 저장소와 별개로 개발자 각각의 로컬 컴퓨터에 완벽한 복제본 소스 코드를 저장할 수 있다.
- 네트워크나 인터넷이 연결되어 있지 않아도 로컬 컴퓨터에서 버전을 관리 할 수 있다.
- 원격 저장소로 많은 개발자의 저장소와 연결하거나 동기화 작업을 할 수 있다.
이러한 특징으로 인해서 우리가 한 원격 저장소를 두고 서로 각자 개발하면서 코드를 작성하거나 수정할 수 있는 것입니다.
🧐 Git vs GitHub
맨 처음에 언급을 하기는 했지만, 혼동할 수 있기에 한 번 더 짚고 넘어가도록 하겠습니다.
🚀 깃(Git)
- 로컬에서 관리되는 버전 관리 시스템
- 직접 소스 코드를 수정함으로서 버전을 관리
- 소스 코드를 효율적으로 관리할 수 있게 해주는 형상 관리 도구
🚀 깃허브(GitHub)
- 깃(Git)을 사용하는 프로젝트를 지원
- 개발자들의 버전 제어 및 협업을 위한 하나의 플랫폼
- 직관적이고, 시각화되어 있는 유저 인터페이스를 제공
- 클라우드를 통해 관리되는 버전 관리 시스템
- 오픈 소스는 일정 부분 무료로 사용이 가능하나(오픈소스 프로젝트로 인기 있는 이유), 대부분 유료 시스템
- 깃처럼 자체적으로 구축하는 시스템이 아닌, 클라우드를 빌려쓰는 개념
✔️ Git이 버전관리 시스템이라면 Git hub는 Git을 사용하는 프로젝트를 위한 클라우드 기반 호스팅 서비스라고 할 수 있습니다.
따라서 타 개발자들과의 협업 시, Github를 써서 오픈 소스를 공유하거나 타 개발자들과 의견을 교환할 수 있습니다.
🧐 Git의 주요 개념
✔️ 깃을 사용하기 위해서 알아두어야 할 중요한 개념들에 대해 알아보겠습니다.
1️⃣ Repository (저장소) : 소스 코드들이 저장되어 있는 물리적인 공간을 의미한다. 저장소를 통해서 작업자가 진행, 변경했던 사항들에 대해 알 수 있다.
작업을 시작할 때 원격 저장소에서 로컬 저장소로 소스 코드를 복사해서 가져오고(Clone), 이후 소스 코드를 변경한 다음 커밋(Commit)한다. 이 때, 커밋한 소스는 로컬 저장소에 저장되며, Push 하기 전에는 원격 저장소에 반영되지 않는다.
2️⃣ Working Tree : 흔히 우리가 사용하는 '폴더'를 말한다.
3️⃣ Index (= Staging Area) : Commit을 실행하기 전의 저장소와 Working tree 사이에 존재하는 공간을 말한다. Working Tree -> Index -> Commit 순의 절차를 거친다.
4️⃣ Commit : 작업 과정들에 대한 점검을 마친 뒤, 저장소에 남기는 과정을 의미한다. 각각의 커밋 단계는 의미 있는 단계이다. 따라서 커밋 로그를 남긴다. git log라는 명령어를 통해 커밋된 사항들에 대해 확인 할 수 있다.
5️⃣ Checkout : 특정 시점이나 branch의 소스 코드로 이동하는 것을 의미한다. 이 과정을 통해 과거 여러 시점의 소스 코드로 이동할 수 있다.
6️⃣ Branch : Commit 단위로 구분된 소스 코드 타임라인에서 분기해서 새로운 commit을 쌓을 수 있는 가지를 만드는 것을 말한다. Branch에서 작업을 완료하면, Merge 작업을 수행한다.
7️⃣ Merge : Branch와 Branch의 내용을 합치는 작업, 즉 병합을 말한다. Branch와는 다소 반대되는 개념이다. 병합 과정 중 두 branch에서 하나의 동일한 파일에서 서로 다른게 수정한 경우 충돌이 발생하며, 병합이 일시정지 된다. 이 때, 충돌 부분에 대해 직접 수정하거나 Merge Tool 등을 활용하여 충돌을 해결한 뒤 병합을 계속 진행한다.
🧐 Git의 명령어
✔️ 깃의 명령어 중 자주 쓰이는 주요 명령어들에 대해 알아 보겠습니다.
- git init : 깃 초기화. 이 명령어를 실행해야만 깃이 실행된다. 이 명령어 실행 전까지는 그냥 일반 폴더일 뿐이나, 이후엔 추가적인 명령어들을 통해 작업을 진행 할 수 있다.
- git status : 깃 저장소의 상태를 확인한다. 이 명령어를 통해 현재 상태가 어떤 지 수시로 확인 가능하다.
- git add : 커밋에 파일의 변경 사항을 포함하도록 한다. 이 명령이 저장소에 새 파일들을 직접적으로 추가하진 않는다.
- git commit : "git commit -m '저장명'" 등과 같은 명령어로 주로 사용한다. 이 명령어를 통해 커밋을 생성하고, 변경 사항을 확정하여 반영한다.
- git clone : 기존 소스 코드 다운로드 및 복제한다. 즉, 원격 저장소의 저장소를 로컬에서 이용할 수 있도록 복사해 가져온다.
- git remote -v : 로컬과 연결된 원격 저장소들의 정보를 보여준다.
- git log : 나의 커밋 내역에 대해 알고 싶을 때 사용하면 현재 커밋 목록들을 확인 가능하다.
- git checkout : 브랜치에서 브랜치로 이동 가능하다. 현재 버전에서 이전 버전의 커밋으로 이동하거나 변경 전의 브랜치로 접근 가능하다.
- git checkout main : 이전 버전, 변경 전 브랜치에서 다시 현재의 (main) 브랜치로 되돌아 올 수 있다.
- git push : 소스 코드의 변경 사항을 원격 저장소에 반영한다.
- git pull : 원격 저장소의 변경 내용이 현재 디렉토리로 가져와진 뒤, (fetch) 병합된다.
- git merge : 변경 사항 등이 모두 확정되고 난 후, 브랜치들을 병합한다. 작업 마무리 단계에서 시행한다.
- git tag : 현재 등록된 태그의 목록을 표시한다.
- git branch <브랜치이름> : 새 브랜치 생성를 생성한다 (local로 만듦)
- git checkout <브랜치이름> : 해당 브랜치로 이동한다.
- git remote rm origin : 로컬과 연결된 원격 저장소를 삭제한다
📕 Reference
git이란 무엇인가?
velog.io