깃에서 브랜치는 특정 커밋을 가리키는 포인터입니다.
git init
을 실행하여 현재 작업 공간을 git repo로 만들었다고 가정해봅시다.
master 브랜치가 생성되었고 세 개의 커밋을 진행한 상태를 생각해봅시다.
이 다음에 새로운 testing이라는 새로운 깃 브랜치를 생성합니다.
그럼 위 그림과 같은 상태가 됩니다.
HEAD는 현재 작업중인 브랜치를 가르킵니다.
깃에서 브랜치 포인터들은 서로 다른 커밋을 가리키고 있고 HEAD를 움직여서 현재 작업중인 브랜치에서 다른 브랜치로 이동할 수 있습니다.
위에서 브랜치를 testing 브랜치를 생성하면 HEAD가 testing 브랜치를 가리키게 됩니다.
git branch
는 새로운 브랜치만 생성하고
git checkout
은 새로운 브랜치를 생성한 후 해당 브랜치로 이동합니다.
위 그림은 현재 작업 중인 브랜치가 testing 브랜치입니다.
이 상태에서 새로운 커밋을 만들었다고 가정해봅시다.
그럼 아래 그림처럼 testing 브랜치가 새로운 커밋을 가리키고 HEAD 또한 testing 브랜치를 가리키지만 master 브랜치는 여전히 이전 커밋을 가리키고 있습니다.
이 상태해서 git checkout
을 실행하여 master 브랜치로 이동한다면 다음 그림과 같게 됩니다.
HEAD는 master 브랜치가 가리키는 커밋을 가리키게 되고, working directory의 파일도 이 커밋 시점으로 돌아가게 됩니다.
이 상태(master 브랜치에 있는 상태) 새로운 변경사항을 만들고 commit을 하게 되면 다음과 같이 됩니다.
이렇게 되면 master 브랜치는 새로운 커밋을 가리키고 되고 HEAD 또한 마찬가지입니다.
이렇게 프로젝트 히스토리가 분리되고 두 작업 내용은 서로 독립적으로 각 브랜치에 존재하게 됩니다.
따라서 깃 브랜치를 어디서 생성했는지(어디서 분기하느냐)는 매우 중요합니다.
.git 디렉토리 안에 HEAD 파일을 확인하면
ref: refs/heads/chicken (chicken은 브랜치 이름이고 예시를 든 것입니다.)
위처럼 chicken 브랜치를 참조한다는 것을 확인할 수 있고
위 경로로 이동하여 chicken 파일을 확인하면, chicken 브랜치가 가리키는 커밋의 커밋 해시가 내용으로 들어있는 걸 확인할 수 있습니다.
git branch
현재 깃 레포에 존재하는 브랜치들을 확인할 수 있습니다.
git branch <branch-name>
새로운 브랜치를 생성합니다. 현재 HEAD가 가리키는 커밋을 기준으로 생성됩니다.
새로운 브랜치를 생성하지만 그 브랜치로 이동하지는 않습니다.
git checkout <branch-name>
checkout으로 브랜치를 생성할 수도 있습니다. 이는 생성과 함께 브랜치를 이동합니다.
checkout
명령어는 브랜치 생성 말고도 여러 일을 많이 하기 때문에(working tree 파일 복원 등)
저는 브랜치 branch
를 이용한 브랜치 생성과 switch
를 이용한 브랜치 이동을 주로 사용합니다.
git switch <branch-name>
브랜치 이름에 해당하는 브랜치로 이동합니다.
HEAD도 해당 브랜치를 가리키게 됩니다.
-c
옵션을 주어서 브랜치를 생성하고 이동하는 걸 같이 할 수도 있습니다.
브랜치를 이동할 때 현재 작업중인 브랜치에서 만든 변경사항과, 이동하려고 하는 브랜치에서 만든 변경사항이 충돌하는 경우 브랜치를 이동할 수 없습니다.
stash
를 하거나 commit
하거나, restore
를 실행해 모든 변경사항을 없애버리고 이동할 수 있습니다.
변경사항이 충돌하지 않는다면 오류없이 이동할 수 있습니다.
git branch -d or --delete <branch-name>
해당 브랜치 이름의 브랜치를 삭제합니다.
현재 작업중인 브랜치가 삭제할 브랜치인 경우에는 삭제하지 못하고 다른 브랜치로 이동하여 삭제해야 합니다.
완전히 병합된 브랜치여야 삭제가 가능합니다. 병합되지 않은 브랜치라면 삭제할 수 없습니다.
병합 여부와 상관없이 브랜치를 삭제하려면 -f or --force
옵션을 추가하거나
-D
옵션으로 브랜치를 삭제할 수 있습니다
-D
옵션은 --delete --force
의 shorthand 입니다.
git branch -m or --move <새로운 branch-name>
브랜치를 삭제할 때는 내가 현재 삭제하려는 브랜치에 있는 경우 삭제가 불가능했지만
브랜치 이름을 바꾸려고 하는 경우 바꾸려는 브랜치로 이동한 후 이름 변경이 가능합니다.
🙏🙏🙏
git 시리즈에 작성한 포스팅은
https://www.udemy.com/course/best-git-github/
유데미 강좌
https://www.yes24.com/Product/Goods/110795446
모두의 깃 & 깃허브
위 내용을 참고하였으며, 제 실습화면을 캡쳐한 사진 외의
대부분의 사진들은 인터넷 강좌에서 제공하는 자료를 캡쳐하였습니다.
깃 시리즈 포스팅의 내용 및 사진을 절대로 상업적 목적으로 무단 복사하지 말아주세요.
또한 작성한 포스팅은 문제가 발생할 시 전부 삭제할 예정입니다.