📚 코딩애플의 '매우 쉽게 알려주는 git & github'을 수강하며 배우거나 추가적으로 찾아본 것들을 정리한 내용입니다.
브랜치(branch)를 사용한다는 것은?
branch의 뜻은 나뭇가지, 또는 갈라지다이다. git에서 프로젝트의 주축이 되는 메인 브랜치를 나무의 기둥으로 표현한다면, 그것을 기반으로 추가 기능 또는 작업 영역을 만들 때 나뭇가지가 뻗어나가듯 브랜치를 사용한다.
git의 공식문서에서는 브랜치를 다음과 같이 설명하고 있다.
모든 버전 관리 시스템은 브랜치를 지원한다. 개발을 하다 보면 코드를 여러 개로 복사해야 하는 일이 자주 생긴다. 코드를 통째로 복사하고 나서 원래 코드와는 상관없이 독립적으로 개발을 진행할 수 있는데, 이렇게 독립적으로 개발하는 것이 브랜치이다.
왜 브랜치를 사용해야 할까?
동일한 파일을 여러 명의 개발자가 작업한다면, 각기 다른 버전의 코드가 만들어져 충돌이 발생할 수밖에 없다. 따라서 여러 개발자들이 동시에 다양한 작업을 할 수 있게 해주는 것이 바로 브랜치이다. 각자의 작업 영역에서 작업을 한 후, 메인 브랜치에 변경 사항을 반영한다. 이렇게 다른 사람의 작업에 영향을 받지 않고 독립적으로 특정 작업을 수행하고 그 결과를 하나로 모아가는 방식으로 작업하게 되면 작업 기록이 모두 남게 되므로, 모든 사람이 같은 파일을 한 번에 작업할 때보다 이슈 발생 시 원인을 찾아내거나 대책을 세우기 쉬워진다.
브랜치 만들기
github 사이트에서 브랜치 만들기
github repository 좌측에 있는 main을 눌러보면, 브랜치 내역을 확인할 수 있다. 새로운 브랜치를 만들고 싶다면 'Find or create a branch'라고 적혀있는 인풋에 만들고 싶은 브랜치 명을 누르고 우측 사진처럼 해당 브랜치를 클릭하면 생성된다.
로컬 repository에서 브랜치 만들기
# 로컬에서 브랜치 만들기
git branch 브랜치명
# 해당 브랜치에서 작업
git switch 브랜치명
git add ~
git commit -m '주석'
# 해당 브랜치를 원격에 올리기
git push 원격저장소주소 로컬브랜치명
[참고]
# '특정'로컬저장소브랜치 → 원격저장소
git push 원격저장소주소 로컬브랜치명
# '모든'로컬저장소브랜치 → 원격저장소
git push 원격저장소주소
pull request: merge하기 전에 검토하기
팀끼리 협업하는 경우, merge하기 전 협의하거나 검토해야 하는 경우가 많다. 이를 위해 github은 pull request라는 기능을 제공한다. 쉽게 말해 merge request (머지 요청) 기능이다.
github에서 pull request하기
1. 상단 pull request 메뉴에서 New pull request 버튼을 누르면 pull request 생성이 가능하다.
2. 브랜치를 어디에 합칠 것인지 선택하고, 하단에서 commit 내역, 변경내역 확인 후 create pull request 클릭 시 pr이 보내진다.
3. pr은 pull request 탭 메뉴에서 확인 가능하다.
4. 해당 pr을 merge하기로 정했으면, merge 옵션을 선택해 진행할 수 있다.
github merge 옵션(1)_create a merge commit
- 새로운 merge commit을 하나 생성해 주는 3-way merge를 실행해 준다.
- main 브랜치 조회 시 합쳐진 브랜치의 commit 내역도 전부 나온다.
github merge 옵션(2)_squash and merge
- 합쳐질 브랜치의 commit 내역을 하나로 모아 main 브랜치에 신규 commit을 생성한다.
- git log --online --graph로 조회 시 합쳐진 브랜치가 조회되지 않는다.
github merge 옵션(3)_rebase and merge
- 합쳐질 브랜치를 main 브랜치의 최신 commit으로 rebase하고 나서 fast-forward merge와 비슷하게 진행한다.
- 결과는 squash and merge와 비슷한데, 합쳐질 브랜치의 commit 내역이 모두 보존된다.
- git log --online --graph로 조회 시 합쳐진 브랜치가 조회되지 않는다.
✨ 협업 시 참고사항
원격저장소의 commit 내역을 과거로 돌리고 싶다면, 로컬에서 git reset --hard를 쓰고 git push -f를 하면 가능하지만, 해당 브랜치를 공동 작업 중인 사람들이 '모두' 영향을 받기 때문에 지양하는 게 좋다.
git branch 전략
계획 없이 branch를 생성하다 보면 개발과정이 매우 복잡해지고 추적이 어려워지기 때문에 git branch를 깔끔하게 만들도록 도와주는 방법론이 있다. 이들을 적용하면 브랜치 관리가 쉬워지고, 팀원이 많아져도 개발 절차가 매끄러워진다.
branch 방법론(1)_git flow
내가 만드는 프로그램이 항상 안정적인 release를 해야 한다면 (ex. 게임 개발) git flow 전략을 이용한다. git flow 전략은 크게 5개의 브랜치를 운영한다.
1. main 브랜치
2. develop 브랜치: 개발용
3. feature 브랜치: develop에 기능 추가
- 신기능을 만들고 싶으면 develop을 브랜치한 feature 브랜치에서 각각 개발한다.
- feature/guilde 브랜치를 만들어서 길드 기능을 추가하고, feature/friend 브랜치를 만들어서 친구 기능을 만드는 방식이다. (브랜치 작명 시 여러 단어가 필요하면 보통 대시나 / 기호를 쓴다.)
- 기능이 완성되면 develop 브랜치에 merge한다.
- 중요한 내용이 아니면 squash and merge도 괜찮다.
4. 가끔 만드는 release 브랜치: develop 브랜치를 main 브랜치에 합치기 전 최종 테스트용
- develop에서 만든 두 개의 기능이 완성되었지만, 혹시 모를 오류를 대비하기 위해 release 브랜치를 만들어 프로젝트를 복사한 다음 출시 준비를 한다.
- release 브랜치에서 테스트나 QA를 진행한다.
- 버그 발견 시 임시 브랜치를 만들어서 수정하거나 한다.
- release/1.0 이런 식으로 브랜치 이름을 짓는 경우가 많다.
- 완성된 것 같으면 main으로 브랜치를 merge하고 배포한다.
- 개발은 계속 진행되어야 하므로 완성본은 develop 브랜치에도 merge한다.
5. hoxfix 브랜치: main 브랜치 버그 해결
- 갑작스러운 버그 픽스를 해야 할 때, main 브랜치에서 hotfix 브랜치를 만들어 바로 버그를 수정한다.
- 수정이 완료되면 main 브랜치에 직접 merge하고, develop 브랜치에도 merge한다.
branch 방법론(2)_trunk-based
진행 중인 작업 또는 프로젝트가 코드를 바로 배포해도 되거나, 큰 업데이트가 없는 안정적인 프로그램이라면 굳이 많은 브랜치를 만들 필요가 없다. 따라서 main 브랜치와 기능 추가용 feature 브랜치만 운영한다.
1. 기능추가, 버그 픽스가 필요하면 main 브랜치에서 새로운 브랜치를 하나 만들어 코드를 짠다.
2. 기능이 완성되었으면 main 브랜치에 합친다.
3. main 브랜치에 있는 코드를 필요 시마다 유저에게 배포한다.
trunk-based 전략은 코드를 한 브랜치에서만 관리하기 때문에 편리하고, 크게 개발해서 한 번에 merge하는 것보다 작은 단위로 merge하는 것이 더 안전하기 때문에 좋다. 다만, main 브랜치에 직접적으로 merge하므로 메인 기능 오류 방지를 위해 테스트나 코드 리뷰를 자주 해야 한다. 따라서 테스트를 자주 하고 자동화해 두는 곳들이 해당 전략을 제대로 사용할 수 있다.
[참고 자료]
https://codingapple.com/course/git-and-github/
'Etc.' 카테고리의 다른 글
[GitHub] 협업을 위한 Organization 만들기 (0) | 2023.07.30 |
---|---|
[코딩애플 / git] git & github(6)_stash 사용법 (0) | 2023.04.01 |
[코딩애플 / git] git & github(4)_push, clone, pull, fetch 사용법 (0) | 2023.03.28 |
[코딩애플 / git] git & github(3)_restore, revert, reset 사용법 (0) | 2023.03.27 |
[코딩애플 / git] git & github(2)_branch, merge 사용법 (0) | 2023.03.26 |