깃을 사용하고는 있지만 전반적으로 진지하게 쭉 학습해본 경험은 없다.
그저 필요할 때 쑉! 하고 배우고 일단 쓰기 바빴기 때문이다.
시간이 조금 남는 요즘(물론 개인 프로젝트는 진행 중이나) 어떤 부분의 기초를 학습해야 좋을지를 고민했고 이전에 면접에서 질문에 답을 잘 못했다고 생각했던 깃이 떠올랐다.
그래서 이번에는 깃에 대해 전반적으로 학습해보려 한다.
학습에 이용한 레퍼런스는 Git 교과서 라는 서적을 기반으로 했고 구글신의 도움도 받았다.
이번에는 일단 시작이니 조그마하게 적어볼까 한다.
버전이란 사전적으로는 이전의 것과 다른 또는 약간 비슷한 것으로 정의되어 있다.
한 마디로 버전은 이전과 약간씩은 다른 변화을 구분하는 표시이다.
프로그램이 아주 가볍다면 모를까 보통의 경우는 한 번에 모두 완성되는 것이 아니다. 이전의 것에 조금씩 추가해가면서 완성이 된다.
이러한 개발의 과정에서 실수가 있었고 특정 기능이 동작하지 않거나 테스트가 통과되지 않는다면 우리는 어떻게 해야 할까? 이전에 있던 코드로 다시 일일이 돌려놔야 할 것이다.
그러면 우리 머리 속에서는 이전 것을 저장해두면 좋지 않을까? 라는 생각이 자연스럽게 들 것이고 이를 구현한 것이 버전 관리 시스템들이다.
우리는 가장 단순한 버전 관리 시스템을 스스로 만들어 본 적이 있다.
바로 이전 버전의 문서나 코드를 다른 이름으로 저장해두는 것이다.
근데 이거는 무엇이 문제일까?
일단 이전 버전에 대한 정보에 대한 저장을 계속 하다보면 용량이 점점 늘 것이다. 그리고 다른 사람들이랑 협업을 한다고 치면 다 같이 어떤 방식으로 이름을 작명해야 하는지 정해야 할 것이다.
귀찮다… 귀찮음은 항상 개발자들을 일하게 만들었다.
그로 인해 탄생한 버전 관리 시스템의 종류들이 있다.
집중한다는 말 그대로 모든 소스 코드가 한 곳에 집중되어 있는 형태이다.
하나의 메인 중앙 서버에서 개발 구성원의 모든 소스 코드를 통합적으로 관리한다. (이로 인해서 클라이언트-서버 모델이라고도 한다.)
장단점은 무엇일끼?
장점은 일단 저장소 하나로 관리하기 때문에 시스템 운영이 쉬울 수 있다.
그러면 단점은 무엇일까?
일단 중앙 저장 서버에 문제가 생기면 모든 개발자가 접근하기 어려운 상황이 일어날 수 있다. 또한 여러 개발자가 동시에 접근하면 충돌이 일어날 수 있으니 순서를 지켜서 입장하는 방식을 사용해야 할 것이다. (이런 비효율이?!?)
말 그대로 저장소가 여러개 있는 시스템이다.
여러 저장소에 각 버전별 소스를 개별 보관하고, 각 개발자에게 공유 가능한 저장소 사본을 제공한다. 서버는 단지 각 저장소 자료를 동기화하고 중개하는 역할만 한다. 우리가 친숙해하는 깃이 여기에 포함된다.
장단점은 무엇일까?
장점으로는 일단 메인 서버의 문제를 덜 신경써도 된다는 점과 여러명이 동시 작업을 할 수 있다는 장점이 있을 것이다.
단점으로는 시스템에 익숙해지는 데 시간이 걸린다는 단점이 있을 것이다. (깃 명령어를 생각해보면 그럴 수 있을 것 같다.)
깃은 전설의 갓 개발자 리누스 베네딕트 토르발스가 개발했다. (맞다 그 리눅스 개발자)
깃은 몇 가지 특징이 있는데 그 특징은 아래와 같다.
이러한 특징으로 인해서 우리가 한 원격 저장소를 두고 서로 각자 개발하면서 코드를 작성하거나 수정할 수 있는 것이다.
이미지 출처:https://blog.sasworkshops.com/git-basics/
깃의 동작은 크게 다섯 단계로 구분할 수 있다.
다 한 번씩 들어본 친숙한 이름들이다.
하나씩 이제 알아보면서 정리하도록 하겠다.