2-3. Git의 branch: 브랜치 생성 및 관리
1. 브랜치(Branch)의 개념과 중요성
Git에서 브랜치는 코드 개발의 핵심적인 요소입니다. 마치 여러 개의 평행 우주처럼, 각 브랜치는 독립적인 개발 흐름을 나타냅니다. 브랜치를 사용하면, 코드베이스의 메인 흐름(보통 main 또는 master 브랜치)에 영향을 주지 않고 새로운 기능 개발, 버그 수정, 실험적인 변경 등을 수행할 수 있습니다. 각 브랜치에서 작업한 내용은 나중에 메인 브랜치에 병합(merge)하여 통합할 수 있습니다.
1) 브랜치의 비유: 우주, 나무, 복제본
브랜치의 개념을 이해하기 위해 몇 가지 비유를 살펴보겠습니다.
- 우주:
main브랜치를 우리 현실 세계라고 생각하면, 각 브랜치는 다른 차원의 세계와 같습니다. 새로운 기능을 개발하는 것은 새로운 우주를 창조하는 것과 같고, 각 우주에서 개발된 내용은 필요에 따라 우리 현실 세계로 가져올 수 있습니다. - 나무:
main브랜치는 나무의 줄기, 개별 브랜치는 가지에 비유할 수 있습니다. 각 가지에서 잎(코드)을 키우다가, 그 잎들을 다시 줄기에 붙여 나무를 풍성하게 만드는 과정을 연상할 수 있습니다. - 복제본:
main브랜치의 복제본을 만들어서, 그 복제본에서 독립적으로 작업을 수행하는 방식입니다. 독립적인 환경에서 안전하게 실험하고, 완성된 내용을 원본에 통합할 수 있습니다.
이러한 비유들은 브랜치가 코드 관리에 얼마나 유연성과 안전성을 제공하는지를 보여줍니다.
2. 브랜치의 생성, 전환, 삭제
Git에서 브랜치를 사용하기 위한 기본적인 명령어들을 살펴보겠습니다.
1) 브랜치 생성
새로운 브랜치를 생성하는 명령어는 git branch [브랜치 이름]입니다. 이 명령은 현재 커밋을 기준으로 새로운 브랜치를 생성합니다. 예를 들어, 새로운 기능을 개발하기 위한 feature-new-function 브랜치를 생성하려면 다음과 같이 입력합니다.
git branch feature-new-function
이 명령은 브랜치를 생성하지만, 현재 작업 디렉토리는 여전히 원래 브랜치(예: main)에 머물러 있습니다.
2) 브랜치 전환
새롭게 생성된 브랜치 또는 다른 브랜치로 전환하려면 git checkout [브랜치 이름] 명령어를 사용합니다. 이 명령은 작업 디렉토리와 스테이징 영역을 지정된 브랜치의 상태로 변경합니다. 즉, 해당 브랜치에서 마지막으로 커밋된 코드를 불러오고, 이후 변경 사항을 해당 브랜치에 적용할 수 있도록 합니다.
git checkout feature-new-function
이 명령을 실행하면 작업 디렉토리가 feature-new-function 브랜치로 전환됩니다. 이제부터는 이 브랜치에서 코드를 변경하고 커밋할 수 있습니다.
3) 브랜치 생성과 전환을 동시에 (checkout -b)
git checkout 명령어는 –b 옵션과 함께 사용하면 새로운 브랜치를 생성하고 즉시 해당 브랜치로 전환하는 기능을 수행합니다. 이는 브랜치를 생성하고 전환하는 두 단계를 한 번에 처리하므로 더 간편합니다.
git checkout -b feature-new-function
위 명령어는 feature-new-function 브랜치를 생성하고, 그 브랜치로 현재 작업 디렉토리를 전환합니다.
4) 브랜치 목록 확인
현재 존재하는 브랜치들을 확인하려면 git branch 명령어를 사용합니다. 이 명령어를 실행하면 현재 브랜치와 다른 브랜치 목록이 표시됩니다. 현재 작업 중인 브랜치는 별표(*)로 표시됩니다.
git branch
결과는 다음과 같이 표시될 수 있습니다.
* main
feature-new-function
이 경우, main 브랜치가 현재 작업 중인 브랜치임을 알 수 있습니다.
5) 브랜치 삭제
더 이상 필요하지 않은 브랜치는 git branch -d [브랜치 이름] 명령어를 사용하여 삭제할 수 있습니다. 삭제하기 전에 해당 브랜치의 변경 사항이 main 브랜치에 병합되었는지 확인하는 것이 중요합니다. 만약 병합되지 않은 변경 사항이 있다면, 해당 브랜치를 삭제하면 변경 사항이 손실될 수 있습니다.
git branch -d feature-new-function
만약 병합되지 않은 변경 사항이 있는 브랜치를 삭제하려 하면, Git은 경고 메시지를 표시합니다. 강제로 삭제하려면 -D 옵션을 사용해야 하지만, 데이터 손실 위험을 항상 인지해야 합니다.
git branch -D feature-new-function
3. 브랜치 병합(Merge)
브랜치에서 개발한 내용을 main 브랜치에 통합하는 과정을 병합(merge)이라고 합니다. 병합은 두 가지 주요 단계로 이루어집니다.
- 병합 대상 브랜치로 이동
git merge [병합할 브랜치 이름]명령어 실행
예를 들어, feature-new-function 브랜치의 변경 사항을 main 브랜치에 병합하려면 다음 명령어를 실행합니다.
git checkout main
git merge feature-new-function
1) 병합 과정의 이해
병합은 Git이 자동으로 수행하는 과정이지만, 복잡한 상황에서는 충돌(conflict)이 발생할 수 있습니다.

병합 과정에서 Git은 다음 세 가지 경우를 처리합니다.
- Fast-forward 병합: 병합하려는 브랜치가
main브랜치보다 최신인 경우, Git은 단순히main브랜치의 포인터를 병합하려는 브랜치로 이동시킵니다. - 자동 병합: 두 브랜치에서 서로 다른 파일 또는 동일한 파일의 서로 다른 부분을 수정한 경우, Git은 자동으로 변경 사항을 병합합니다.
- 충돌(Conflict) 발생: 두 브랜치에서 동일한 파일의 동일한 부분을 수정한 경우, Git은 충돌을 감지하고 수동으로 해결해야 함을 알립니다. 충돌은
<<<<<<<,=======,>>>>>>>와 같은 마커로 표시되며, 개발자는 수동으로 코드를 수정하고, 충돌 마커를 제거한 후 다시 커밋해야 합니다.
2) 충돌 해결
병합 충돌이 발생하면, Git은 충돌이 발생한 파일을 알려줍니다. 개발자는 해당 파일을 열어 충돌 부분을 확인하고, 원하는 코드를 선택하거나 수정하여 충돌을 해결해야 합니다. 충돌 해결 후에는 파일을 스테이징 영역에 추가하고 커밋하여 병합을 완료합니다.
# 충돌 발생 파일 열기 (예시: my_file.txt)
# 충돌 해결 (수정 및 원하는 코드 선택)
git add my_file.txt
git commit -m "Resolve merge conflict"
4. 브랜치 전략
효율적인 개발을 위해 브랜치를 사용하는 전략을 세우는 것이 중요합니다. 다양한 브랜치 전략이 있지만, 여기서는 몇 가지 기본적인 전략을 소개합니다.
1) Gitflow
Gitflow는 Vincent Driessen에 의해 제안된 브랜치 모델입니다. Gitflow는 다음과 같은 주요 브랜치를 사용합니다.
main: 릴리스된 코드를 관리합니다.develop: 다음 릴리스를 위한 통합 브랜치입니다.feature: 새로운 기능을 개발하기 위한 브랜치입니다.develop브랜치에서 분기하여 개발하고, 개발 완료 후develop브랜치에 병합합니다.release: 릴리스를 준비하기 위한 브랜치입니다.develop브랜치에서 분기하여 릴리스 전에 필요한 버그 수정, 문서 업데이트 등을 수행하고, 완료 후main및develop브랜치에 병합합니다.hotfix: 릴리스된 코드에서 발생하는 긴급한 버그를 수정하기 위한 브랜치입니다.main브랜치에서 분기하여 수정하고, 수정 완료 후main및develop브랜치에 병합합니다.
Gitflow는 안정적인 릴리스를 관리하고, 팀 협업을 돕는 데 효과적입니다.

2) GitHub Flow
GitHub Flow는 GitHub에서 널리 사용되는 간단한 브랜치 전략입니다. GitHub Flow는 다음과 같은 원칙을 따릅니다.
main브랜치는 항상 배포 가능한 상태를 유지합니다.- 새로운 기능 또는 버그 수정을 위해 새로운 브랜치를 생성합니다.
- 브랜치에서 변경 사항을 커밋하고, 원격 저장소에 푸시합니다.
- Pull Request를 생성하여 변경 사항을 리뷰하고,
main브랜치에 병합합니다.
GitHub Flow는 간단하고, 지속적인 배포를 지원하며, 팀 협업을 용이하게 합니다.
3) Trunk-based Development
Trunk-based Development는 main 브랜치(trunk)에 작은 단위로 코드를 자주 병합하는 전략입니다.
main브랜치는 항상 최신 코드를 유지합니다.main브랜치에서 분기하는 브랜치는 짧은 기간 동안 유지됩니다.- 작업이 완료되면 즉시
main브랜치에 병합합니다. - 지속적인 통합(CI)과 지속적인 배포(CD)를 통해 잦은 릴리스를 수행합니다.
Trunk-based Development는 코드의 통합을 자주 수행하여, 릴리스 위험을 줄이고, 빠른 피드백 루프를 가능하게 합니다.
5. 브랜치 사용 시 주의사항
브랜치를 효과적으로 사용하기 위해 몇 가지 주의해야 할 사항이 있습니다.
1) 브랜치 이름 규칙
브랜치 이름을 명확하고 일관성 있게 정하는 것은 코드의 가독성을 높이고, 팀 협업을 용이하게 합니다. 예를 들어, 새로운 기능 개발은 feature/ 접두사를 사용하고, 버그 수정은 fix/ 접두사를 사용하는 등 규칙을 정할 수 있습니다.
2) 너무 긴 브랜치 작업 지양
너무 오랫동안 브랜치에서 작업을 진행하면, 병합 시 충돌 발생 가능성이 높아지고, 코드의 통합이 어려워집니다. 가능한 한 작은 단위로 나누어 작업하고, 자주 main 브랜치에 병합하는 것이 좋습니다.
3) 잦은 병합과 코드 리뷰
브랜치를 main 브랜치에 병합하기 전에 코드 리뷰를 수행하고, 다른 개발자들의 검토를 받는 것이 좋습니다. 코드 리뷰는 코드 품질을 향상시키고, 잠재적인 버그를 발견하는 데 도움이 됩니다. 또한, 잦은 병합은 코드의 최신 상태를 유지하고, 통합 문제를 예방하는 데 도움이 됩니다.
4) 원격 저장소와의 동기화
로컬 브랜치에서 작업을 완료한 후에는 원격 저장소에 푸시하여 다른 개발자들과 변경 사항을 공유해야 합니다. 또한, 다른 개발자들의 변경 사항을 로컬 브랜치에 가져와 동기화해야 합니다.
git push origin feature-new-function # 로컬 브랜치를 원격 저장소에 푸시
git pull origin main # 원격 저장소의 main 브랜치 변경 사항을 가져오기
6. 결론
Git의 브랜치는 코드 개발의 유연성과 안전성을 크게 향상시키는 강력한 기능입니다. 브랜치의 개념과 기본 명령어를 이해하고, 적절한 브랜치 전략을 사용하여 효율적인 개발 프로세스를 구축할 수 있습니다. 꾸준한 연습과 팀원과의 협업을 통해 Git 브랜치 사용 능력을 향상시키고, 더욱 안정적이고 효율적인 코드 개발을 수행할 수 있습니다.
비슷한 글 추천
2-4. Git의 merge: 브랜치 병합
브랜치를 병합하는 다양한 방법(`git merge`)을 살펴보고, 충돌(conflict) 해결 방법을 다룹니다.
2-6. Git의 remote: 원격 저장소 연동
원격 저장소를 추가하고, push, pull, fetch 명령어를 사용하여 원격 저장소와 동기화하는 방법을 배웁니다.
2-2. Git의 commit: 커밋 메시지 작성 가이드
효과적인 커밋 메시지를 작성하는 방법과 커밋 메시지 작성 규칙을 알아봅니다.
2-1. Git의 working directory, staging area, repository 이해
Git의 핵심 개념인 working directory, staging area, repository의 관계를 이해하고, 각 영역에서 파일이 어떻게 관리되는지 설명합니다.
Comments (0)
No comments yet. Be the first to comment!
Please to write a comment.