1 Concept in 3 Levels
Git의 기초 개념을 각각 초등학생, 대학생, 개발자의 눈높이에 맞춰서 설명해보자.
Git이라는 버전 관리 시스템은 개발자라면 반드시 배워야 합니다.
하지만 한번에 다 소화하기엔 복잡하고 어렵죠.
하지만 초등학생도 이해할 수 있게 단순화시킨 설명을 들어보고,
대학생, 개발자로 차츰 더 수준을 높여간다면 훨씬 더 이해가 쉽지 않을까요?
🧑🏫 안녕, 너 Git이 뭔지 알아?
👩🦱 전혀 몰라요.
🧑🏫 Git은 버전 관리 시스템이야.
너 학교에서 팀플한 적 있지? 다같이 PPT 만들어서 발표하고 그런거.
👩🦱 있죠... 갑자기 저번 학기 프리라이더 생각나서 킹받네요.
🧑🏫 아.. 글쿠나;; 근데 다같이 PPT 만들 때 좀 불편하지 않아?
👩🦱 완전 불편하죠. 각자 자기 파트 작업해서 갖고 오라고 하는데
한 거 카톡으로 보내서 막상 합쳐보면 하나도 내용도 안맞고 디자인도 안 맞고...
중간에 다른 사람 작업하는 거 보는 것도 불편하고요.
👩🦱 근데 꼭 다른 사람이 보면 한 두개 수정할 거 있거든요?
그럼 최종, 최종2.. 최최종.. 최최종 진짜 이렇게 되는 거죠.
🧑🏫 맞아. 사실 그런 것도 다 버전 관리 시스템이 필요한 상황이야.
각자 작업 내용을 버전별로 저장을 해두는 거지.
거기다가 여러명이서 작업을 같이 하니까 ‘동기화'도 해주고.
🧑🏫 프로그래머들도 비슷해.
프로그램 하나는 수백-수천장 짜리 PPT라고 생각하면 돼.
몇월 며칠까지 고객들 앞에서 발표해야 하는데,
그걸 여러명의 개발자들이 다 나눠서 만든 다음 합치는 거야.
🧑🏫 그러다보니까 중간에 뭘 어떤 부분을 수정했고, 누가 수정했고...
이런 내용을 기록해두는 버전 관리가 굉장히 중요하지.
👩🦱 그렇겠네요. 수천장짜리 PPT라니 끔찍하다.
전 개발은 안해야겠어요.
🧑🏫 버전 관리도 2가지 방식이 있어.
하나의 서버를 정하고, 거기에 버전을 기록하는 방식이야.
각자 작업한 파일을 그 중앙 서버에 저장하지.
버전 관리 시스템이 한 컴퓨터에 모여있어서, 중앙 버전 관리라고 해.
🧑🏫 근데 git은 각자 자기 컴퓨터에 버전 관리 시스템이 있어.
내 컴퓨터에도 git이 있고, 조원들 컴퓨터에도 다 각자 git이 있고.
그래서 '분산' 버전 관리 시스템이라고 불러.
🧑🏫 Git에서 자기가 한 작업은 자기 컴퓨터에 있는 버전 관리 시스템에다 하거든.
그 다음 다른 사람들의 컴퓨터와 중간중간 ‘동기화’를 시키지.
👩🦱 전에 구글 드라이브 써봤어요. 거기에도 보니까 업데이트할 때마다,
파일 수정했던거 다 기록이 남더라고요. 그런 느낌인 건가요?
🧑🏫 비슷해. 구글 드라이브 같은 원격 서버에만 버전 관리 시스템이 있는 방식.
즉, 중앙 버전 관리는 매번 원격 서버에 접속해서 버전을 관리해야 하는 거고.
🧑🏫 분산 버전 관리는 자기 컴퓨터에서 대부분의 버전 관리 작업을 할 수 있어.
필요할 때 구글 드라이브와 비슷한 원격 서버에 업데이트하고 다시 받아오는 식이야.
🧑🏫 덕분에 굉장히 빠르고, 인터넷이 잘 안터져도 얼마든지 작업을 할 수가 있지.
분산 방식으로 버전을 관리하는 시스템 중에 가장 널리 쓰이는 게 바로 git이고!
👩🦱 git 처음 들어봤는데 엄청 유명한가 보네요?
🧑🏫 키노트도 있고, 프레지도 있지만 발표할 땐 다 PPT 쓰듯이
버전 관리 시스템도 여러가지가 있지만, 개발자들은 거의 다 git을 써.
👩🦱 아하. 개발자들이 다 쓰는 공용 구글 드라이브 같은 느낌?
🧑🏫 그렇게 보면 돼. 근데 그것보다 훨씬 코드에 특화되어서 강력한 기능이 많아.
👩🦱 근데 버전을 정확히 어떤 식으로 기록하는 거에요?
🧑🏫 좋은 질문이야.
버전이란 건 시간에 따른 내용의 변화잖아?
내용의 변화를 기록할 때, 일단 맨 처음 내용을 기록하고 다음에 바뀐 부분만 기록하는 방식이 있어.
👩🦱 그래야겠죠? 매번 기록하면 중복이 일어나니까 비효율적이잖아요.
🧑🏫 근데 git은 조금 달라. 매번 파일의 전체 상태를 캡쳐해서 기록해.
만약에 맨 처음 파일에 ‘ABC’ 라고 적혀있었는데,
‘ABCD’로 바꾸고 버전을 저장한다면.
git은 ‘ABC’ → +‘D’
가 아니라,
‘ABC’ → ‘ABCD’
이렇게 저장한다는 뜻이야.
(출처: Pro git)
🧑🏫 언뜻 생각하면 이게 더 느릴 거 같지?
하지만 바뀐 부분만 기록하면, 매번 맨 처음 기록까지 거슬러 올라가면서 계산을 해서 현재 버전을 만들어야 해.
그에 비해 Git은 그냥 맨 마지막에 캡쳐한 버전을 보면 끝!
👩🦱 아하... 그럼 속도를 빠르게 하기 위해서 저장 공간을 희생하는 건가?
🧑🏫 아냐. 바뀌지 않은 파일은 중복해서 저장하지 않아서 저장도 효율적이야.
캡쳐를 할 때 만약 내용이 바뀌지 않은 파일이 있으면, 따로 저장하지 않고 ‘전 파일과 똑같음' 이런식으로 표기해.
👩🦱 아하, 그렇구나.
🧑🏫 Git은 폴더와 파일 캡쳐를 할 때 캡쳐하는 범위를 설정해줄 수 있어.
이걸 스테이지(Stage)라고 하는데. 내용이 바뀌지 않은 파일은 스테이지에 애초에 들어가지 않는 방식이지.
👩🦱 폴더 전체를 저장하는 게 아니라, 저장하는 범위가 있네요?
🧑🏫 맞아.
스테이지에 올릴 수 있는 파일은 ‘새로 만들었거나' ‘내용이 바뀐' 파일들이야.
이 중에서 버전으로 기록할 파일을 골라서 이 스테이지에 추가(Add)해주면 돼.
🧑🏫 바뀐 파일이 여러개라도 여러번 나눠서 캡쳐를 할 수도 있어.
물론 보통은 새로운 파일과 내용 바뀐 파일 전체를 스테이지에 올리긴 하지.
🧑🏫 캡쳐를 하면 자동으로 git 데이터베이스에 저장되고, 이걸 커밋(Commit)이라고 불러.
이 커밋이 git에서 하나의 ‘버전'을 가리키는 단위라고 할 수 있지.
👩🦱 그런 커밋이 하나씩 쌓인게 git에 저장되는 거군요.
🧑🏫 맞아. 각각의 커밋에는 작성한 사람과 커밋에 대한 설명 같은 것들이 붙어있고,
무엇보다 ‘직전 커밋’이 무엇인지 저장돼.
그러니까 커밋을 할 때마다 직전 커밋과 연결이 되고,
이렇게 커밋을 줄줄이 기차로 연결한 게 바로 버전 이력(history)가 되는 거지.
👩🦱 무슨 말인지 알겠어요. 그냥 PPT 파일 저장하는 것보다는 약간 더 복잡하네요.
근데 여기서 여러명이 협업하는 건 어떻게 해요?
각자 자기 컴퓨터에서 이렇게 버전을 저장하다보면, 서로 저장한 버전 이력이 달라질텐데?
뭘 기준으로 하는 거죠?
🧑🏫 아주 좋은 포인트야. Git에서는 커밋의 연결을 일렬로 쭉 하는게 아니라,
가지를 만들거나 합칠 수 있는데. 이게 여러명이랑 협업을 할 때 굉장히 중요한 개념이야.
다음 글에서 알아보도록 하자!
🔗 초등학생에게 Git을 설명해본다면? (Git 1편)
🔗 대학생에게 Git을 설명해본다면? (Git 1편)
🔗 개발자에게 Git을 설명해본다면? (Git 1편)
감사합니다! 잘봤어요!