SW를 개발할 때, 깃의 브랜치기능을 활용한다면 같은 팀끼리 작업 프로젝트를 공유하고 같이 작업할 수 있도록 해줍니다. 또 혼자서 작업하더라도 여러 버전을 만들어 놓을 때, 또는 본 작업에서는 시도하기 힘든 테스트를 할 때 바로 이 "브랜치"라는 것이 굉장히 유용합니다.
동시에 다양한 작업을 할 수 있게 만들어 주는 기능 "브랜치(Branch)"를 이용하면 각자 독립적인 작업 영역(저장소) 안에서 마음대로 소스코드를 변경할 수 있습니다.
브랜치란? 독립적으로 어떤 작업을 진행하기 위한 개념으로, 필요에 의해 만들어지는 각각의 브랜치는 다른 브랜치의 영향을 받지 않기 때문에 여러 작업을 동시에 진행할 수 있게 됩니다.
: 저장소를 처음 생성하게 되면 깃은 'Master'라는 이름의 브랜치를 자동으로 생상허게 됩니다. 따로 새로운 브랜치를 생성하지 않으면 저장소에 새로운 파일을 추가하는 것이나 소스코드를 수정하여 커밋하는 작업 모두 마스터 브랜치를 통해 이루어지게 됩니다.
통합 브랜치(Integration Branch)
: 언제든 배포할 수 있는 버전을 만들 수 있어야 하는 브랜치가 통합 브랜치 입니다. 따라서 안정적인 상태, 즉 모든 기능이 정상적으로 동작하는 상태가 되어있어야 합니다. 만약 버그를 수정하거나 새로운 기능을 추가해야 한다면 통합 브랜치가 아닌 토픽 브랜치를 만들어 사용합니다. 일반적으로 마스터 브랜치를 통합 브랜치로 사용합니다.
토픽 브랜치(Topic Branch)
: 기능 추가나 버그 수정과 같은 단위 작업을 위한 브랜치를 토픽 브랜치라고 합니다. 토픽 브랜치는 보통 통합 브랜치로부터 파생해서 생성하고, 특정 작업이 완료되면 통합 브랜치에 병합하는 방식으로 작업하게 됩니다. 토픽 브랜치를 피처 브랜치(Feature Branch)라고 하기도 합니다.
체크 아웃(Checkout)
: 깃에서는 항상 작업할 브랜치를 미리 선택해야 합니다. 맨 처음에는 마스터 브랜치가 선택되어 있는데 다른 브랜치로 전환하여 작업할 때 사용하는 명령어가 체크 아웃(Checkout) 입니다.
헤드(Head)
: 헤드는 현재 사용 중인 브랜치의 선두 부분을 나타내는 이름입니다. 기본적으로는 마스터의 선두 부분을 나타냅니다.
스태시(Stash)
: stash 란, 파일의 변경 내용을 일시적으로 기록해두는 영역입니다.
커밋하지 않은 변경 내용이나 새롭게 추가한 파일이 인덱스와 작업 트리에 남아 있는 채로 다른 브랜치로 체크아웃하면, 그 변경 내용은 이전 브랜치가 아닌 체크아웃하여 전환한 브랜치에서 커밋할 수 있습니다. 단, 커밋 가능한 변경 내용 중에 전환된 브랜치에서도 한 차례 변경이 되어 있는 경우에는 체크아웃에 실패할 수 있습니다. 이 경우 이전 브랜치에서 커밋하지 않은 변경 내용을 커밋하거나, stash 를 이용해 일시적으로 변경 내용을 다른 곳에 저장하여 충돌을 피하게 한 뒤 체크아웃을 해야 합니다.
머지(Merge)
: merge 를 사용하면, 여러 개의 브랜치를 하나로 모을 수 있습니다.
리베이스(Rebase)
: 통합 브랜치에 토픽 브랜치를 통합한다는 점에서 머지와 비슷하지만 특징이 약간 다릅니다. Merge는 변경 내용의 이력이 모두 남아 있어서 이력이 복잡해지지만, Rebase는 이력이 단순해지지만, 원래 커밋 이력이 변경됩니다. 정확한 이력을 남겨둬야 할 필요가 없을 경우 사용합니다.
● 튜토리얼2
: Branch 사용하기
1. 초기화 후 파일 생성
저번 시간과 마찬가지로 gitTest라는 폴더를 IDE로 열어줍니다. 이때 사용한 폴더는 git init, git config등 초기화 작업을 마친 후 상태여야 합니다. (이전글 참고)
저는 먼저 이전에 작업했던 내용을 모두 지운 깨끗한 상태에서 진행하겠습니다. 먼저 cat1파일과 cat2파일을 폴더 안에 생성하였습니다.
그리고 git status로 확인해보면 아직 커밋하지 않은 파일이 Untracked하다고 뜹니다.
해당 내용을 add, commit
2. 새로운 브랜치 생성
git branch 브랜치이름
cat1, cat2라는 파일 두개를 추가 후, mouse1, mouse2파일을 추가해 줄지, dog1, dog2파일을 추가해 줄지 고민이 되는 상황이라고 가정해봅시다. 일단 두 버전 다 만들어 봅니다.
여기서 중요한 점은, 아무 브랜치도 생성하지 않으면 처음에 생성되는 master브랜치에서 작업을 수행하고 있는 것입니다. 이 상태에서 브랜치를 생성해주면, master 브랜치의 작업 내용 그대로 복사된 브랜치가 생성됩니다.
git checkout 브랜치이름
브랜치를 생성 후, 반드시 checkout을 해줘야 해당 브랜치로 전환이되며 전환된 브랜치에서 작업이 수행됩니다.
먼저 mouse1, mouse2파일을 추가해볼 mouse라는 이름의 브랜치를 생성하고 mouse브랜치로 이동하였습니다. 마스터브랜치에서 생성한 브랜치이므로 처음 작업 내용 그대로 복사됩니다.
그래고 mouse브랜치로 전환된 상태로 mouse1, mouse2라는 파일을 생성하고 add commit 합니다.
만약 이 상태에서 마스터 브랜치로 체크아웃하지 않고 또 다른 브랜치를 생성하면 cat1, cat2, mouse1, mouse2 파일 모두 포함된 브랜치가 생성되겠죠? 여기서 주의할 점은 git add -A와 같은 옵션을 사용하게 되면 mouse 브랜치의 작업 내용이 모든 브랜치에 적용됩니다.
저는 cat1, cat2, mouse1, mouse2를 가진 브랜치와
cat1, cat2, dog1, dog2를 가진 브랜치를 생성하고 싶으니, 다시 마스터 브랜치로 이동 후 dog 브랜치를 생성합니다.
git checkout master를 하게 되면 이렇게 mouse브랜치에서 작업한 내용은 보이지 않게 됩니다.
이 상태에서 dog branch를 생성해줍니다.
git branch // 브랜치 확인
dog 브랜치로 이동 후, dog1, dog2 파일을 생성합니다. 이후 add, commit
※ 터미널 내용 모두 지우는 명령어 clear
3. 브랜치 합치기 - merge
고민하다가 cat과 mouse파일을 남기기로 최종 결정하였습니다. 그러면 master 브랜치에 mouse브랜치를 이제 병합해야 합니다.
git merge 브랜치이름
일단 다시 마스터 브랜치로 돌아온 후,
merge하게 되면, mouse브랜치에 있던 작업내용이 master 브랜치로 합쳐집니다.
이후, 헷갈리지 않도록 되도록 브랜치를 삭제해주는 것이 좋습니다.
git branch -D 브랜치이름
※ 여러 분기에서 작업한 내용을 확인하는 명령어
git log --graph --all --decorate
※ Merge시 주의할점
Merge시, 같은 파일같은 라인에 수정을 한 두 브랜치를 병합하려면 Conflict가 발생합니다.
둘 중 1개를 선택해서 다시 merge를 수행해주어야 하니 되도록 같은 파일을 다른 브랜치가 작업하게 만드는 것은 지양해야 합니다.
3-1. 브랜치 합치기 - rebase
git rebase 브랜치이름
마스터브랜치에 mouse브랜치의 작업 내용을 merge를 통해 병합해보았다면 이번엔, rebase를 통해 dog브랜치에서 작업한 내용을 합쳐보겠습니다. 위에서 설명했듯이 rebase는 브랜치의 작업을 병합한다는 점에서는 merge와 같지만, rebase는 원래 커밋 이력이 변경됩니다.
master브랜치에서 dog브랜치까지 병합하였습니다.!
git log --graph --all --decorate
명령어를 사용하여 확인하면, merge와의 차이를 볼 수 있습니다.
병합된 가지들이 단순한 것을 볼 수 있죠.
여기까지 브랜치를 통해 작업을 여러 버전을 만드는 방법을 알아보았습니다. 다음 포스팅에서는 다른 사람과 협업하는 방법, 깃을 온라인 저장소에 올리는 방법에 대해 알아보도록 하겠습니다.