호우동의 개발일지

Today :

브랜치

  • 정의 : 논리적으로는 어떤 커밋과 그 조상들의 묶음
    • Actually, 단순히 커밋 객체 하나를 가리킴

  • 커밋을 하면 커밋 객체가 생긴다.
    • 커밋 객체 = 부모 커밋에 대한 참조 + 실제 커밋을 구성하는 파일 객체

브랜치 사용 시기

  • 새로운 기능 추가
    • 가장 대표적으로 브랜치를 사용하는 경우
    • master 브랜치는 보통 안정적인 버전의 프로젝트가 저장되어 있음
      → 새로운 기능을 추가할때는 master 브랜치로부터 브랜치를 생성

  • 버그 수정
    • 버그 발생시 master 브랜치로부터 새로운 브랜치 생성
    • 이때 브랜치 이름은 hotFix 또는 bugFix 사용
    • 버그가 다 고쳐지면 master 브랜치에 병합

  • 병합과 리베이스 테스트
    • 병합이나 리베이스는 까다로운 작업 → 임시 브랜치를 만들어 여러 테스트 진행

  • 이전 코드 개선
    • 다른 브랜치의 이전 코드는 이미 잘 돌아가고 있기 때문에 과감하게 이전 코드 삭제 가능

  • 특정 커밋으로 돌아가고 싶을때
    • 이미 저장되어있는 특정 커밋으로 돌아갈때 hard reset이나 revert를 사용
      → 해당 방식은 비효율적이라 추천하지 않음

    • 브랜치를 새로 만들어서 작업을 하고 리베이스나 병합을 사용하는 것이 좋음

 


브랜치 생성 명령어

  • git branch [-v] : 로컬저장소의 브랜치 목록 확인
    • -v 옵션을 사용하면 마지막 커밋도 함께 표시
    • 표시된 브랜치중 이름 왼쪽에 *이 붙어있는 브랜치가 HEAD 브랜치

  • git branch [-f] <브랜치이름> [커밋체크섬] : 새로운 브랜치를 생성
    • 커밋체크섬을 생략하면 HEAD로부터 브랜치를 생성
    • 이미 있는 브랜치를 다른 커밋으로 옮기고 싶을때는 -f 옵션을 줘야함

  • git branch -r[v] : 원격저장소에 있는 브랜치 목록 확인
    • -v 옵션으로 커밋 요약을 확인 가능

  • git checkout <브랜치이름> : 특정 브랜치를 체크아웃할 때 사용
    • 브랜치 이름 대신 커밋 체크섬을 사용할 수 있지만 브랜치 이름을 쓰는 것을 추천
      • git checkout <커밋체크섬> 을 하면 어떻게될까?
        • HEAD와 브랜치가 분리되는 Detached HEAD 상황이 됨
        • 커밋 생성이 가능하지만 다른 브랜치로 체크아웃하는 순간
          Detached HEAD의 커밋들은 사라져 보이지 않음
          • 로컬저장소에 남아있어 git reflog 명령어로 복구 가능

        • 추천하지 않는 방식

  • git checkout -b <브랜치이름> <커밋체크섬> : 특정 커밋에서 브랜치를 생성하고 동시에 체크아웃
    • 두 명령어를 하나로 합친 것이기 때문에 자주 사용

  • git merge <대상브랜치> : 현재 브랜치와 대상 브랜치를 병합
    • 병합 커밋이 새로 생기는 경우가 많음

  • git rebase <대상브랜치> : 내 브랜치의 커밋들을 대상 브랜치에 재배치
  • git branch -d <브랜치이름> : 특정 브랜치를 삭제할 때 사용
    • HEAD 브랜치나 병합되지 않은 브랜치는 삭제할 수 없음

  • git branch -D <브랜치이름> : 브랜치를 강제로 삭제
    • -d 옵션으로 삭제할 수 없는 브랜치를 삭제할 때 사용

 


HEAD란?

  • 현재 작업중인 브랜치를 가리킴
  • 브랜치는 커밋을 가리키므로 HEAD도 커밋을 가리킴
  • HEAD는 현재 작업중인 브랜치의 최근 커밋을 가리킴
    • 새로운 커밋을 생성하면?
      • 새로 생성한 커밋의 부모는 언제나 이전 HEAD 커밋
      • 커밋이 생성되면 HEAD는 새로운 커밋으로 갱신
      • HEAD가 가리키는 브랜치도 HEAD와 함께 새로운 커밋을 가리킴

 


체크아웃

  • 정의 : 브랜치의 내용을 워킹트리에 반영할때 사용
    • HEAD가 가리키는 커밋을 변경 → 브랜치가 가르키고 있는 커밋의 내용을 워킹트리에 반영