jjinyeok 성장일지

프로젝트 관리 도구(GIT) #1 - 2022/07/27 본문

[KT AIVLE School]

프로젝트 관리 도구(GIT) #1 - 2022/07/27

jjinyeok 2022. 7. 28. 01:08

  시작을 맞아 에이블스쿨의 첫 수업으로 <프로젝트 관리 도구(GIT)> 수업이 진행되었다. 무려 생활코딩 이고잉님께서 직접 강의를 진행해주셨는데, 생활코딩 유튜브로 코딩을 입문하고 <Do it! 지옥에서 온 문서 관리자 깃&깃허브 입문> 책을 통해 깃을 배운 나에게는 정말 영광스런 순간이었다. 오늘의 수업을 잊지 않기 위해 정리를 시작해본다.

 

  내 예상과 수업은 다르게 진행되었다. 명령어 작성법보다는 깃의 구성과 동작에 대해 자세히 배웠다. 나는 여러번의 협업과 프로젝트를 통해 깃 명령어를 통한 버전관리와 conflict 등의 사항에 대한 해결 방식을 알고 있었다. 그러나 나는 깃이 어떻게 구성되고 동작하는지 제대로 알고 있지 않았다. 따라서 깃을 사용하며 협업하면서 또한 문제상황을 해결하면서 나는 항상 찝찝했다. 그러나 오늘 강의를 듣고 깃의 구성과 동작원리를 알게 되어 이 찝찝함이 해소되었다.

 

1. 버전관리(Version Control)란?

  최종.txt, 최최종.txt, 진짜최종.txt, ... 과 같이 현실세계에서 버전관리가 진행된다. 마찬가지로 개발을 진행하는데 있어도 소스코드의 변경사항을 체계적으로 기록하는 것을 버전관리라 한다. 이렇게 만들어진 버전은 디버깅, 백업, 협업과 같은 목적으로 사용된다. 특히 디버깅의 관점에서 하나의 버전은 버그를 찾기 위해 가능한 작게, 하나의 단위 기능마다 버전을 만들어두는 것이 좋고 커밋 메세지는 확실하게 작성해두는 것이 좋다.

 

2. 깃(git)이란?

  어떤 오픈소스 프로젝트가 어마어마한 코드라인을 가지고 30년 이상 진행된다고 했을 때, 이것의 버전관리는 상당히 힘들 것이다. 이때, 이런 Hell 같은 상황에서 git이라는 the information manager from hell이 등장하게 되었다. 이 오픈소스 프로젝트가 바로 Linux이며 Linux를 만든 리누스 토발즈(Linus Benedict Torvalds)가 버전관리 시스템으로 git을 만들었다.

 

3. 깃의 구성은?

그림을 통해 모호했던 개념들을 이해할 수 있었다.

  1. 현재 디렉토리를 버전관리하고 싶다면 현재 디렉토리에서 git init 명령어를 사용한다. .git이라는 디렉토리가 생성되는데 이는 ls -a을 통해 사용확인해볼 수 있다. .git 디렉토리가 git 버전관리를 담당한다.

  2. git add "파일명" 명령어를 통해 원하는 파일을 stage로 올릴 수 있다. 이때 stage area에서는 올려놨던 모든 파일들이 존재한다. 즉 stage area는 장바구니 같은 개념으로 git add를 통해 원하는 파일들은 계속 올라가게 된다.

  3. git commit -m "커밋 메세지명" 명령어를 통해 stage에 있는 파일들의 버전을 만든다. 만들어진 버전은 커밋 ID를 통해 부모를 알 수 있고 부모를 저장한다.

 

4. HEAD와 master란?

detached HEAD state는 위험하다. attached HEAD state 상황을 만들어 놓는 것이 현명하다.

  HEAD는 working directory가 어떤 버전인지 가리킨다. 또한 master란 default 브랜치명이다. 즉 master도 하나의 브랜치인 것이다. 즉 기본적인 경우인 attached HEAD state의 경우는 HEAD가 브랜치를 가리키고 브랜치가 커밋을 가리키는 경우이다. 또한 detached HEAD state의 경우는 HEAD가 브랜치가 아닌 커밋을 직접 가리키는 경우이다.

  이때, git checkout "브랜치명 or 이동하려는 커밋의 ID" 명령어를 통해 HEAD를 옮긴다. 이 명령어를 통해 디버깅을 할 수 있는데 과정은 다음과 같다.

  1. git checkout "커밋 ID"를 통해 버그가 난 커밋까지 계속 뒤로 가며 이동한다.

  2. 버그가 발생한 커밋을 확인한다.

  3. git checkout master(master가 아니어도 현재 최신의 마지막 버전이면 된다!)를 통해 복귀한다.

  4. 버그가 발생한 커밋을 참고하여 가장 최신 버전에서 버그를 수정한다.

 

5. checkout과 reset란?

  git checkout "브랜치명 or 이동하려는 커밋의 ID" 명령어를 통해 HEAD를 옮긴다면, git reset "이동하려는 커밋의 ID" 명령어는 2가지 경우가 있다. 첫번째 attached HEAT state의 경우, 현재 HEAD가 가리키는 브랜치를 옮긴다. 두번째 detached HEAD state의 경우, git checkout "이동하려는 커밋의 ID" 명령어와 같이 HEAD를 옮긴다.

  깃에게는 불변경 특성이 있다. 깃은 어떤 버전도 지우지 않고 수정하지 않는다는 것이다. 따라서 git reset "이전으로 이동하려는 커밋의 ID" 명령어를 통해 이전 커밋으로 이동하여 현재 버전을 깃에서 삭제할 수도 있고, git reset "복구하려는 커밋의 ID" 명령어를 통해 버전을 복구할 수도 있다. 즉, git reset은 삭제와 복원을 둘 다 할 수 있다.

  이때, 복구하려는 커밋의 ID를 알 수 없다면 git reflog 명령어를 통해 삭제했던 커밋의 ID를 알 수 있으므로 확인하여 복원할 수 있다.

Comments