CAPTER - Git Branch
Achievement Goals
- Git 브랜치의 개념을 이해할 수 있다.
- Git 으로 협업하며 브랜치를 나누는 이유를 이해할 수 있다.
- Git 으로 프로젝트를 관리하며 브랜치를 생성, 전환, 병합할 수 있다.
1. 브랜치 Intro
브랜치는 독립적으로 어떤 작업을 진행하기 위한 개념. 각각의 브랜치는 다른 브랜치의 영향을 받지 않기 때문에, 여러 작업을 동시에 진행할 수 있다. 브랜치 기능의 장점은 다음과 같다.
- 한 소스코드에서 동시에 다양한 작업을 할 수 있게 해준다.
- 소스코드의 한 시점과 동일한 상태를 만들고, 브랜치를 넘나들며 작업을 수행할 수 있다.
- 각각의 브랜치에서 생긴 변화가 다른 브랜치에 영향을 주지 않고 독립적으로 코딩을 진행할 수 있다.
master 또는 main이라는 이름을 가진 통합 브랜치에 뿌리를 두고, 각각의 브랜치가 갈라져 나오는 모습이다.
나누어진 브랜치에서는 각자 독립적인 영역(저장소)안에서 마음대로 소스코드 변겨잉 가능하다.
나중에는 다른 브랜치와의 병합(Merge)을 통해 하나의 새로운 브랜치로 모을 수 있다.
브랜치의 종류
1. 통합 브랜치(Integration Branch)
2. 피처 브랜치: 기능추가, 버그 수정과 같이 단위 작업을 위한 브랜치
2. 브랜치 명령어 모음
새로운 브랜치 생성
- $ git branch 새로운 브랜치 이름
새로운 브랜치 생성 후 해당 브랜치로 전환
- $ git switch -c 새로운 브랜치 이름
- $ git checkout -b 새로운 브랜치 이름 : Remote Repository에도 생성한 브랜치를 반영하기 위해서는 git push orgin dev 명령어 필요
브랜치 목록 확인
- $ git branch : 종료는 q
브랜치 목록과 각 브랜치의 최근 커밋 확인
- $ git branch -v
브랜치 삭제
- $ git branch -d 삭제할 브랜치 이름
- $ git branch -D 해당 명령어는 병합하지 않은 브랜치를 강제 삭제하는 방법입니다.
브랜치 전환
- $ git switch 브랜치 이름
- $ git checkout 브랜치 이름
브랜치 병합
- master 브랜치로 dev 브랜치를 병합할 때 (master ← dev)
- $ git checkout master
- $ git merge dev
로그에 모든 브랜치를 그래프로 표현
- $ git log --branches --graph --decorate
아직 commit 하지 않은 작업을 스택에 임시로 저장
- $ git stash
merge를 하기 위해서는 먼저 병합의 기준이 될 브랜치로 이동해야 한다.
feature/login-oauth의 내용을 feature/login브랜치로 병합하기 위해서는
feature/login 브랜치로 이동을 해야한다.
1. 현재 위치 feature/login 상태에서
2. git merge feature/login-oauth 명령어 입력
3. feature/login-oauth 브랜치가 머지되기 전 feature/login 브랜치에 추가적인 커밋이 없으므로 브랜치가 분기될 필요가 없다.
자동적으로 fast-forwadr 방식으로 병합된다.
git merge feature/login-oauth 명령어를 입력해 해당 브랜치를 현재 위치한 브랜치로 병합할 수 있다.
만일 feature/login 브랜치에 별도의 커밋이 있다면 merge commit방식으로 병합된다.
이는 각 브랜치가 줄기처럼 분기한 후, 병합의 모양새를 가진다.
rebase는 말 그대로 branch base를 이동시킨다는 뜻으로 그림처럼 feature/login 브랜치에서 가리키는 곳이
main의 가장 최신 커밋이 된다.
마지막으로 로컬의 작업한 내용을 Remote Repository에 push로 업로드를 해야 한다. 그리고 최종적으로
feature/login 브랜치의 변경사항을 다른 팀원들과 코드 리뷰하고 dev브랜치에 적용하고 싶으면
Pull request를 통해 반영 요청. 리뷰가 끝나는 코드를 dev 브랜치로 merge할 수 있다.
명령어 더 알아보기
Git 에는 이번 유닛에서 배운 명령어들 말고도 수 많은 명령어들이 존재합니다. 그 중에서 조금 더 알아보면 좋을 명령어들에 대해서는 다음 링크(https://dangitgit.com/ko)를 참고해서 알아보세요!
- rebase : 커밋의 베이스를 다시 정하고 싶은 경우
- squash : 여러 개의 커밋 로그를 하나로 묶고 싶은 경우
- revert : 커밋 여러 개의 변경 사항을 취소하고 싶은 경우
- —amend : 최근 커밋 메시지를 수정하고 싶은 경우