git에 대해서 좀 더 자세하게 정리해봅시다.

intro

  • git을 쓰고는 있는데, git이 무엇인지 모릅니다 하하하하. 코어가 중요하죠. 그래서 git을 정리합니다.

  • git-scm에 아주 상섹하게 git에 대한 설명이 정리되어 있습니다. 각 챕터별로 정리를 좀 잘해두면 좋을 것 같아서 천천히 읽으면서 정리를 해보려고 합니다.

버전관리의 필요성 과 역사

  • 파일을 저장할 때 저 뿐만 아니라 많은 사람들이, 따라서 다음 순서로 변해갔습니다.
    1. 로컬에서 각자 버전 관리하기: 협업시의 문제점 발생
    2. 중앙 저장소에서 버전 관리하기: 중앙저장소에 문제가 생기면 작살남. 동기화 이슈도 중요, 네트워크 속도도 중요한 이슈. svn에 여기에 속하죠.
    3. 분산 저장소에서 버전 관리하기: 이 형태가 git.

짧게 보는 git의 역사

  • git의 장점은 다음들로부터 온 다고 합니다.
    • 빠른 속도, 단순한 구조
    • 완벽한 분산(아마도 repository를 그대로 복제해오기 때문일듯)
    • 특히, 비선형적인 개발(수천개의 브랜치가 있어도 상관없음)

git 기초

  • svn의 경우 중앙 저장소에서 버전별로 델타(파일의 변화)를 관리합니다. 즉, 특정 버전을 가져오기 위해서는 초기 버전에서 원하는 버전까지의 델타 히스토리를 연쇄적으로 계속 적용하여 그 결과를 보여줘야 한다는 것이죠.

not delta, just snapshot

svn delta

  • 반면 git의 경우는 델타를 관리하는 것이 아니라, 스냅샷으로 관리합니다.
  • 스냅샷 이란, “현재의 서버, 프로젝트 데이터 등을 사진 찍듯이 그대로 찍어서 남겨두는 것”을 의미합니다. 세부적으로는 이렇게 저장하면서도 데이터 백업을 빠르게 할 수 있는지 등에 대해서 알아보는 것이 필요한데, 일단 이 부분은 무시할게요. 아무튼, 스냅샷을 사용해서 데이터를 그대로 보존합니다.
    • 즉, svn 처럼 변화를 관리하는 것이 아니라, 그 시점의 데이터를 그대로 관리하기 때문에 훨씬, 빠르게 특정 시점의 버전으로 돌아갈 수 있는 것이죠.

git snapshot

  • 특정 커밋 시점의 데이터를 스냅샷으로 관리한다 라는 것은 ==> 변화된 파일은 파일 그대로를 거의 복제하고, 변화되지 않은 파일들은 링크만 가지고 해당 커밋 시점의 데이터들을 그대로 저장한다. 라고 생각하시면 됩니다. 이렇게 말하니, 모든 변화를 델타로 관리하는 svn과는 차이점이 있어 보이네요. 그러함에도 이렇게 할 경우에 데이터 상에 로스가 발생할 것 같은데, 이 부분이 아마 기술적으로 어려운 부분이 아닐까 생각해봅니다. 하하하핳

branch with snapshot

  • 여기서 왜 스냅샷이 git에서 중요하며, 이를 통해서 branch가 어떻게 잘 구현될 수 있었는지를 설명합니다.

  • svn의 경우 아까 말한 바와 같이 중앙저장소에서 delta만을 관리합니다. 만약 제가 새로운 형태의 버전(branch)를 만들어야 한다면, 특정 시점의 파일을 만들기 위해서는 해당 지점까지의 delta를 모두 적용하여 실제 파일을 만들어내야 합니다.

  • 하지만 git의 경우는 이를 스냅샷을 이용해서 관리합니다. 즉 어떤 view든, 그 시점의 스냅샷만 가지고 있다면 편리하게 관리할 수 있다는 것이죠. 그래서 branch간의 이동, branch 생성 등이 svn에 비해서 월등히 간편합니다. 이 부분이 git이 장려하는 부분이기도 하고, svn이 git보다 매우 부족한 부분이기도 하죠.

local repository

  • svn의 경우는 중앙에서 버전의 차이(diff or delta)를 관리해줬기 때문에, 네트워크 속도에 의해서 성능이 결정됩니다.
  • 하지만 git의 경우는 로컬에서 모든 걸 처리합니다. 사실상 remote repository에 있는 내용을 그대로 복사해서 로컬에 넣어두었다고 해도 됩니다. 따라서 네트워크 속도와 관계없이 죽 처리하고 나중에 push할때만 주의하면 됩니다.

basic and frequent command

  • 간단히 워드 파일 하나를 작성하고 있다고 생각해봅시다. 해당 파일은 다음의 형태로 구분되어서 관리될 수 있어요.
    • untracked: 파일 자체가 git의 관리 하에 있지 않은 경우
    • unmodified: 관리하에 있으나 파일 자체에 변경된 것이 없는 경우
    • modified: 관리하에 있으며, 파일이 변경된 경우
    • staged: 파일을 커밋 직전으로 올림. 일종의 임시저장의 개념
  • 아래 그림에서 보면 더 명확해짐.

wrap-up

  • 흠. 정리하고 나니까 대략 알겠는데. 어차피 제가 쓰는 건 매우 간단한 것들 뿐이죠 하하핳

reference

댓글남기기