초등학생에게 Git branch와 merge를 설명해본다면? (Git 2편)

eddy_song·2022년 3월 6일
17

1 Concepts in 3 Levels

목록 보기
4/4
post-thumbnail

Git이라는 버전 관리 시스템은 개발자라면 반드시 배워야 합니다.
하지만 한번에 다 소화하기엔 복잡하고 어렵죠.

하지만 초등학생도 이해할 수 있게 단순화시킨 설명을 들어보고,
대학생, 개발자로 차츰 더 수준을 높여간다면 훨씬 더 이해가 쉽지 않을까요?


설명할 개념

  • 가지치기 (Branch)
  • 가지를 합치기 (Merge)

👦 초등학생에게 설명하기

시도가 필요해 - 가지치기 (Branch)

🧑‍🏫 지난번 설명으로 git 무엇인지는 좀 감을 잡았겠지?

👦 음.. 근데 까먹었어요. git이 뭐였죠?

🧑‍🏫 너가 친구들하고 같이 하는 미술 숙제를 받았을 때, 중간중간 그림을 사진찍어서 기록으로 남겨두는 거라고 했잖아.

👦 아, 맞당. 근데 그 사진 앨범을 다 같이 나눠 가진 다음 서로서로 기록을 볼 수 있는 거라고 했죠?

🧑‍🏫 그래. 아예 바보는 아니.. 흠흠. 오늘은 git에서 아주 중요한 '가지치기'라는 걸 배울 거야.

👦 가지치기요?

🧑‍🏫 그래. 너가 민수랑 지수랑 같이 그림을 그리기로 했잖아?

근데 지금 그림에 강아지가 그려져있거든. 근데 얘가 너가 보기에 너무 밋밋하게 생긴 거야.

약간 이런 느낌?


(출처: 밍밍이들)

👦 아 이건 진짜 좀 더 그려줘야겠네;;

🧑‍🏫 근데 지금 다같이 그리고 있는 그림이잖아. 민수한테 물어보니까 자기는 이 강아지가 괜찮다는 거야. 그럼 넌 어떻게 할래?

👦 음... 모르겠어요. 꼭 허락받아야 돼요?

🧑‍🏫 다같이 그리는 그림이니까 허락을 받아야지. 그래도 방법이 있어. 일단 너가 혼자서 만들어보는 거야.

지수랑 민수가 그리고 있는 그림을 건드리지 않아야 하니까. 먼저 지금 있는 그림을 복사하는 거야. 그리고 나서 너가 그리고 싶은 강아지를 그려보는 거지.

복사한 강아지한테 모자를 그려줬다고 하자.

그럼 그 복사한 순간부터 지수랑 민수는 원래 그림에다 계속 그리고 있고,
너는 새로운 그림을 그리고 있으니까, 서로 버전이 갈라지겠지?

👦 어? 그럼 앨범에 사진이 순서대로 생기는 게 아니라, 줄이 여러 개가 생기는 거네요.

🧑‍🏫 그렇지. 기차처럼 쭉 연결된 모양이었지만,
가지치기를 하면 이렇게 여러 개의 줄이 같이 가는 모양으로 바뀌는 거야.

이걸 주로 나무 모양하고 비슷하다고 해서 나무에 비유를 많이 하는데,
보통 다같이 작업하고 있는 버전을 '줄기(trunk)'라고 불러.

너가 뭔가 새로운 시도를 해보고 싶을 때,
다른 사람이 그리고 있는 그림을 건드리지 않고 해볼 수 있는 버전을 '가지(Branch)'라고 해.

👦 그럼 민수나 지수도 가지를 만들 수 있는 거예요?

🧑‍🏫 물론이지. 누구나 언제든 가지를 만들 수 있어.

실제로 git을 사용해서 프로그램을 만들 때는, 다들 각자 가지를 만들어서 작업을 해. 다른 사람하고 동시에 프로그래밍을 하면 오류가 날 수도 있으니까.

그래서 가지가 엄청 많아지면 구별하기가 힘드니까,
가지에는 이게 뭘 의미하는지 이름을 달아줘야 해.

줄기에는 주로 '메인'이라고 이름을 붙여.

각자 만든 가지에는 자기가 바꾸고 싶은 내용을 이름으로 붙여주면 돼.

👦 오 그러면 제 가지는 '모자 강아지'로 할래요.

🧑‍🏫 이렇게 각자 가지를 만들어서 작업을 하는 거야!
그러면 각자 자기 그림에서 새로운 걸 자유롭게 막 그려봐도 되는 거지.
그래도 다른 애들이 그리고 있는 그림에는 영향을 주지 않아.

👦 다른 애들이 제가 그리고 있는 것도 볼 수 있어요?

🧑‍🏫 그게 바로 git을 활용한 협업의 장점이야
모두가 앨범을 나눠 갖고 있다고 했지?
가지의 이름만 알면 현재 사진을 꺼내서 누가 어떻게 그리고 있는지 볼 수 있어.

🧑‍🏫 여기서 각자 그림을 계속 그려가면서, 사진을 기록하게 되면 이런 식의 모양이 될 거야.

시도가 마음에 들어 - 합치기(Merge)

👦 와. 앨범이 엄청 복잡해지네요.

근데 계속 이렇게 가지를 만들기만 하면 숙제를 제출할 때는 어떻게 해요?
다시 합쳐서 하나의 그림으로 만들어야 하잖아요.

🧑‍🏫 맞아. 이 가지를 합치는 것도 필요해.
언제 가지를 합쳐야 할까?

👦 음... 그림이 마음에 들었을 때?

🧑‍🏫 더 정확하게는, 같이 작업하는 사람들이 메인 줄기에 넣어도 되겠다고 동의를 했을 때지!

왜냐하면 이건 다 같이 만드는 그림이잖아?

너가 모자 강아지가 마음에 들었어도,
다른 사람들이 동의를 하지 않으면 합치면 안 되지.

👦 근데 다른 애들꺼보다는 제 강아지가 나은데요?

🧑‍🏫 너가 모자 강아지를 민수, 지수한테 보여줬다고 하자.
민수랑 지수가 모자 강아지를 보니까 마음에 들었어.

실제로 보니까 마음에 든다는거야.

👦 오, 그러면 이제 합치면 되겠네요!

🧑‍🏫 맞아. 근데 이 합칠 때는 상황을 잘 고려해야 돼.

총 3가지 상황이 있는데, 그 때마다 조금씩 해야하는 일이 다르거든.

1. 그냥 합칠 수 있는 상황: 빨리 감기

🧑‍🏫 자, 지금 우리 앨범에 기록된 사진들이 이런 상태라고 해보자.

🧑‍🏫 메인 줄기를 봐. 어떻게 되어있지?

👦 제가 복사했을 때랑 그대로인데요?

🧑‍🏫 그렇지. 변경 사항이 새로 생기지 않았잖아?

이럴 때는 모자 강아지와 메인 줄기를 합치면 그냥 모자 강아지가 되는 거야.

👦 쉽네요.

🧑‍🏫 제일 쉬운 상황이야. 이럴 때는 사실 사진을 합쳐서 새로 만들 필요도 없어.
그냥 철수 너의 가지를 메인 줄기로 정해주면 되는 거야.

메인 줄기라는 건 사실 우리가 이름표를 붙여준 것 뿐이라서 언제든 옮길 수가 있어.

그러니 메인 줄기를 가장 최신 버전인 모자 강아지 줄기로 옮겨주는 거지!

그러면 자동으로 '메인 줄기'에 '모자 강아지 가지'가 합쳐진 게 되겠지?

👦 오 한 버전에 이름표가 2개나 붙었어요! 이래도 되는 거에요?

🧑‍🏫 그럼. 전혀 문제 없지.

이렇게 줄기의 이름표만 옮겨서 합치는 방법을,
'빨리감기 머지'(fast-forward merge)라고 해.

하지만 다른 경우를 볼까?

2. 합칠 줄기에 새로운 버전이 있는 상황: 충돌이 없을 때

👦 엇, 메인 줄기에 이미 새로운 사진이 있어요!

🧑‍🏫 이미 민수가 먼저 선수를 쳤네. 민수가 고양이를 추가한 버전을 메인 줄기에 합쳐놓았어.

👦 우쒸, 민수 이 자식...!

🧑‍🏫 이럴 때는 먼저 합치려고 하는 가지의 변화와 줄기의 변화를 비교해봐야 해.

🧑‍🏫 보니까 메인 줄기에서 바뀐 부분은 민수가 추가한 고양이네. 그리고 철수 너가 바꾼 부분은 강아지에 모자를 씌운 거고. 맞지?

👦 맞아요.

🧑‍🏫 그럼 이 경우에는 서로 바꾼 부분이 겹치지 않아. 그냥 합치면 되겠어.

👦 오, 그러면 아까처럼 줄기를 제 가지 쪽으로 옮기는 거예요?

🧑‍🏫 아니야. 그러면 민수가 추가한 고양이가 버전 기록에 없을 거니까.
이럴 때는 둘의 그림을 합친 다음 새로운 사진을 하나 더 찍어야 해.

👦 모자랑 고양이가 둘다 들어간 새로운 사진이 생겼네요!

🧑‍🏫 응. 아까와는 다르게 양쪽에 모두 변화가 있기 때문에,
이렇게 둘의 변화를 모두 반영한 새로운 사진을 만들어서 합치는 거야.

이 사진은 다른 사진과 다르게 '직전 사진'을 2개 가지게 되지!
모양을 그려보면 이렇게 돼.

👦 벌어졌던 가지가 다시 합쳐졌어요!

🧑‍🏫 이렇게 새로 생긴 사진은 특별히 '머지 커밋(Merge Commit)'이라고 불러.

이렇게 머지(Merge)를 하면 '모자 강아지 브랜치'는 자동으로 삭제가 돼.
역할을 다하고, 줄기에 합쳐졌으니까!

대신 이전에 너가 모자를 추가했던 사진들은 여전히 기록에 남아있는 거고.

3. 새로운 버전이 있고 같은 부분을 수정한 상황: 충돌이 있을 때

🧑‍🏫 마지막 세번째 경우를 볼까?

👦 이번에는 줄기에 지수가 그린 강아지가 합쳐져 있네요?

🧑‍🏫 맞아. 지수는 회색 강아지를 그려놨네.
그럼 지수와 철수 너가 그린 강아지의 변화를 비교해볼까?

🧑‍🏫 이 경우에는 문제가 있어. 너가 바꾼 부분하고 지수가 바꾼 부분이 겹쳐.

👦 잉? 왜요?

🧑‍🏫 넌 모자를 그리고, 강아지 색깔을 진한 갈색으로 바꿨잖아?
근데 지수는 강아지 색깔을 회색으로 바꿨어.

그럼 이 상황에서 git은 강아지 색깔을 진한 갈색으로 해야할지 회색으로 해야할지 알 수가 없게 돼.

이렇게 서로 다른 가지가 같은 부분을 수정했을 때, 어떤 버전을 적용할지 모르는 상황을 '충돌(Conflict)'이라고 해.

너의 가지하고 줄기하고 충돌이 난 거야.

👦 헉?! 충돌이요? 그러면 어떻게 해요?

🧑‍🏫 너무 놀라지 마. 충돌은 침착하게 살펴보면 해결할 수 있어.

충돌 상황이 되면 Git은 변화가 충돌하는 부분을 표시해주거든.

그러면 너가 저 중에서 어느 쪽을 적용할지 골라주기만 하면 돼.

👦 그러면 저는 색깔은 지수 색깔로 해줄래요. 난 대인배니까.

🧑‍🏫 좋아. 색깔은 회색을 선택하자. 그리고 모자는 겹치지 않으니까 그냥 적용해주면 되겠지.

여기서부턴 아까 2번과 똑같아.
새로운 합친 사진이 생기고, 가지와 줄기가 합쳐지게 되는 거지.

👦 나머지는 2번과 똑같고, 충돌 해결만 중간에 해주면 되는 거네요.

🧑‍🏫 그래. 역시 이번에도 새로운 시도를 했던 기록은 앨범에 모두 남아있어.
나중에 언제든지 확인해볼 수가 있지.

git에서는 이렇게 가지치기와 합치기를 할 수 있기 때문에,
하나의 폴더에서 작업을 하면서도 안전하게 새로운 시도를 해볼 수 있는 거지!

나중에 시도가 마음에 들면 합치면 되고, 아니면 그냥 내버려둬도 되는 거야.

여러 명이 숙제를 하는데 아주 편리하겠지??

요약 정리

  • 다같이 작업을 하다가, 새로운 시도를 안전하게 시도해보고 싶으면 가지(branch)를 만든다.
  • 각자 가지에 작업을 하면서 사진을 찍어 버전을 기록한다.
  • 바꾼 게 마음에 들어서 줄기에 합치고 싶다면, 합치기를 시도한다.
  • 만약 줄기에 변화가 없다면, 줄기 이름표를 현재 가지로 옮긴다. 현재 가지가 줄기가 된다.
  • 만약 줄기에 변화가 있지만 충돌은 없다면, 새로운 사진을 하나 추가하고 줄기와 가지를 모두 연결한다.
  • 만약 줄기에 변화가 있지만 충돌이 있다면, 어떤 버전을 적용할지 선택하고 2번과 똑같이 마무리한다.

관련 링크

🔗 초등학생에게 Git을 설명해본다면? (Git 1편)
🔗 대학생에게 Git을 설명해본다면? (Git 1편)
🔗 개발자에게 Git을 설명해본다면? (Git 1편)
🔗 초등학생에게 Git branch와 merge를 설명해본다면? (Git 2편)

profile
개발 지식을 쉽고 재미있게 설명해보자.

4개의 댓글

comment-user-thumbnail
2022년 3월 9일

깃 설명 포스트 정말 잘 봤어요. 다음 편도 꼭 올려주세요!

1개의 답글
comment-user-thumbnail
2022년 3월 22일

이야, 좋은 글 정말 감사합니다!

1개의 답글