Repository...Commit... 그리고 Git Branch?!
깃이 우리를 편하게 만들어준다는데 이거 맞아요?! Linus님!!!
Branch 란 나뭇가지를 의미한다. 이 비유적인 표현을 왜 썼을까에 대한 생각을 해야 한다.
한 프로젝트를 만들고 규모가 커지다 보면 여러 가지 버전이 생기기 마련이다.
예를 들어 (무료 버전 / 유료 버전), (개발 버전 / 배포 버전) 등 수많은 버전이 만들 일이 생긴다. 이를 위해서 깃은 우리에게 브랜치라는 기능은 할 수 있게 해줬다.
다시 말해, 메인 프로젝트를 손상시키지 않으면서 여러 버전을 관리하기 위해서 Git Branch를 사용한다. 마치 나무에서 브랜치가 생기고 썩은 가지를 잘라내지만 나무 자체가 변하지는 않듯이 말이다.
브랜치는 하나의 코드 관리 흐름와 같다.
브랜치는 독립적인 작업 영억이다,
아래 명령어를 실행하면 새로운 branch를 생성하게 된다.
$ git branch [브랜치명]
브랜치를 생성 후, 반드시 checkout을 해줘야 만들어놓은 해당 브랜치로 전환이되며
전환된 브랜치에서 작업이 수행된다.
주의사항
git add -A
와 같은 옵션을 사용하게 되면 브랜치의 작업 내용이 모든 브랜치에 적용되게 된다.
아래 명령어를 사용하면 브랜치를 삭제할 수 있다.
단, 현재 HEAD 브랜치는 삭제할 수 없다.
$ git branch -d [삭제할 브랜치명]
-d
: delete
$ git checkout [브랜치명]
$ git switch [브랜치명] (체크아웃과 동일)
checkout
과 switch
의 차이점은
checkout
의 경우 git switch 와 git restore 두 가지 역할을 모두 수행하는
반면 git switch
는 말 그대로 브랜치만 바꿀 때 사용한다고 보면 된다.
(git restore 란 파일이 modified 상태였던 것을 unmodified로 변경할 때 사용한다.
즉, 작업 트리를 복원할 때 사용한다)
$ git checkout -b [브랜치명]
b: branch
하나의 명령어로 브랜치를 만들고 바로 이동할 수 있다.
$ git branch : 현재 브랜치 확인
$ git status : git 프로젝트의 상태(브랜치 포함)를 확인
$ git merge [브랜치명]
현재 위치한 브랜치와 작성한 해당 브랜치와 합친다.
또 다른 방법으로 rebase를 사용하는 것이다.
$ git rebase [합칠 브랜치명]
둘의 차이는 merge를 했을 경우 병합된 HEAD branch에 merge commit이 추가되고 나누어진 branch가 그대로 유지된다.
반면에 rebase의 경우 별도의 commit이 추가되지 않으며 하나의 라인으로 브랜치가 통합되는 차이가 있습니다.
$ git merge --abort
머지를 하다가 conflict가 발생했을 때, 일단은 머지 작업을 취소하고 이전 상태로 돌아감
주의사항
Merge시, 같은 파일 같은 라인에 수정을 한 두 브랜치를 병합하려면 Conflict
가 발생하게 된다.
파일 둘 중 1개를 선택해서 다시 merge를 수행해주어야 하니,
되도록 같은 파일을 다른 브랜치가 작업하게 만드는 것은 지양해야 한다.
해결 방법
자신이 원하는 코드 내용을 작성하고git add
,git commit
을 하면 된다.
HEAD branch 이름 변경
$ git branch -m [새로운 브랜치명]
HEAD branch가 아닌 다른 브랜치 이름 변경
$ git branch -m [바꿀 브랜치명][새로운 브랜치명]
두 브랜치를 비교하고 싶으면 아래 명령어를 사용하면 된다.
$ git diff [브랜치명1][브랜치명2]
$ git diff [브랜치명1]..[브랜치명2] (두 브랜치 사이 확인)
헤드는 사실 커밋을 가리키는 게 아니라 특정 커밋을 가리키는 브랜치를 가리킨다!
HEAD -> Branch -> commit
다른 브랜치로 체크아웃을 하면 HEAD의 위치가 바뀌는 걸 확인할 수 있다.
머지를 했을 때의 HEAD의 위치를 보면 현재 활성화중인 브랜치에 가리키는 걸 알 수 있다.