Git Fork와 Merge: 협업 개발의 필수 개념
Fork란? Merge란?

들어가며
자동차 ECU 펌웨어 팀이 코드를 개발하는 상황을 생각해 볼게요
각각 파트가 나뉘어서 협업한다면?
상황: 팀 프로젝트
Main Repository (원본):
- 엔진 제어 코드
- 변속기 제어 코드
- 섀시 제어 코드
팀 구성:
- 엔지니어 A: 엔진 부분 개발
- 엔지니어 B: 변속기 부분 개발
- 엔지니어 C: 섀시 부분 개발
문제:
모두가 같은 Repository에서 작업하면?
→ 코드 충돌
→ 실수로 덮어쓰기
→ 원본 손상
해결:
Fork (각자 복사본 만들기) + Merge (작업 완료 후 합치기)
흐름:
원본 Repository
↓ (Fork)
엔지니어 A의 복사본, 엔지니어 B의 복사본, 엔지니어 C의 복사본
↓ (각자 개발)
완성된 코드
↓ (Merge/Pull Request)
원본에 통합
Fork와 Merge는 안전하고 효율적인 협업을 가능하게 하는 Git의 가장 중요한 기능입니다

3분 요약
Fork (포크):
- 원본 Repository를 자신의 계정에 복사
- "나만의 작업 공간" 생성
- 원본에 영향 없음
Branch (브랜치):
- Fork 내에서 버전 분리
- "이 기능만 개발하는 공간"
- 같은 Repository 안에서 여러 버전 관리
Commit (커밋):
- "여기까지가 완성된 작업" 표시
- 언제, 누가, 뭘 수정했는지 기록
Pull Request (PR):
- "내 작업을 원본에 반영해 줄래?" 요청
- 검토 과정 거침
- 승인 후 Merge
Merge (머지):
- Branch나 Fork의 코드를 Main에 통합
- 두 버전의 코드를 합침
- 완성!
흐름:
Fork → Clone → Branch → Commit → Push → Pull Request → Review → Merge
Fork (포크)
정의
Fork는 원본 Repository를 자신의 GitHub 계정에 복사하는 것이다.
원본 Repository (Origin):
Owner: AutosarTeam
Name: ECU-Firmware
URL: github.com/AutosarTeam/ECU-Firmware
Fork 후 (내 계정):
Owner: YourUsername
Name: ECU-Firmware
URL: github.com/YourUsername/ECU-Firmware
특징:
- 완전한 복사본 (이력까지)
- 원본과 분리됨
- 내 계정에 소유권 있음
Fork 사용 시나리오
상황 1: 오픈소스 기여
원본: AutosarTeam/ECU-Firmware (소유자만 수정 가능)
내가 할 일:
1. Fork → github.com/YourUsername/ECU-Firmware 생성
2. 내 Repository에서 버그 수정
3. Pull Request로 원본에 제안
4. 원본 소유자가 검토 후 Merge (또는 거절)
결과: 오픈소스 기여 완료!
상황 2: 팀 프로젝트
원본: TeamRepo/CarControl (팀의 공식 코드)
각 엔지니어:
- 엔지니어 A: Fork → 엔진 부분 개발
- 엔지니어 B: Fork → 변속기 부분 개발
- 엔지니어 C: Fork → 섀시 부분 개발
각자 독립적으로 개발:
- 서로 영향 없음
- 원본도 안전함
- 완료 후 Pull Request
결과: 효율적인 팀 협업!
Branch (브랜치)
정의
Branch는 같은 Repository 내에서 코드의 버전을 분리하는 것이다.
Repository 구조:
main (주요 버전, 항상 안정적)
├─ engine-feature (엔진 기능 개발)
├─ transmission-fix (변속기 버그 수정)
└─ chassis-refactor (섀시 리팩토링)
각 Branch는 독립적:
- 엔진 개발 중 변속기 수정 가능
- 서로 영향 없음
- 나중에 Main에 Merge
Fork vs Branch 비교
Fork:
- GitHub의 다른 계정에 복사
- Repository 수준의 분리
- 오픈소스 기여에 사용
Branch:
- 같은 Repository 내 버전 분리
- 파일 수준의 분리
- 팀 협업에 사용
함께 사용하는 패턴:
1. 원본 Fork
2. 내 Fork 안에서 Branch 생성
3. Branch에서 개발
4. Pull Request로 원본에 요청
Commit (커밋)
정의
Commit은 "지금까지의 작업을 완성된 상태로 저장"하는 것이다.
작업 과정:
파일 수정:
engine.c: 100줄 수정
temperature.c: 50줄 수정
calibration.c: 30줄 수정
Commit 1:
메시지: "엔진 RPM 계산 알고리즘 개선"
포함: engine.c 수정사항
Commit 2:
메시지: "온도 센서 오류 처리 추가"
포함: temperature.c 수정사항
Commit 3:
메시지: "캘리브레이션 값 업데이트"
포함: calibration.c 수정사항
효과:
- 작업 이력 기록
- 언제든 이전 버전으로 복구 가능
- 누가 뭘 수정했는지 추적 가능
Pull Request (PR)
정의
Pull Request는 "내 작업을 원본에 반영해 줄래?"라는 요청이다.
흐름:
1. Fork에서 작업 완료
내 Repository: engine-fix Branch 완성
2. Pull Request 생성
"엔진 RPM 계산 버그 수정"
설명: "RPM이 음수가 되는 버그 해결"
From: YourUsername/engine-fix
To: AutosarTeam/main
3. 원본 소유자가 검토
- 코드 리뷰
- 테스트 확인
- 버그 없는가?
4. 승인 또는 거절
승인: "좋은 코드! Merge할게"
거절: "이 부분을 수정해 줄래?"
→ 수정 후 다시 PR
5. Merge
"내 작업이 원본에 통합되었어!"
Merge (머지)
정의
Merge는 두 Branch 또는 Fork의 코드를 합치는 것이다.
Before Merge:
main Branch:
void Engine_Init(void) { ... }
void Engine_ReadRPM(void) { ... }
engine-fix Branch:
void Engine_Init(void) { ... }
void Engine_ReadRPM(void) { ... }
int Engine_CorrectionFactor = 1.05; // 수정 추가!
After Merge:
main Branch:
void Engine_Init(void) { ... }
void Engine_ReadRPM(void) { ... }
int Engine_CorrectionFactor = 1.05; // 새로 추가됨
완성!
Merge 충돌 (Conflict)
상황: 같은 코드를 두 명이 다르게 수정
engine-fix Branch (나의 수정):
int rpm = 1000; // 내가 이렇게 수정
main Branch (다른 사람의 수정):
int rpm = 0; // 그 사람이 이렇게 수정
Merge 시도 → Conflict 발생!
해결:
1. 충돌 부분 확인
2. "어느 코드가 맞는가?" 결정
3. 수동으로 선택
4. Merge 완료
예:
<<<<<<< engine-fix
int rpm = 1000;
=======
int rpm = 0;
>>>>>>> main
수정:
int rpm = 1000; // 내가 맞다고 판단
실무 시나리오
시나리오 1: 팀 프로젝트
프로젝트: 자동차 ECU 펌웨어
원본 Repository:
- Owner: TeamLead
- Branch: main (안정적인 버전)
팀 구성:
- 엔지니어 A (엔진 담당)
- 엔지니어 B (변속기 담당)
Step 1: Fork
────────────
각 엔지니어가 원본을 Fork
- YourUsername/ECU-Firmware
- TeamMember2/ECU-Firmware
Step 2: Clone
─────────────
git clone https://github.com/YourUsername/ECU-Firmware.git
Step 3: Branch 생성
──────────────────
git checkout -b engine-rpm-feature
(엔진 RPM 기능 개발용 Branch)
Step 4: 개발
───────────
engine.c 수정 → 테스트 → engine_improved.c 저장
Step 5: Commit
──────────────
git add engine.c
git commit -m "엔진 RPM 계산 알고리즘 20% 개선"
Step 6: Push
────────────
git push origin engine-rpm-feature
(내 Fork에 업로드)
Step 7: Pull Request
────────────────────
GitHub에서 PR 생성
- From: YourUsername/engine-rpm-feature
- To: TeamLead/main
- 설명: "엔진 RPM 정확도 개선"
Step 8: Review
──────────────
TeamLead가 코드 검토
- "좋은 개선이네! Merge할게"
Step 9: Merge
─────────────
원본에 통합됨!
결과:
- 엔진 부분만 안전하게 개발
- 변속기 개발과 동시 진행 가능
- 원본 코드 항상 안전
- 누가 뭘 수정했는지 추적 가능
일반적인 Workflow
1. Fork 원본 Repository
2. Clone 내 Fork을 로컬 PC에
3. Branch 생성 (기능별, 버그별)
4. 개발 및 Commit
5. Push 내 Fork에 업로드
6. Pull Request 생성
7. Review 원본 소유자가 검토
8. Merge 최종 통합
이 과정을 반복하면:
- 안전한 협업
- 명확한 이력 관리
- 버그 추적 가능
- 팀 생산성 증가
정리
Fork: Repository 복사 (GitHub 계정 수준)
→ 독립적인 작업 공간 확보
Branch: 버전 분리 (같은 Repository 내)
→ 여러 작업 동시 진행
Commit: 작업 저장 (이력 기록)
→ "여기까지가 완성"
Pull Request: 원본에 반영 요청
→ 코드 리뷰 거침
Merge: 최종 통합
→ 두 버전 합치기
협업의 기본:
이 5가지를 제대로 이해하면
효율적이고 안전한 팀 개발이 가능하다!'자동차 소프트웨어' 카테고리의 다른 글
| CSMS(Cybersecurity Management System) 완벽 정리: 자동차 사이버보안 관리 시스템 실무 가이드 (3) | 2026.01.14 |
|---|---|
| OTA(Over-The-Air) 업데이트 완벽 정리: 자동차 펌웨어 무선 업데이트 실무 가이드 (0) | 2026.01.09 |
| 🚗 Watchdog이란? 자동차 소프트웨어에서 왜 꼭 필요할까? (0) | 2025.12.13 |
| 📌 자동차기업 우대조건에 항상 등장하는 ISO 26262, 도대체 뭘까? (0) | 2025.12.12 |
| 📌 자동차도 해킹된다? 2025년 CSMS 의무화로 급등한 ‘차량 보안 개발자’ 채용 경쟁 (0) | 2025.12.12 |