본문 바로가기
자동차 소프트웨어

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

by 버그없는토마토 2026. 1. 5.

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가지를 제대로 이해하면
효율적이고 안전한 팀 개발이 가능하다!