02. GitHub: 타임머신 저장소 (Code Vault)
"신뢰받는 개발자는 말로 변명하지 않습니다. 기록(History)으로 증명할 뿐입니다."
1. Why: 코드는 회사의 자산입니다
여러분이 짠 코드는 단순한 텍스트 파일이 아닙니다. 미래의 가치를 담고 있는 '자산(Asset)'입니다. 컴퓨터가 고장 나거나 실수를 했다고 해서 자산이 증발해버린다면? 그건 사업을 할 준비가 안 된 것입니다.
GitHub(깃허브)는 우리의 자산을 보호하는 '디지털 금고'이자, 실수를 만회할 수 있는 '타임머신'입니다. 기록이 남기 때문에 우리는 겁 없이 도전하고, 언제든 되돌릴 수 있습니다.
2. Core Concepts: 두 개의 세계 (Local vs Remote)
가장 중요한 개념입니다. 내 컴퓨터(Local)에서 작업한다고 해서 친구가 바로 볼 수 있는 게 아닙니다. 우리는 두 개의 평행우주를 다루고 있습니다.
2-1. 단절된 두 세상 (Island & Cloud)
- 🌏 내 컴퓨터 (Local): 나만 볼 수 있는 섬. 인터넷이 끊겨도 작업 가능하지만, 컴퓨터를 잃어버리면 끝입니다.
- ☁️ 깃허브 (Remote): 전 세계가 공유하는 구름 위의 세상. 여기에 올려야 팀원들이 보고, 영구 백업이 됩니다.
2-2. 온라인 쇼핑 비유 (3단계 저장)
| 단계 | 개발 용어 | 비유 (쿠팡/쇼핑몰) | 위치 | 상태 |
|---|---|---|---|---|
| 1. 선택 | git add |
장바구니 담기 | 🏠 내 컴퓨터 | "이거 살 거야" (찜하기) |
| 2. 결제 | git commit |
주문 완료 (영수증) | 🏠 내 컴퓨터 | "샀다!" (환불 가능하지만 아직 배송 안 됨) |
| 3. 배송 | git push |
우리집 도착 | ☁️ 깃허브 | "공유 완료" (이제야 남들이 봄) |
2-3. The Filter: 출입 금지 구역 (.gitignore) 🚫
"쓰레기까지 클라우드에 올리지 마세요. 비밀번호는 더더욱 안 됩니다."
Git은 기본적으로 내 폴더의 '모든 파일'을 감시하고 추적하려 합니다. 하지만 굳이 깃허브에 올릴 필요가 없거나, 절대 올리면 안 되는 파일들이 있습니다.
이때 필요한 것이 바로 .gitignore (깃이그노어) 파일입니다. 이곳에 적힌 파일들은 Git이 투명인간 취급합니다.
(1) 왜 필요한가요? (3대 금지 품목)
| 분류 | 예시 파일 | 이유 |
|---|---|---|
| 🔐 보안 (Secrets) | apikey.txt, .env, password.json |
[절대 엄금] 해커들이 깃허브를 24시간 스캔합니다. 올리는 순간 서버 털립니다. |
| 🐘 뚱뚱한 파일 (Heavy) | node_modules/, venv/, 동영상 원본 |
우리가 올릴 것은 '소스 코드(레시피)'지, '완제품(요리)'이나 '도구'가 아닙니다. (남들은 npm install로 다시 설치하면 됨) |
| 🗑 시스템 잡동사니 (Junk) | .DS_Store (Mac), Thumbs.db (Win) |
운영체제가 만드는 임시 파일입니다. 동료들이 보면 "이게 뭐야?" 하고 싫어합니다. |
(2) 작성 예시 (Python/Web 개발자용)
프로젝트 최상위 폴더에 .gitignore 라는 이름의 파일(확장자 없음)을 만들고 이렇게 적습니다.
# 1. 가상환경 및 라이브러리 (너무 무거움)
venv/
node_modules/
__pycache__/
# 2. 운영체제 파일 (쓸모 없음)
.DS_Store
# 3. 환경 변수 및 비밀 키 (★가장 중요★)
.env
secret_key.txt
*.pem
🚨 골든 타임: 커밋하기 '전'에 만드세요!
이미 Git이 추적을 시작한 파일(git add를 한 번이라도 한 파일)은 나중에 .gitignore에 추가해도 무시되지 않습니다.
프로젝트를 시작할 때 가장 먼저 .gitignore 파일을 만드는 습관을 들이세요. (만약 늦었다면 git rm --cached 명령어로 추적을 끊어야 하는 번거로움이 생깁니다.)
💡 꿀팁: Toptal Gitignore
일일이 적기 귀찮으시죠? gitignore.io 사이트에 가서 내 언어(예: Python, MacOS, VisualStudioCode)를 입력하면, 완벽한 리스트를 자동으로 만들어줍니다. 복사해서 붙여넣기만 하세요!
3. Communication: 말하지 말고 '이슈'로 남기세요 📝
"카톡으로 '로그인 기능 고쳐줘'라고 하지 마세요. 흘러가는 말은 잊혀집니다. GitHub Issue(이슈)에 박제해야 비로소 '업무'가 됩니다."
코딩을 시작하기 전에 가장 먼저 해야 할 일은 '이슈(Issue)'를 등록하는 것입니다. 이슈는 프로젝트의 '퀘스트 보드(Quest Board)'입니다.
3-1. 이슈의 역할
- 할 일 관리 (To-Do): "로그인 페이지 만들기", "메인 배너 수정하기"
- 버그 제보 (Bug Report): "회원가입 버튼 누르면 멈춤 현상 발생"
- 토론의 장 (Discussion): 기획서나 디자인 시안을 올리고 댓글로 논의
3-2. 이슈 번호의 마법 (#Key)
모든 이슈에는 고유 번호(#1, #2...)가 붙습니다. 이 번호는 코드와 업무를 연결하는 열쇠입니다.
- Issue #5: "로그인 페이지 디자인 수정"
- Commit Message: "로그인 버튼 색상 변경 (Ref #5)"
- Pull Request: "로그인 디자인 완료했습니다. (Closes #5)"
👉 자동화: PR 내용에 Closes #5라고 적으면, 코드가 합쳐질 때(Merge) 이슈 5번이 자동으로 '완료(Closed)' 처리됩니다. (엄청 편합니다!)
🧠 AI Native: 이슈도 AI가 관리합니다
개발 환경(IDE)에 연동된 AI에게 이렇게 말해보세요.
- "현재 열려있는 GitHub Issue 목록 보여줘." (할 일 확인)
- "#11번 이슈 '메인 페이지 레이아웃' 해결하는 코드를 짜줘." (작업 수행)
- "커밋 메시지에 'Fix #11'을 포함해서 작성해줘." (기록 연결)
AI는 단순한 코딩 도구가 아니라, 여러분의 프로젝트 매니저가 될 수 있습니다.
🔗 Notion Integration: 기획서와 동기화
Notion의 기획 보드에 GitHub 이슈 링크를 붙여넣으면 미리보기가 생성됩니다. 더 나아가 Notion 데이터베이스와 GitHub Issues를 동기화하면, 개발 진행 상황이 실시간으로 Notion에 반영됩니다. (Notion 설정 -> 연결 -> GitHub 추가)
4. Advanced Concepts: 브랜치 계급도와 책임자
팀 프로젝트의 핵심은 "누가 합치기(Merge) 버튼을 누를 수 있는가?"입니다.
4-1. 브랜치 3단계 계급도 (Git Flow)
| 브랜치 이름 | 계급 (Role) | 담당 책임자 | 규칙 (Rule) |
|---|---|---|---|
main |
임원 (CEO) | CTO | ⛔️ 절대 접근 금지! 오직 완벽하게 검증된 코드만 존재합니다. |
develop |
팀장 (Manager) | 파트장 | 🚧 공사 현장 각 팀원의 기능( feature)이 모여서 조립되는 곳입니다. |
feature/... |
사원 (Member) | 나 (Me) | 🧪 개인 실험실 내가 마음대로 만들고 부수고 실험하는 곳입니다. |
4-2. 권한의 흐름 (Approval System)
sequenceDiagram
participant Issue as 📝 이슈 (#1)
participant Me as 👨💻 나 (Feature)
participant Lead as 👩🏫 팀장 (Develop)
Note over Issue: 로그인 기능 개발 필요
Me->>Me: 1. 이슈 확인 후 브랜치 생성
Me->>Me: 2. 코딩 & 테스트 완료
Me->>Lead: 3. PR (결재 요청, Closes #1)
Lead->>Lead: 4. 코드 리뷰 & Merge
Note over Issue: 이슈 #1 자동 완료(Closed)
5. Practical Guide: 이슈부터 배포까지 (Git Flow 정석)
이제부터 main 브랜치는 '성역'입니다. 건드리지 마세요.
모든 작업은 develop에서 시작해서 develop으로 끝납니다.
Step 0. 신원 확인 (최초 1회 필수)
터미널을 열고 내 명함을 등록합니다. (이걸 안 하면 "누구세요?"라며 커밋을 거부합니다.)
Step 0.5. 보안관 배치 (.gitignore)
프로젝트를 시작하기 전에, node_modules나 .env가 깃허브에 올라가지 않도록 미리 차단막을 설치합니다.
- 최상위 폴더에
.gitignore파일을 만듭니다. node_modules/,.DS_Store등을 입력하고 저장합니다.- 가장 먼저 커밋합니다:
git add .gitignore->git commit -m "Add gitignore"
Step 1. 퀘스트 등록 (Create Issue)
- GitHub 상단 메뉴의 Issues 탭 클릭 ->
New issue클릭. - 제목:
[Feat] 메인 페이지 레이아웃 잡기 - 내용: 구체적인 작업 내용 작성 (AI에게 초안 작성을 시켜도 좋습니다).
Submit new issue클릭. -> 번호 확인 (예: #11)
Step 2. 작업대 이동 (Checkout Develop)
- VS Code 왼쪽 하단 브랜치 이름 클릭.
develop(또는origin/develop)을 클릭하여 이동합니다.- 주의:
main에서 시작하면 안 됩니다!
- 주의:
Step 3. 내 브랜치 생성 (Create Feature)
- 현재 브랜치가
develop인지 확인합니다. develop을 클릭 ->+ Create new branch...선택.- 이름 규칙:
feature/issue-번호-설명- 예:
feature/11-main-layout
- 예:
Step 4. 작업 및 저장 (Coding & AI Commit)
- 열심히 코딩을 합니다.
- 왼쪽 소스 제어 탭의 ✨(AI Generate) 버튼 클릭하여 커밋 메시지 작성.
Commit클릭 ->Publish Branch클릭.
Step 5. 결재 요청 (PR to Develop)
- GitHub 웹사이트 접속 ->
Compare & pull request클릭. - ★중요★ 상단의 화살표 방향을 확인하세요!
- Base:
develop⬅️ Compare:feature/... - (절대
main으로 보내면 안 됩니다!)
- Base:
- 내용 작성(
Closes #11) 후Create pull request.
6. Mini Project: [실습] 깃허브 협업 사이클 (Git Flow 버전)
Mission:
develop브랜치에서 안전하게 합체하고, 완벽해지면main으로 배포한다!
6-1. 역할 분담 (R&R)
- 팀장 (Maintainer): 저장소(Repo) 생성, 팀원 초대, 최종 병합(Merge) 담당.
- 팀원 (Contributor):
git clone, 브랜치 생성, 자기 프로필 코드 작성 및 PR 발송.
6-2. [팀장] 본부 설치 (develop 생성)
- GitHub 레포지토리 생성 및 팀원 초대.
index.html생성 후 커밋 (Main 브랜치).- ★중요★
develop브랜치 만들기:- GitHub 레포지토리 상단 브랜치 버튼(
main) 클릭. - 입력창에
develop이라고 쓰고Create branch: develop from main클릭. - 👉 이제
develop브랜치가 생겼습니다!
- GitHub 레포지토리 상단 브랜치 버튼(
6-3. [팀원] 각자 도생 (develop에서 시작)
- 복제 (Clone):
git clone [주소]-> 폴더 이동. - 작업대 변경:
git checkout develop- (에러 나면:
git fetch한번 하고 다시 시도)
- (에러 나면:
- 브랜치 생성:
git checkout -b feature/내이름- (이제 내 브랜치는 develop에서 뻗어 나왔습니다)
- 코드 수정:
index.html내 라인에 자기소개 작성. - 전송:
git add .->git commit -m "내 이름 추가"->git push origin feature/내이름
6-4. [전체] 합체 의식 (Merge into Develop)
- PR 요청 (팀원):
- GitHub에서 PR 생성 시 Base:
develop인지 두 번 확인!
- GitHub에서 PR 생성 시 Base:
- 병합 (팀장):
feature➡️develop으로 병합(Merge)합니다.
- 동기화 (전체):
- 모든 병합이 끝나면, 모두 터미널에서
develop최신 버전을 당겨옵니다. git checkout developgit pull origin develop
- 모든 병합이 끝나면, 모두 터미널에서
6-5. [Bonus Stage] 긴급 상황: 충돌(Conflict) 해결하기 💥
"GitHub는 똑똑하지만 독심술사는 아닙니다. 두 사람이 '똑같은 줄(Line)'을 수정하면, 누구 걸 써야 할지 몰라서 멈춰버립니다."
1. 충돌 상황 만들기 (시나리오)
일부러 사고를 내봅시다.
- 팀원 A:
index.html의 맨 첫 번째 줄을<title>팀원 A가 지배한다</title>로 바꾸고 PR을 날립니다. - 팀장: 팀원 A의 PR을 Merge 합니다. (현재 develop의 첫 줄은 A의 것)
- 팀원 B: (아직 A의 합격을 모르는 상태)
index.html의 맨 첫 번째 줄을<title>팀원 B가 짱이다</title>로 바꾸고 PR을 날립니다. - 팀장: 팀원 B의 PR을 보러 갔더니...
- 🚨 "Can’t automatically merge" (자동 병합 불가) 메시지가 뜹니다.
2. 해결 방법: VS Code에서 교통정리
충돌 해결의 정석은 "코드를 짠 사람(팀원 B)이 최신 버전을 받아와서 고치는 것"입니다.
(팀원 B의 화면)
Step 1. 최신 정보 가져오기 (Update)
내 브랜치(feature/B)에서 develop의 변경사항(A가 고친 것)을 억지로 가져옵니다.
Step 2. 빨간 맛 확인 (VS Code)
터미널에 CONFLICT 경고가 뜨고, 파일이 빨갛게 변합니다. index.html을 열어보세요.
<<<<<<< HEAD (내 코드)
<title>팀원 B가 짱이다</title>
=======
<title>팀원 A가 지배한다</title>
>>>>>>> develop (들어온 코드)
Step 3. 선택의 시간 (Resolve) VS Code가 친절하게 버튼을 띄워줍니다. (글자 위를 보세요)
Accept Current Change: 내 거(B)를 살린다.Accept Incoming Change: 들어온 거(A)를 살린다.Accept Both Changes: 둘 다 남긴다.
우리의 결정: 싸우지 말고
Accept Both Changes를 누르거나, 직접 텍스트를 수정해서<title>우리 모두 짱이다</title>로 바꿉니다.
Step 4. 마무리 (Resubmit) 교통정리가 끝났으면 다시 포장해서 올립니다.
Step 5. 최종 병합 이제 팀장이 다시 GitHub 화면을 보면 "Able to merge" 초록색 버튼이 활성화되어 있습니다. Merge!
🎉 피날레: 배포 (Release)
팀장이 마지막으로 선언합니다. "개발 끝! 배포하자!"
- 팀장이 GitHub에서 PR을 하나 더 만듭니다.
- Base:
main⬅️ Compare:develop - Merge 버튼 클릭.
- 👉 이제야 비로소
main에 코드가 반영되었습니다.