협업을 할 때, 아니 굳이 협업을 하지 않더라도 이제 개발자에게 Git은 더이상 선택이 아닌 의무가 되고 있다. 협업을 할때 로컬에서 작업한 내용을 원격 저장소에 업로드할 수 있는 장점은 두말하면 잔소리고... 개인 프로젝트를 진행할 때도 커밋 내역을 보고 롤백하거나, 체리픽을 수행하며 내 워킹 디렉토리도 안정적이고 효율적으로 관리할 수 있다.
하지만 정작 이런 기능들이 어떻게 수행되는지 전혀 무지하고 있다는 사실을 깨달았다. 따라서 Git 동작 방식에 대해 간략히 정리해보려 한다.
Git의 동작 방식에 대해 알아보려면, 가장 먼저 Git을 논할 때 가장 기본이 되는 로컬 저장소, 원격 저장소 개념은 물론이고! 우리가 일반적으로 논하는 워킹 디렉토리와 스테이징 공간, 로컬 저장소가 정확히 어떤 의미에서 다른지 확실하게 넘어가야 한다고 생각한다.
Git을 사용하지 않더라도 흔히 접할 수 있는 용어이다. 정말 단순하게 생각해서 우리 개인 PC에서 프로젝트를 만들고 실시간으로 코드를 작성하는 그대로 반영되는 공간을 의미한다.
워킹 디렉토리에서 작업했던 내용을 해시 알고리즘을 적용하여 관리한다. 각 파일의 내용으로 해싱처리하여 파일 내용을 간편하게 비교함으로써 conflict 체크, 수정된 파일 확인 등에 사용된다.
로컬 저장소는 git commit
또는 git fetch
작업 수행 시 변동되는 공간이다. 기존 스테이징 공간과 다른 점은 단순히 파일 정보 뿐만 아니라, 이전 Commit 정보, 누가 커밋했는지 등에 대한 정보가 추가적으로 저장된다. 따라서 conflict 등 파일과 관련된 처리는 스테이징에서, 이전 이력 및 계정 정보에 대한 관리는 로컬 저장소에서 이루어진다는 개념으로 이해했다.
말그대로 원격의 저장소를 의미한다. 로컬에서 작업한 내용을 다른 PC나 사용자들이 공유할 수 있도록 간편하게 사용할 수 있는 저장 공간을 제공한다.
무작정 " .git
폴더 만들어주는 것 아닌가요? " 라고 생각하고 있었다. 하지만 정확히 이 .git
폴더가 왜 필요한지, 어떤 데이터를 저장하고 있는지 알아보자
먼저 git init
은 로컬과 원격 저장소를 생성/연결하기 전에, 먼저 로컬 저장소와 스테이징 공간을 생성해주는 커맨드다. 차후 로컬과 원격 저장소의 연결 (.git/config) 과 코드 버전 관리 (.git/index , .git/objects) 를 해주기 위해 필요한 기본적인 설정에 해당한다. 즉, 차후 git add
, git commit
등의 작업이 수행될 때 발생하는 데이터들이 결국 .git
폴더에 저장되고 관리된다.
로컬 저장소와 원격 저장소의 연결을 추가하는 것을 의미한다. 이때, 일반적으로 git clone
에는 이 작업이 내재되어 있는데, git remote add
명령어를 통해 기본 원격 저장소가 아닌 제 2의, 제 3의 원격 저장소도 추가하여 <별칭> 으로 관리할 수 있다. ( Branch를 사용하지 않는 경우가 아니라면 무슨 의미가 있을진 잘.... )
워킹 디렉토리에서 작업한 내용을 스테이징 공간에 저장하는 과정이 이루어진다.
git add
명령어로 끌어온 스테이징 공간에 저장된 데이터를 로컬 저장소로 옮기면서, 계정 정보 및 커밋 히스토리 갱신 작업이 추가적으로 수행된다.
로컬 저장소에서 발생한 커밋 내역을 원격 저장소에 업로드하는 작업이 진행된다.
http://daplus.net/git-git-추가-vs-푸시-vs-커밋/
https://velog.io/@leyuri/Git-remote-리모트-저장소-저장소-추가하는-법
https://it-eldorado.tistory.com/4