티스토리 뷰
브랜치란?
기존 작업 환경으로부터 독립된 곳에서 어떤 작업을 진행하기 위한 환경이라고 할 수 있다.
그럼 이 브랜치가 왜 탄생되었을까?
상황을 예시로 들어보자!
팀에서 개발을 하게 되면 같은 소스코드를 공유하는 메인 소스코드가 있다.
이때 각 개발자들마다 개발하는 부분이 다르고 또 어떤 개발자는 기존의 소스코드에서 버그를 고치는 경우도 있을 수 있다.
그렇기 때문에 각 개발자들이 개발한 코드를 서로 공유하는 소스코드에 커밋함으로써 기존의 메인 소스코드에 영향을 끼친다.
이로 인해 다양한 문제가 발생할 수 있기에 여러 개발자가 각자 독립된 브랜치에서 소스코드를 작성하고 커밋해도 특정 액션을 취하지 않는 이상 바로 메인 소스코드의 버전에 영향을 주지 않기 때문에 브랜치라는 환경이 탄생하게 되지 않았나 생각한다.
덕분에 기존의 메인 소스코드를 본인이 만든 브랜치로 갖고와서 마음대로 소스코드를 변경 및 커밋을 해도 메인 소스코드에 커밋이 쌓이지 않기 때문에 각 개발자가 동시에 독립적으로 업무를 진행할 수 있다.
또한 각자 독립된 작업 환경에서 각기 쌓은 커밋을 나중에 메인 소스코드의 버전과 비교 후 하나의 새로운 버전으로 합칠 수도 있다.
기본 브랜치
git에는 기본적으로 master라는 이름의 브랜치가 존재한다.(master라는 이름은 임의로 변경할 수 있다.)
새로운 브랜치를 생성하기 전까지 기본으로 제공되는 master라는 이름의 메인 브랜치에서 작업을 한다.
다양한 브랜치 관련 명령어
지금까지의 모든 버전 및 프로젝트의 브랜치들을 시각적으로 조회하고 싶을 때는 다음 명령어 중 하나만 입력하면 된다.
- git log --all --graph --oneline
- git log --all --oneline --graph
- git log --oneline --all --graph
- git log --oneline --graph --all
- git log --graph --all --oneline
- git log --graph --oneline --all
git branch 생성할 브랜치명
기존의 master라는 메인 브랜치에서 새로운 브런치를 만듦으로써 자신만의 독립된 작업 환경을 만들 수 있다.
위와 같은 명령어로 브랜치를 생성할 경우 브랜치만 생성하고 해당 브랜치로 이동하지 않고 master에 머물게 된다.
git checkout 이동할 브랜치명
원하는 브랜치로 이동할 때 사용한다.
git checkout -b 생성할 브랜치명
만약 브랜치를 생성함과 동시에 해당 브랜치로 이동하고 싶으면 다음과 같이 명령어를 입력한다.
새로운 브랜치를 생성할 경우 새로운 브랜치를 생성한 시점까지를 기준으로 master에 있는 최신 버전의 내용을 새로운 브랜치로 갖고 올 수 있다.
git branch
현재까지 생성된 다양한 브랜치를 다음 예시처럼 조회할 수 있다.
* develop
master
여기서 *는 현재 HEAD가 있는 브랜치를 의미한다.
merge하기
자신이 위치한 브랜치에 다른 브랜치를 합칠 경우 merge와 rebase와 같이 두 가지 방법이 있다.
rebase에 대한 설명은 추후에 'git 협업관리' 게시물을 업로드하여 설명할 것이다.
예를 들어 a와 b라는 브랜치가 있다고 하자!
b 브랜치에서 수정사항이 있어 커밋을 완료한 후 내가 위치하고 있는 기존의 a브랜치에 병합을 실시할 것이다.
git merge 병합시킬 브랜치명
위 예시를 명령어로 나타내면 다음과 같다.
git merge b
이때 merge를 한 후에 cli에서 Fast-forword라고 표시된다.
Fast-forward란 merge 할 브랜치(b)의 commit이 현재 a branch의 commit 보다 앞서 있어서 a 브랜치의 커밋을 b 브랜치 commit으로 땡긴다는 것을 의미한다.
merge의 기능에는 --ff(Fast-forword를 의미)옵션이 기본값으로 활성화되어 있다.
그렇기 때문에 한 커밋의 이력(여기서는 b 브랜치 커밋의 이력)이 다른 커밋의 이력(a 브랜치 커밋 이력)에 병합될 경우 새로운 merge 커밋을 생성하지 않고 해당 커밋(b 브랜치 최신 커밋 이력)을 그대로 가져올 수 있다.
반면, 한 커밋의 이력(여기서는 b 브랜치 커밋의 이력)이 다른 커밋의 이력(a 브랜치 커밋 이력)에 병합될 경우 b 브랜치 최신 커밋 이력을 그대로 가져오는 것이 아닌 새로운 merge 커밋을 생성하는 방법이 있다.
--no-ff를 통해 다른 브랜치를 병합시켰다는 커밋 이력을 추가하여 히스토리에서 해당 기록을 확인하기 쉽게 하기 위한 목적으로 사용된다.
git merge --no-ff 병합시킬 브랜치명
현재 예시를 명령어로 나타내면 다음과 같다.
git merge --no-ff b
충돌(CONFLICT)
각기 다른 브랜치 a와 b에서 서로 같은 파일의 같은 부분을 각기 다른 내용으로 수정을 하고 커밋 후 a와 b브랜치를 merge할 경우 충돌이 일어나며 다음과 같은 알림이 뜬다.
이 충돌은 같은 부분을 수정했기 때문에 어떤 코드로 수정 반영을 해야 할지 곤란하여 개발자에게 알려 주는 것이다.
CONFLICT (content): Merge conflict in 충돌한 파일
Automatic merge failed; fix conflicts and then commit the result.
충돌 해결 방법
이때 충돌한 파일을 열람하면 다음과 같이 되어 있다.
<<<<<<< HEAD
현재 위치한 브랜치(a브랜치)의 파일 내용
=======
다른 브랜치(b브랜치)에 위치한 파일 내용
>>>>>>>다른 브런치명(b브랜치)
일단 파일 내용을 확인 후 git의 충돌 안내 구문을 지운다.
그리고 최종으로 수정하고자 하는 내용으로 수정 후 해당 파일을 add 및 커밋하면 된다.
이로써 현재 브랜치(a 브랜치)에 있는 파일과 이름이 같은 다른 브랜치(b 브랜치)의 파일의 내용이 정상적으로 합쳐진다.
한편 merge는 버전의 병합이므로 병합하고자 했던 다른 브랜치(b 브랜치)와 해당 브랜치(a 브랜치)의 버전과 파일은 삭제되지 않는다.
병합 바로 이전의 버전으로 돌아가고자 한다면 git reset --hard 병합한 버전의 커밋 일련번호 7자리 혹은 git reset HEAD~1을 입력하면 된다.
git branch -d 삭제하고 싶은 브랜치명
특정 브랜치(b 브랜치)를 삭제하고 싶은 경우 해당 브랜치(b 브랜치)가 아닌 다른 브랜치(a 브랜치)에서 위 명령어를 입력하면 된다.
만약 삭제하고 싶은 브랜치(b 브랜치)가 a 브랜치와 병합되지 않았어도 삭제하길 원하면 git branch -D 삭제하고 싶은 브런치명으로 강제 삭제할 수 있다.
'Git' 카테고리의 다른 글
협업 관리 (0) | 2021.10.04 |
---|---|
백업관리2 (0) | 2021.10.04 |
백업 관리1 (0) | 2021.10.04 |
버전 삭제 및 되돌리기 (0) | 2021.10.04 |
버전 추가 및 조회 (0) | 2021.10.04 |