[Git] Ch.2 Git으로 협업하기

Hwichan Ji·2021년 3월 11일
0

Git

목록 보기
3/8
post-thumbnail

팀 개발을 위한 Git, GitHub 시작하기(정호영, 진유림 지음)으로 공부한 내용을 정리한 글입니다.

Branch란?

Branch 생성 이유

  • branch 없이 커밋 한다면 기본 branchmaster의 커밋이 됨
  • master 커밋은 한 줄로, 시간 순으로 쌓이며 각 커밋들은 이전 커밋을 가리키고 있음

  • 한 커밋을 기준으로 여러 사람이 각각 새로운 버전을 생성한 경우 생성된 버전들은 이전 커밋을 가리켜야 하기 때문에 한 줄로 연결될 수 없음
  • branch라는 새로운 작업 줄기를 생성하여 병렬적으로 연결해야 함

Branch는 포인터

  • branch는 일종의 포인터로 해당 branch에서 생성한 커밋 중 가장 최신 커밋을 가리킴
  • 분기를 만들 때 프로젝트를 통째로 복사해야 하는 SVN 같은 버전 관리 툴과는 달리 Git은 포인터로 분기를 만들기 때문에 가볍고 빠름
  • 복사된 커밋이 아닌 동일한 커밋을 다른 branch가 가리킬 수도 있음
  • 많고 여러 갈래로 나뉜 커밋 중에서 현재 어디에 위치하고 있는지 가리키는 포인터
  • 예를 들어 git checkout을 통해 Master Commit 2로 이동했다면 HEAD는 Master Commit 2를 가리키고 있음
  • HEADmaster branch의 포인터와는 다른 커밋을 가리킨다면 HEADDetached HEAD 상태가 됨

Branch 생성 및 이동

feature branch

  • 일반적으로 master branch에는 직접 커밋하지 않음
  • 일반적으로 기능 개발을 위한 branchfeature/[기능 이름]으로 생성함
  • feature branch에서 기능 개발이 끝나면 master branch에 합침
  • 병합되어 더 이상 필요하지 않은 feature branch는 삭제

checkout

  • branch를 생성할 때 기준(base)이 될 커밋으로 이동하기 위한 기능

Branch 합치기

Branch 합치기(merge)는 두 버전(커밋)의 합집합을 구하고 하나의 branch
에 속하도록 만드는 것을 말함

Fast-forward

  • 두 커밋의 합집합이 둘 중 하나와 동일한 경우
  • 새로운 커밋 생성 없이 합집합과 동일한 커밋을 branch가 가리키도록 함

Conflict

  • 두 커밋이 동일한 부분을 서로 다르게 수정한 경우 Conflict이 발생함
  • Conflict이 발생할 경우를 대비해 일반적으로 먼저 feature branchmaster branch의 커밋을 병합함
  • feature branch로 병합했을 때 Conflict이 발생하면 Conflict을 해결하고 커밋 한 뒤, 해당 커밋을 master branch와 병합함
  • Conflict를 해결한 커밋은 Fast-forwardmaster branch와 합쳐짐

Merge Commit

  • Fast-forward도 아니고 Conflict도 발생하지 않는 경우 두 커밋을 합집합한 새로운 Merge Commit이 생성됨

Pull Request

  • 협력자에게 branch 병합을 요청하는 메시지를 보내는 GitHub의 기능
  • base branchcompare branch의 커밋이 병합되는 형태
  • 코드의 라인마다 댓글을 달 수 있어서 해당 코드가 왜 고쳐졌는지, 어떻게 개선할 수 있는지 토론할 수 있음
  • pull request가 승낙되면 GitHub를 통해 병합이 진행되므로 병합 후 내 로컬 저장소로 pull하는 과정이 필요함

프로젝트 Release

프로그램 Version

  • 프로그램 개발 과정에서 의미있는 특정 시점들을 버전으로 명시함
  • Major upgrade: 사용자들이 크게 변화를 느끼도록 프로그램을 바꿨을 경우 메이저 버전을 올림 (1.2.6 -> 2.0.0)
  • Minor upgrade: 작은 변화가 생겼을 경우 마이너 버전을 올림 (1.2.6 -> 1.3.0)
  • Maintenance upgrade: 버그나 유지보수 등 작은 수정을 했을 경우 메인터넌스 버전을 올림 (1.2.6 -> 1.2.7)

Tag

  • Release: 프로그램을 사용자들이 쓸 수 있도록 배포하는 것
  • Tag: 코드 버전 등 커밋에 간단한 태그를 붙일 때 사용하는 기능
  • 태그도 일종의 포인터여서 해당 태그가 붙은 커밋을 가리키고 있음
profile
안드로이드 개발자를 꿈꾸는 사람

0개의 댓글