Study/코드프레소 java 웹개발 체험단

[실무자가 알려주는 Git 활용한 프로젝트 관리]2주차: Git 브랜치

공부하기 좋은 날 2022. 1. 15. 14:45

코드프레소 java 웹개발 체험단 2주차 git강의인 [실무자가 알려주는 Git 활용한 프로젝트 관리] 강의에서는 Git 브랜치에 대한 내용을 다루었다. 기존에는 깃허브 데스크탑을 이용해 협업할 때 깃 브랜치를 사용할 수 있을 정도만 알고있었는데, 이번 강의를 통해 깃 브랜치에 대한 개념과 git bash에서 브랜치 사용하는법, 깃 브랜치를 실무에서 활용하는 방법을 알게 되어 브랜치의 개념에 더욱 깊은 이해를 하게되었다. 특히 깃의 추상적 개념을 도식화하여 그림으로 나타내주셔서 쉽게 이해할 수 있었다. 강의를 들으며 학습 내용을 정리해보았다.


1. 브랜치란?

github desktop에서의 브랜치
브랜치 개념(사진출처: 코드프레소)

브랜치란 기존의 소스코드에서 파생된 독립적 작업공간으로, 브랜치를 활용하여 계속 변화하는 소프트웨어의 변경점을 쉽고 효율적으로 관리할 수 있게 하는 깃의 주요 기능이다. 브랜치는 최신 커밋을 가리키는 포인터라고 할수있으며 git은 기본적으로 master브랜치를 생성한다. master브랜치에서 필요에 따라 브랜치를 나뭇가지처럼 따서 독립적 공간에서 작업을 하고 master과 합치며 프로그램을 만들어 나갈 수 있다. 이는 협업할 때 각자의 작업공간 만들기, 독립적 공간에서 기능 개발하기 등을 할때 유용하다.


맨 처음에 첫번째 커밋을 했을 때 master브랜치가 생성된 커밋을 가리킬 수 있으며, Head는 현재 브랜치를 가리키는 포인터이다.

Head의 개념(사진출처: 코드프레소)


이렇게 브랜치는 연결된 커밋들 중 최신 커밋을 가리켜서 저장된 커밋을 갖고, 현재 브랜치는 head가 가리키며 동작한다.

commit1,2,4를 갖는 master브랜치/ commit1,2,3을 갖는 feature-login브랜치/ commit1,2,4,5를 갖는 issue브랜치/ 현재 브랜치는 issue(사진출처:코드프레소)


* 브랜치 관련 git 명령어
- 현재 작업중인 브랜치 확인: git branch
- 브랜치 이동: git checkout [이동할 브랜치명]
- 브랜치 머지: git merge [머지할 브랜치명]
- 브랜치 확인: git branch -v
- 커밋 기록 보기: git log
- 브랜치 삭제: git branch -d [삭제할 브랜치명]

* git bash 커밋 생성 절차 복습
원하는 폴더로 이동 후 vi로 파일 생성 -> git add로 임시저장 영역에 저장 -> git status로 상태확인 -> git commit -m "커밋 메시지"로 커밋

 

2. 브랜치 병합(merge)

서로 다른 브랜치에는 서로 다른 내용이 들어있는데, 이것이 하나의 브랜치에 합쳐져야 하나의 프로그램으로 동작한다. 이렇게 브랜치를 합치는 과정을 merge라고 한다.
병합할 두 브랜치 사이에 동일 내용이 포함될 경우, 브랜치의 위치만 최신 커밋으로 이동하여 머지하는 fast forward merge를 한다.

 

master브랜치에 issue브랜치를 fast forward merge한것. 가리키는 커밋만 바뀐걸 볼 수 있다.(사진출처:코드프레소)


fast forward merge 는 브랜치의 위치만 최신 커밋으로 이동시켜 두 브랜치의 최신커밋을 같게해 병합하는 방식이다. 가리키는것만 바꾸므로 이름처럼 빠르게 머지를 수행할 수 있다.



병합할 두 브랜치가 중복되지않아서 fast forward merge방식을 사용할 수 없다면, merge commit 을 하나 만들어서 merge commit을 가리키게 하는 방식인 3-way merge 방식으로 머지한다.

 

commit5를 가리키는 master브랜치와 commit3을 가리키는 feature-login브랜치를 master브랜치에 병합할 때 commit5와 commit3를 병합한 merge commit 이 생성되었고 master브랜치가 merge commit을 가리켜서 머지가 수행된 3-way merge방식(사진출처:코드프레소)

 

3. 변경점 충돌(conflict)

머지를 수행할 때 서로 같은것을 변경하려고 하는 커밋이 있다면 중복이 되어 어떻게 머지해야할지 모르는 변경점 충돌( conflict)가 발생한다.


이러한 충돌의 해결은 git mergetool 명령어를 작성하고 입력창에 vimdiff를 입력해 vi에디터 머지툴을 열어 해결한다.

git bash에서 충돌의 해결(사진출처: 코드프레소)

그러면 이러한 창이 뜨는데,
첫번째 창-마스터가 가리키는 커밋
두번째 창-마스터, 병합할 브랜치의 공통부분
세번째 창-브랜치가 가리키는 커밋
하단 창-수정 가능한 파일 창
으로 하단의 창에서 수정하여 conflict가 발생한 부분을 해결해주면 된다.

4. tag

git에서 태그=변경점에 대한 메모이다.

태그의 종류는
1. light weight태그
- 버전등의 정보만 메모하는 태그
- git 명령어 : git tag[태그명]

2. annotated태그
- git데이터베이스에 태그를 만든 사람의 이름, 이메일, 등을 씀
- git 명령어 : git tag -a[태그명] -m[태그 메시지]
가 있다.


- 태그 정보 확인 명령어: git show v1.0

- 소스코드의 효율적 관리를 위해 태그 생성 시점, 방법등의 일관성있는 규칙을 정해 프로젝트 팀원모두가 준수할 수 있도록 정책화 해야함

- 소프트웨어는 지속적으로 변경되기 때문에 소프트웨어의 변경점을 효율적으로 관리하기 위해 브랜치가 필요


5. 브랜치 활용 전략 : git flow


git flow를 활용하여 브랜치를 더욱 효율적으로 사용할 수 있다.

git flow에는 master, develop, feature, release, hotfix 등의 브랜치가 있다.

1) master : 실제 고객에게 릴리즈되는 브랜치
- 모든 변경은 결국 master로 최종 반영되어야함
- 가장 중요한 브랜치

 

2) develop
: 실제 개발의 중심이 되는 브랜치
develop의 내용은 master에 최종반영되어야함

3) feature
: 기능을 개발하는 브랜치
develop브랜치로부터 분기되어 사용됨
해당 기능이 개발되면 develop 브랜치에 머지한 후 삭제

develop브랜치에서 기능개발을 위해 파생된 feature 브랜치 (사진출처: 코드프레소)

4) release
: 배포를 준비하는 브랜치
배포 가능한 상태가 되면 master브랜치로 병합

develop브랜치에서 release브랜치로 가서 배포 준비, master브랜치에서 배포(사진출처: 코드프레소)


5) hotfixs
: 배포한 버전에서 긴급하게 수정해야할 때 대응하는 브랜치
크리티컬 이슈 해결





- 코드프레소 Java 웹 개발 체험단 활동 중
- 코드프레소 [실무자가 알려주는 Git프로젝트 관리]강의 수강 중
- 코드프레소 URL: https://www.codepresso.kr/