브랜치
- 정의 : 논리적으로는 어떤 커밋과 그 조상들의 묶음
- Actually, 단순히 커밋 객체 하나를 가리킴
- Actually, 단순히 커밋 객체 하나를 가리킴
- 커밋을 하면 커밋 객체가 생긴다.
- 커밋 객체 = 부모 커밋에 대한 참조 + 실제 커밋을 구성하는 파일 객체
브랜치 사용 시기
새로운 기능 추가
- 가장 대표적으로 브랜치를 사용하는 경우
- master 브랜치는 보통 안정적인 버전의 프로젝트가 저장되어 있음
→ 새로운 기능을 추가할때는 master 브랜치로부터 브랜치를 생성
버그 수정
- 버그 발생시 master 브랜치로부터 새로운 브랜치 생성
- 이때 브랜치 이름은 hotFix 또는 bugFix 사용
- 버그가 다 고쳐지면 master 브랜치에 병합
병합과 리베이스 테스트
- 병합이나 리베이스는 까다로운 작업 → 임시 브랜치를 만들어 여러 테스트 진행
- 병합이나 리베이스는 까다로운 작업 → 임시 브랜치를 만들어 여러 테스트 진행
이전 코드 개선
- 다른 브랜치의 이전 코드는 이미 잘 돌아가고 있기 때문에 과감하게 이전 코드 삭제 가능
- 다른 브랜치의 이전 코드는 이미 잘 돌아가고 있기 때문에 과감하게 이전 코드 삭제 가능
특정 커밋으로 돌아가고 싶을때
- 이미 저장되어있는 특정 커밋으로 돌아갈때 hard reset이나 revert를 사용
→ 해당 방식은 비효율적이라 추천하지 않음 - 브랜치를 새로 만들어서 작업을 하고 리베이스나 병합을 사용하는 것이 좋음
- 이미 저장되어있는 특정 커밋으로 돌아갈때 hard reset이나 revert를 사용
브랜치 생성 명령어
git branch [-v]
: 로컬저장소의 브랜치 목록 확인- -v 옵션을 사용하면 마지막 커밋도 함께 표시
- 표시된 브랜치중 이름 왼쪽에 *이 붙어있는 브랜치가 HEAD 브랜치
git branch [-f] <브랜치이름> [커밋체크섬]
: 새로운 브랜치를 생성- 커밋체크섬을 생략하면 HEAD로부터 브랜치를 생성
- 이미 있는 브랜치를 다른 커밋으로 옮기고 싶을때는 -f 옵션을 줘야함
git branch -r[v]
: 원격저장소에 있는 브랜치 목록 확인- -v 옵션으로 커밋 요약을 확인 가능
- -v 옵션으로 커밋 요약을 확인 가능
git checkout <브랜치이름>
: 특정 브랜치를 체크아웃할 때 사용- 브랜치 이름 대신 커밋 체크섬을 사용할 수 있지만 브랜치 이름을 쓰는 것을 추천
git checkout <커밋체크섬>
을 하면 어떻게될까?- HEAD와 브랜치가 분리되는 Detached HEAD 상황이 됨
- 커밋 생성이 가능하지만 다른 브랜치로 체크아웃하는 순간
Detached HEAD의 커밋들은 사라져 보이지 않음- 로컬저장소에 남아있어 git reflog 명령어로 복구 가능
- 로컬저장소에 남아있어 git reflog 명령어로 복구 가능
- 추천하지 않는 방식
- 브랜치 이름 대신 커밋 체크섬을 사용할 수 있지만 브랜치 이름을 쓰는 것을 추천
git checkout -b <브랜치이름> <커밋체크섬>
: 특정 커밋에서 브랜치를 생성하고 동시에 체크아웃- 두 명령어를 하나로 합친 것이기 때문에 자주 사용
- 두 명령어를 하나로 합친 것이기 때문에 자주 사용
git merge <대상브랜치>
: 현재 브랜치와 대상 브랜치를 병합- 병합 커밋이 새로 생기는 경우가 많음
- 병합 커밋이 새로 생기는 경우가 많음
git rebase <대상브랜치>
: 내 브랜치의 커밋들을 대상 브랜치에 재배치
git branch -d <브랜치이름>
: 특정 브랜치를 삭제할 때 사용- HEAD 브랜치나 병합되지 않은 브랜치는 삭제할 수 없음
- HEAD 브랜치나 병합되지 않은 브랜치는 삭제할 수 없음
git branch -D <브랜치이름>
: 브랜치를 강제로 삭제- -d 옵션으로 삭제할 수 없는 브랜치를 삭제할 때 사용
HEAD란?
- 현재 작업중인 브랜치를 가리킴
- 브랜치는 커밋을 가리키므로 HEAD도 커밋을 가리킴
- HEAD는 현재 작업중인 브랜치의 최근 커밋을 가리킴
- 새로운 커밋을 생성하면?
- 새로 생성한 커밋의 부모는 언제나 이전 HEAD 커밋
- 커밋이 생성되면 HEAD는 새로운 커밋으로 갱신
- HEAD가 가리키는 브랜치도 HEAD와 함께 새로운 커밋을 가리킴
- 새로운 커밋을 생성하면?
체크아웃
- 정의 : 브랜치의 내용을 워킹트리에 반영할때 사용
- HEAD가 가리키는 커밋을 변경 → 브랜치가 가르키고 있는 커밋의 내용을 워킹트리에 반영