본문 바로가기

개발

[바이브코딩을 위한 개발 용어] (1) Git, Commit, Push, Pull

반응형

이런 경험, 있으신가요?

기획서나 제안서를 여러 번 고치다 보면, 어느 순간 파일이 이렇게 쌓여 있죠.

 

  • 제안서_최종
  • 제안서_최종_v2
  • 제안서_진짜진짜최종

분명 전부 내가 만든 파일인데, 막상 열어 보려고 하면 "어? 진짜 최신이 뭐였더라?" 하고 멈칫하게 돼요.

'제안서_최종', '제안서_최종_v2', '제안서_진짜진짜최종' 등 파일이 쌓이면서 어떤게 최신 문서인지 알기 어려운 상황

 

또, 여러 명이서 일할 때 내가 한참 공들여 작업한 문서를 수정했는데, 다른 사람이 동시에 수정하는 바람에 내 수정사항이 통째로 날라가기도 합니다. 🫠

 

이건 비개발 직군만 겪는 일이 아니에요. 개발도 결국엔 '코드'가 적힌 문서 파일을 함께 작성해 나가는 일입니다. 그래서 개발할 때에도 똑같은 문제를 겪어요. 예를 들어 개발자 A가 새 기능을 만들어서 코드 파일을 B에게 넘기면 B는 그 파일을 받아서 버그를 고칩니다. 이렇게 주고받다 보면 결국 누가 뭘 바꿨는지 알 수 없게 되고, 서로의 수정사항이 의도치 않게 사라지기도 해요.

여러 명이 수정하다가 최신 코드가 사라진 상황

 

이렇게 "파일이 뒤엉키는 문제"를 깔끔하게 풀려고 만든 도구가 바로 Git이에요.

 

여기서 용어를 살짝만 이야기하고 넘어가 볼게요!

이렇게 수정사항이 서로 부딪히는 걸 개발자들은 충돌(conflict), 여러 개발자가 따로 진행한 작업을 하나로 합치는 걸 병합(merge)이라고 불러요. 말로만 들으면 와닿지 않으니, 개발자들이 회의나 메신저에서 실제로 어떻게 쓰는지 예를 들어보겠습니다.

🗣️ "이거 머지해 주세요"
'머지'가 병합(merge)이에요. 따로따로 작업한 코드를 하나로 합쳐 달라는 뜻이죠. 사실 합치는 건 대부분 컴퓨터가 알아서 척척 해줘요. 

 

🗣️ "앗, 컨플릭 났어요"
여기서 '컨플릭'은 충돌(conflict)을 의미해요. 개발자 A가 작성한 코드와 개발자 B가 작성한 코드를 병합(merge)하려고 하는데 동일한 줄을 서로 다르게 고쳐 수정사항이 충돌이 난거죠. 그래서 컴퓨터가 "둘 중에 뭘 살려야 할지 모르겠어요" 하며 merge를 하다말고 멈춰 선 상태를 말해요. 그러면 둘 중 누군가가 "어느 쪽이 맞는지" 직접 골라 줘야 이어서 merge가 진행돼요.

 

두 단어는 다음에 더 자세하게 풀어 볼 테니, 지금은 "아, 이런 말을 이런 뜻으로 쓰는구나" 정도면 충분해요. 그리고 이렇게 변경 이력을 차곡차곡 관리하는 일을 있어 보이는 말로 버전 관리(version control)라고 한답니다. 😎

 

 


 

파일 변경을 기록하는 도구, Git

Git을 한마디로 하면, 파일이 어떻게 바뀌었는지를 기록해 두는 도구예요.

내 컴퓨터에 있는 파일을 고친 다음, "이번엔 이런 걸 바꿨어요"라고 Git에 기록해 둘 수 있어요. 그 기록에는 이런 정보가 담겨요.

 

  • 뭐가 바뀌었는지 — 어떤 내용이 더해지고, 지워지고, 고쳐졌는지
  • 누가 바꿨는지 — 이 변경을 한 사람이 누구인지
  • 언제 바꿨는지 — 정확한 날짜와 시간
  • 왜 바꿨는지 — 그 사람이 직접 남긴 설명 메시지

Git은 내가 파일을 고친다고 자동으로 저장해 주지 않아요. 내가 "여기까지 했으니 기록해 두자" 하고 직접 표시하는 순간, 그 시점이 기록 하나로 남죠. 이 "기록 하나 남기기"를 커밋(commit)이라고 불러요. 커밋은 게임의 세이브 포인트랑 비슷해요! 내가 '저장'을 누른 순간 저장이 되잖아요? 커밋도 똑같아요! 그리고 커밋을 할 때 이 작업을 왜 했는지도 간략한 메시지를 함께 남깁니다. 

 

이렇게 남겨 두면 나중에 "누가, 언제, 무엇을, 왜 바꿨는지"를 그대로 다시 확인할 수 있어요. 예를 들면 "아, 철수가 2026년 6월 3일 12:30에 로그인 기능을 추가했네" 하고 콕 집어낼 수 있는 거죠.

 

게다가 실수로 코드를 지워 버렸더라도, 특정 세이브 포인트를 불러오듯 특정 커밋을 한 시점으로 쉽게 되돌릴 수 있어요. 단, 되돌아갈 수 있는 곳은 어디까지나 '내가 커밋해 둔 지점'까지예요. 그러니 평소에 틈틈이 커밋해 두는 게 중요하겠죠?

 

커밋을 보며 수정 내용을 이해하는 개발자들

 

 

상황 Git이 없으면 Git이 있으면
파일 변경 추적 파일_v1, 파일_v2, 파일_최종… 일일이 손으로 관리 내가 기록(커밋)한 시점마다 변경이 차곡차곡 쌓임
누가 뭘 했나? "어? 이 코드가 왜 여기 있지?" "철수가 2024-06-03 12:30에 추가함"
파일을 망쳤을 때 예전 파일을 직접 뒤져서 찾기 기록(커밋)을 보고 특정 상태로 되돌리기
팀원과 협업 손으로 일일이 합치다 충돌 지옥 체계적으로 합치고(merge), 부딪히는 부분(conflict)을 감지
어떤 코드가 버그의 원인? "누가 이 코드를 쓴 거죠?" "철수가 언제, 왜 이 코드를 넣었는지" 추적

 

 


그럼 GitHub은 뭐죠?

Git과 GitHub은 이름이 비슷하지만 같은 게 아니에요.

Git은 내 컴퓨터에서 변경을 기록하는 도구고, GitHub은 그 기록을 인터넷에 올려 팀과 함께 보는 사이트입니다.

(GitHub과 비슷한 서비스로 GitLab도 있어요. 둘은 역할이 거의 같으니, 이 글에서는 편하게 'GitHub'으로 부를게요.)

  • 내 컴퓨터 = 내 손으로 직접 파일을 고치는 곳이에요. 내 컴퓨터에 있는 파일은 나만 볼 수 있어요 🎤
  • GitHub = 구글드라이브처럼 인터넷에 올려 두고, 팀과 함께 보는 곳이에요.

개발자들은 위의 개념들을 조금 다른 용어로 아래와 같이 사용하기도 해요!

🗣️ "로컬에서 먼저 해 볼게요"
'로컬(local)'이 바로 내 컴퓨터라는 뜻이에요. 즉, 자신의 컴퓨터에서만 먼저 해본다는 뜻이죠.

 

🗣️ "리모트에 올렸어요"
'리모트(remote)', 우리말로는 원격 저장소라고도 불리는데, 이것이 바로 GitHub을 의미해요. 로컬(자신의 컴퓨터)에서 작업을 마친 뒤 다른 사람들도 볼 수 있게 깃헙에 올렸다는 뜻입니다.

 

정리해보자면 로컬(내 컴퓨터)에서 작업 후 Git으로 기록을 남기고 GitHub(인터넷)에 올려서 팀원들과 공유합니다.

 

1. 내 컴퓨터(로컬)에서 코드를 고쳐요.

2. Git에 "이렇게 바꿨어요" 하고 기록(commit)해요.

3. 변경된 코드와 기록(commit)을 GitHub에 올려요. 이 올리는 동작을 푸시(push)라고 해요.

4. 팀원들이 인터넷에서 그걸 봐요. "아, 영희가 이 부분을 이렇게 바꿨구나!"

5. 팀원들도 자기 컴퓨터로 받아 가서 이어서 작업해요. 코드를 받아가는 동작을 풀(pull)이라고 해요.

 

개발자가 코드를 수정하고 공유하는 과정

 

회사에서는 하나의 프로젝트만 진행하지 않고 여러 프로젝트가 동시에 진행되죠! 이 프로젝트를 모두 하나의 폴더에 넣어두면 어떤 프로젝트를 위한 코드인지 헷갈리기 쉬워요. 그래서 GitHub에 올릴 땐 프로젝트마다 폴더를 따로 나눠 두는데, 이 프로젝트 단위 폴더 하나를 레포(Repository, 저장소)라고 불러요.

 

레포지토리를 분리하는 이유

 

 

이때 GitHub에 올라가는 건 '변경 기록'만이 아니에요. 프로젝트의 코드 전체가 '누가·언제·뭘·왜 바꿨는지' 이력과 함께 통째로 올라가요. 그래서 지금의 최신 코드도, 과거의 모든 버전도 인터넷에 안전하게 보관되죠. 내 컴퓨터가 고장 나더라도, 심지어 불이 나더라도 github에만 올려두면 안전하게 작업 내용을 보관할 수 있기 때문에 이런 짤이 돌아다니기도 했어요 😂

 

불이 났을 때 작업 내용을 커밋하고 푸시한 다음 건물을 나가세요!

 


오늘 나온 용어, 한눈에 복습 📒

지금까지 여러 단어가 스쳐 지나갔죠. 동료와 대화할 때 바로 떠오르도록, 오늘 나온 말들을 한번 되짚어보아요!

  • Git — 내 컴퓨터에서 "뭐가·누가·언제·왜 바뀌었는지"를 기록하는 도구.
  • GitHub (= 원격 저장소) — 그 기록과 코드 전체를 인터넷에 올려 팀과 함께 보는 공간.
  • 로컬 / 리모트 — '로컬'은 내 컴퓨터, '리모트(원격)'는 인터넷에 있는 GitHub
  • 레포(Repository) — GitHub 안에서 프로젝트별로 나눠 둔 폴더.
  • 커밋(Commit) — "이 순간을 기록!" 하고 코드 작성자가 직접 남기는 변경 기록.
  • 푸시(Push) / 풀(Pull) — '푸시'는 커밋을 GitHub에 업로드하기. '풀'은 GitHub에 올라온 변경을 내 컴퓨터로 다운받기.
  • 충돌(Conflict) / 병합(Merge) — '병합'은 서로 다른 사람이 작업한 걸 코드를 하나로 합치기. '충돌'은 같은 곳을 서로 다르게 고쳐 합치다 멈춘 상태.

 


 

🚀 다음에는...

지금까지 Git이 왜 필요한지, 뭘 하는 도구인지 큰 그림을 잡았어요.

 

다음 편에서는 브랜치(Branch)에 대해 알아볼 거예요. 혼자서든 여럿이서든, 여러 작업을 서로 방해하지 않고 동시에 진행하는 방법이랍니다. 오늘 살짝 알아본 충돌(conflict)도 조금 더 자세하게 이야기해 보겠습니다!

 

오늘 나온 개념 중에 "이건 좀 아리송한데?" 싶은 게 있다면, 편하게 댓글로 남겨 주세요. 어려운 용어 같이 쉽게 풀어 봐요. 🙌

반응형