git 수업 두번째로, git에서 가장 중요한 기능인 branch에 대해 정리하겠다.
● git branch 란?
앞에서 설명 했듯이 깃을 사용하는 가장 중요한 이유 중 하나는 버전 관리이다.
이를 좀 더 편리하게 할 수 있는 기능이 branch이다.
코드 작업을 하면서 이전 작업으로 돌아가야 할 상황이 발생할 수도 있고 이전 코드에서 오류가 발생하여
고쳐야 하는데 이를 쉽게 해주는 것이 branch이다.
branch란 코드 버전의 주 흐름에서 벗어나서 새로운 가지(branch)를 만들어 수정 기록을 남기는 것이다.
이때 만들어진 가지는 원래 코드의 흐름인 main branch에 영향을 주지 않고 이 브랜치들은 서로 합칠 수 있다.
코드 작업을 하는데 main 브랜치에서 바로 작업을 하면 오류가 났을 때 대처가 복잡해진다.
이때 새로운 브랜치를 만들어 작업을 한 후 작업이 완료되면 이 브랜치를 main으로 합쳐주면 된다.
이것들에 대한 개념을 이해하는데 아래 사이트가 많은 도움이 되었다.
설명도 잘 되어 있고 실습도 이미지화하여 할 수 있게 되어있다.
https://learngitbranching.js.org/
Learn Git Branching
An interactive Git visualization tool to educate and challenge!
learngitbranching.js.org
다음으론 git bash를 이용해 명령어에 대해 알아보겠다.
● branch 만들기
branch를 만들기 이전 수정 사항이 있어야 하기 때문에 복습 겸 파일 하나를 만들어 몇몇 수정 사항을 commit 해 보겠다.
간단하게 한 번에 보면 아래와 같은 히스토리가 생긴다.

branch.c 파일을 만들어서 3번 수정을 해주었다.
(앞글에서 따로 정리 안 한 git tag 명령을 사용했다. 말 그대로 commit에 간단하게 tag를 달아주는 것으로 여기선 버전처럼 표현해 줬다.)
이 상태에서 브랜치를 만들려면 git branch 브랜치 이름을 해주면 된다.

이러면 bugfix라는 브랜치가 새롭게 만들어진 것이고 gui로 확인해볼 수 있다.

하지만 gui의 찐한 글씨로 볼 수 있듯이 아직 main(master)브랜치가 선택되어 있다.
때문에 이 상태에서 수정하고 commit을 해주어도 main 브랜치로 commit 된다.

선택되어있는 브랜치를 바꾸는 것은 git chekout 브랜치 이름을 해주면 된다.

그럼 bugfix 브랜치가 선택되게 되고 이상태에서 파일을 열면 v2.1이 적용되기 전인 v2.0 상태의 파일이 열린다.
이 상태에서 파일을 수정후 commit 해주면 main에 영향을 주지 않는 bugfix 브랜치에 수정사항이 저장된다.
gui로 확인하면 아래와 같다.

(main 브랜치가 부 브랜치처럼 옆으로 나온 건 순서 때문인 거 같다..? 왜지?)
● branch 합치기
브랜치를 합치는 방법에는 merge와 rebase 두 가지 방법이 있다.
먼저 merge는 선택되어있는 브랜치로 브랜치를 합치는 것으로 명령어는 git merge 합쳐질 브랜치 이름이다.
위 예제에서 merge를 사용하여 bugfix브랜치에서 수정할 내용을 적용시키려면 main 브랜치로 checkout 해준 다음
git merge bugfix를 하면 된다.
gui로 확인해보면 이처럼 두 브랜치가 합쳐지며 수정사항이 main에 반영되게 된다.

하지만 branch가 실패하는 경우도 있다. 지금은 로컬 저장소에서 혼자 사용하지만 이후 여러 명이서 코드를 관리하게 되면
내가 main브랜치에서 새 브랜치를 만들어 수정하는 동안 다른 사람도 main브랜치에서 새 브랜치를 만들고 수정을 후 merge로 main을 수정이 가능하다.
이때 내가 수정한 사항을 merge 하게 되면 코드의 겹치는 부분이 충돌할 수 있고 이를 comflict가 발생했다고 한다.

comflict가 발생한 상태에서 해당 파일을 열어보면 겹치는 부분을 표시해준다.
(아마 라인이 겹치면 겹치는 것으로 보는 것 같다 -> 수정은 사용자가 필요에 따라 알아서 해야 된다고 한다.)

이를 보고 적용하려는 코드로 수정을 해준후 commit을 해주면 된다.
rebase 또한 두 브랜치를 합치는 느낌인데 merge와 차이점은 한 브랜치를 뚝 때서 다른 브랜치 앞으로 붙인다는 것이다.
아직 완전하게 이해하지는 못하였는데 조금 더 히스토리를 예쁘게 정리할 때 사용하면 되는 것 같다.
rebase 사용 명령어는 [git rebase 옮겨줄브랜치이름] 이다.

● branch 이동
위에선 브랜치를 만들 때 가장 마지막으로 commit 된 곳에서 만들었다.
하지만 이전 버전에서부터 수정을 해야 하는 경우도 있는데 이경우 head를 조절하면 된다.
head란 선택되어 있는 브랜치를 가리키는 포인터로 위에서 checkout을 통해 head의 위치를 바꿔줬던 것이다.
이 head를 포인터와 분리해 가리키게 할 수 있다.
똑같이 checkout 을 사용하는데 branch이름 대신 이동하려는 태그 이름을 써주면 된다.

이상태에서 새로운 브랜치를 만들게 되면 v2.3에서 뻗어 나오는 브랜치를 만들 수 있다.
다음으로 이미 만들어진 브랜치를 이동시키는 방법이다.
brach 명령어를 사용하며 -f 옵션과 이동시킬 위치를 써줘야 한다.

이때 위치는 태그 이름이나 다른 브랜치 둘 다 써줘도 가능하다.
'git' 카테고리의 다른 글
| [git] git 원격저장소 (0) | 2022.07.12 |
|---|---|
| [git] git 기본 개념 및 실습 (0) | 2022.07.05 |