Git

Git Branch-2

검정95 2021. 6. 15. 21:20

브랜치 이동(checkout)

현재 브랜치를 떠나 새로운 브랜치로 돌아간다는 의미, 깃에서 브랜치 간 이동할 때는 checkout 명령어를 사용한다.

깃은 하나의 워킹 디렉터리만 가지고 있다. 워킹 디렉터리는 선택한 브랜치 하나만 연결되어 있다. 즉, 한 브랜치에서만 작업과 커밋을 할 수 있습니다. 따라서 다른 브랜치에서 작업하려면 반드시 브랜치를 변경하여 워킹 디렉터리를 재설정해야 합니다.

 

브랜치가 변경되면 내부적으로 몇가지 동작이 실행됩니다.

  • HEAD 정보는 항상 변경된 브랜치의 마지막 커밋을 가리킨다. 이처럼 HEAD가 브랜치의 마지막 커밋을 의미하기 때문에 브랜치가 이동하면 HEAD 포인터도 함께 이동한다.
  • 변경된 브랜치로 새로운 작업을 할 수 있도록 워킹 디렉터리를 변경한다. 브랜치를 변경하려면 기존 브랜치의 워킹 디렉터리를 정리해야 한다. 기존 브랜치의 워킹 디렉터리를 정리하지 않고서는 브랜치를 변경할 수 없다.

 

 

HEAD 포인터?

깃은 객체의 포인터 개념을 사용한다. 대표적인 객체 포인터는 HEAD이다. 깃 동작을 정확하게 이해하려면 HEAD가 무엇인지 아는것이 중요하다.

마지막 커밋

깃은 마지막 커밋 정보다 중요하다. 깃은 마지막 정보를 기반으로 새로운 커밋을 생성한다. 마지막 커밋은 새로운 커밋의 부모이다.

시스템이 매번 커밋할 때마다 마지막 커밋 정보를 찾으면 부하가 발생한다. 깃은 마지막 커밋을 쉽게 확인할 수 있도록 특수한 포인터를 제공하는데, HEAD는 작업 중인 브랜치의 마지막 커밋 ID를 가리키는 참조 포인터이다.

깃은 마지막 커밋을 가리키는 HEAD 포인터를 부모 커밋으로 대체하여 사용합니다. HEAD 포인터를 사용하여 빠르게 스냅샷을 생성할 수 있다.

브랜치를 이동하면 HEAD 포인트도 이동한다. 브랜치가 여러 개면 HEAD 포인트도 여러 개다. 각각의 브랜치마다 마지막 커밋이 다르기 때문이다. 브랜치마다 마지막 커밋 ID를 가리키는 HEAD 포인터가 하나씩 있다.

 

브랜치 이동에 대해서 좀 더 자세히 알아보면

브랜치는 특정한 커밋에 별명을 부여한 것과 같다. 일반적으로 브랜치를 생성할 때는 마지막 커밋을 기준을 한다. 그리고 커밋 해시 값을 지정한 별칭으로 브랜치 목록에 등록한다.

이러한 동작 원리로 볼 때 브랜치 이름은 커밋 해시키와 동일하다. 따라서 브랜치로 이동할 때 꼭 브랜치 이름만 사용할 필요는 없다. 브랜치 이름 대신 커밋 해시키를 사용하여 체크아웃 할 수 있다.

 

원격 브랜치

깃은 다수의 개발자와 협업으로 콛를 유지할 수 있다. 주요 개발 작업들은 로컬 저장소에서 하지만 협엽은 원격 저장소도 공유한다.

로컬 저장소도 하나의 저장소고, 원격 저장소도 하나의 저장소이다. 그렇다면 브랜치를 이용하여 협업을 하는 방법에 대해서 알아보자.

리모트 브랜치

저장소는 각자의 고유한 브랜치를 생성하고 관리한다. 원격 저장소에 생성한 브랜치를 리모트 브랜치라고 한다. 로컬 저장소에 생성한 브랜치는 서버로 공유할 수 있다. 원격 저장소와 연결된 로컬 저장소에서 새로운 브랜치를 생성한다고 해서 자동으로 원격 저장소에도 브랜치가 생성되는 것은 아니다. 또 원격 저장소에 등록된 브랜치가 자동으로 로컬 저장소를 만들지도 않는다. 별도 명령을 통해 저장소 동기화를 수행해야 한다.

리모트 브랜치는 서버간에 통신을 하고 나서 생성된다. 따라서 로컬 저장소의 브랜치를 원격 저장소에 동기화 하려면 푸시 작업을 수행해야 한다.

 

업스트림 트래킹

업스트림(upstream)은 브랜치 추적을 다르게 표현한 것이다. 리모트 브랜치는 브랜치 이름을 동일하게 생성할 수도 있고, 다른 이름으로 생성할 수도 있다. 이처럼 로컬 저장소의 브랜치와 원격 저장소의 브랜치는 업로드 할 수 있도록 매칭되어 있다. 이러한 매칭을 업스트림 트래킹이라고 한다. 트래킹 브랜치는 리모트 브랜치와 로컬 브랜치를 연결해 주는 중간 다리 역할을 한다.