GIT

소스트리를 사용한 GIT-FLOW 전략(1) - 깃의 개념과 용어 설명

진짠 2023. 5. 4. 23:12
728x90
개요

회사에서 프로젝트를 진행하던 도중 깃 충돌이 발생했다.

항상 feature 브랜치에서 develop 브랜치로 merge 하거나 개발한 뒤 커밋 후 push 만 하던 내가 처음으로 develop 브랜치에서 feature 브랜치들을 merge하여 소스를 합친 뒤 배포하는 작업 과정에서 생긴 오류였다.

중요한 건 오류가 났는데 해결을 못하겠다.

충돌이 나서 소스 합치는 것은 둘째 치더라도 원격 develop 브랜치에 이상한 소스(내 기준)를 merge 해서 100몇개의 소스를 pull 해버렸는데 손을 쓸 수가 없었다. (...)

 

결국 책임님께 도움을 구해 해결은 했지만 재발 방지를 위해 GIT에 개념에 대해 더 완벽하게 이해하고, 충돌이 발생했을 때 소스를 머지하는 방법에 대해서도 짚고 넘어가야겠다고 생각했다.

 

깃(GIT)

깃은 분산 버전 관리 시스템(DVCS)다. 저장소를 통째로 복사해서 복제물로 작업할 수 있다. 클라이언트 중 아무거나 골라서 서버를 복원할 수 있다. 이 환경에서는 원격 저장소가 존재한다. 원격 저장소는 여러개일 수 있다. 그래서 사람들은 동시에 다양한 그룹에서 다양한 방법으로 협업할 수 있다.

 

깃은 커밋 시, 수정한 현재 데이터의 스냅샷에 대한 포인터(변경된 데이터 자체), 저자나 커밋 메시지 같은 메타 데이터, 이전 커밋에 대한 포인터를 포함한 커밋 개체를 저장한다. 이전 커밋 포인터가 있어 현재 커밋이 무엇을 기준으로 바뀌는지 알 수 있다. 최초 커밋을 제외하고 모두 이전 커밋 포인터가 존재하며 여러 브랜치의 작업을 합친 merge commit은 이전 커밋 포인터가 여러개 있다.

 

커밋 작업을 마치면 그림과 같이 저장소에는 각 파일에 대한 Blob, 파일과 디렉터리 구조가 들어있는 트리 개체 하나, 메타데이터와 루트 트리를 가리키는 포인터가 담긴 커밋 개체 하나가 생긴다.

 

다시 파일을 수정하고 커밋하면 이전 커밋이 무엇인지 저장된다.

용어

필자의 회사에서는 'SourceTree' 라는 GIT GUI를 사용한다. 커맨드로 관리하는 것 보다 훨씬 직관적이고 무료로 사용 가능하다.

여기서 쓰이는 용어(=Git에서 쓰이는 용어)를 짚고 넘어가보자.

 

  • 저장소(Repository) : GIT으로 관리할 소스들이 모여있는 곳, 폴더의 개념. 하나의 프로젝트 폴더가 저장소가 된다.
  • 커밋(Commit) : GIT에서 버전을 기록하는 단위.
  • 원격 저장소 : 웹 서버에 올린 GIT 저장소(Github, Bitbucket)
  • 스테이지(Stage) : 하나의 버전으로 저장할 파일들을 위할 공간. 버그를 수정한 A파일, 기능을 추가한 B파일이 있다고 가정했을 때, A파일을 스테이지에 올려 버그 수정 버전으로 기록하고 B파일을 스테이지에 올려 기능 추가 버전으로 기록할 수 있다. 여러개의 버전을 난잡하지 않게 관리함. 저장할 파일들의 Index 라고도 한다.
  • 푸쉬(Push) : 인터넷의 업로드하는 것과 같은 개념. 내가 개발한 작업물을 commit을 통해 하나의 버전으로 기록하고 push하여 저장소에 올려 공유할 수 있다.
  • 풀(Pull) : 인터넷의 다운로드하는 것과 같은 개념. 다른 사람이 커밋하고 푸쉬한 여러 작업물을 내 로컬 저장소에 동기화시키는 기능이다.
  • 클론(Clone) : 원격 저장소 전체를 복사하여 내 로컬 저장소에 가져오는 기능. 한번 복제한 뒤 원격 저장소에 올라온 새로운 커밋들을 pull해서 가져온다.
  • 브랜치(branch) : 소스코드 타임라인에서 새로운 작업을 하거나 할 때 새로운 커밋을 할 수 있는 가지를 만드는 것. 가지치기 개념. 원래 코드와 상관없이 독립적인 개발을 진행한다. 최초 커밋 시 마스터(master) 브랜치를 생성한다.
  • 체크아웃(Checkout) : 해당 브랜치에서 다른 브랜치로 전환하거나 현재 작업중인 파일을 복원할 때 사용한다. 
  • 병합(Merge) : 해당 브랜치에서 다른 브랜치의 모든 변경사항을 합치고 싶을 때 사용하는 기능이다.
  • 재배치(Rebase) : 병합과 마찬가지로 다른 브랜치와 합치는 기능. 차이점이라면 commit log를 한 줄로 통일시켜 간단하게 만들 수 있다. 공유하는 브랜치를 재배치하면 커밋 해쉬 값이 변경되므로 사용하면 안된다.
  • 아카이브(Archive) : 해당 깃에서 소스 코드만 추출하여 사용할 때 기능이다.
  • 쌍방향 재배치(Squash) : 이전 커밋과 다른 커밋들을 합치고 싶을 때 사용하는 기능이다.
  • 체리 픽(cherry pick) : 다른 브랜치에서 내가 원하는 커밋만 가져올 수 있는 기능이다.
브랜치

Git의 브랜치는 커밋 사이를 이동할 수 있는 포인터 같은 존재다. 기본적으로 master 브랜치는 생성하면 최초 커밋을 가리키고 이후 커밋을 만들면 가장 마지막 커밋을 가리킨다. 현재 속한 브랜치에 가장 최근 커밋을 HEAD 라고 한다.

728x90