git

TIL — Git 협업 기초

story98138 2026. 3. 19. 19:09

 

 

TIL — Git 협업 기초

1. 오늘 한 것

스파르타 UE5 부트캠프의 Git 협업 기초 강의를 수강하며 GitHub 레포지토리를 직접 세팅하고, 팀원 상황을 로컬에서 시뮬레이션하여 fetch, pull, branch, merge, conflict 해결까지 전 과정을 실습하였습니다.

실습 레포지토리: https://github.com/taitop23-blip/TeamProject

 

GitHub - taitop23-blip/TeamProject

Contribute to taitop23-blip/TeamProject development by creating an account on GitHub.

github.com


2. 배운 내용

2.1 실습 환경 세팅

GitHub에 TeamProject 레포를 Public으로 생성하고, git clone으로 로컬 폴더를 만들었습니다. 이후 .gitignore.gitattributes 파일을 추가하고, UE5 프로젝트의 핵심 파일들만 로컬 레포 폴더로 이관하였습니다.

 

이관 대상 폴더/파일

  • Config 폴더
  • Content 폴더
  • Source 폴더
  • .uproject 파일

나머지(Binaries, Intermediate 등)는 빌드 시 자동 생성되므로 .gitignore에 등록되어 있습니다.

⚠️ .gitignore 위치 주의 반드시 .uproject 파일과 같은 폴더에 위치해야 합니다. 다른 위치에 두면 제대로 동작하지 않습니다.
⚠️ 커밋 전 주의사항 1 반드시 언리얼 에디터를 종료한 뒤 커밋 및 푸시해야 합니다. 에디터 종료 시 파일이 수정될 수 있기 때문입니다.
⚠️ 커밋 전 주의사항 2 변경사항 목록을 꼼꼼히 확인하고, 본인이 작업하지 않은 파일은 스테이지에서 제외해야 합니다. 아리송한 파일은 팀원과 반드시 확인 후 처리해야 합니다.
 

.gitattributes.uasset, .umap 같은 바이너리 파일을 Git LFS로 추적하여 용량을 절약하기 위한 파일입니다. LFS 사용량은 GitHub Settings → Billing → Git LFS Data에서 확인할 수 있습니다. (기본 제공 1GB)


2.2 fetch vs pull

둘 다 리모트 레포지토리의 변경사항과 관련된 명령이지만 동작이 다릅니다.

  • Fetch — 리모트를 '조회'만 합니다. 로컬에는 반영되지 않으며, origin/mainmain보다 앞서 있는 것을 확인할 수 있습니다.
  • Pull — 리모트의 변경사항을 실제로 내려받아 로컬 브랜치에 반영합니다.
💡 권장 순서 항상 Fetch로 먼저 확인한 뒤 Pull로 반영하는 습관을 들이면, 갑작스러운 변경사항 덮어쓰기를 방지할 수 있습니다.

2.3 branch & checkout

브랜치는 현재 프로젝트 기준으로 독립적인 작업 공간을 갖는 것입니다. 마블의 평행세계처럼 이해하면 쉽습니다. main 브랜치는 항상 깨끗한 세이브 포인트로 유지해야 하며, 직접 작업하지 않는 것을 권장합니다.

  • 브랜치 이름 컨벤션: Feature/기능명 (예: Feature/Inventory, Feature/Rifle)
  • Checkout: 다른 브랜치로 이동하는 것. 이전 브랜치에 미커밋 변경사항이 없어야 합니다.
💡 팁 새 브랜치 생성 시 Checkout New Branch를 체크하면 생성과 동시에 해당 브랜치로 이동됩니다.
⚠️ 원칙 main 브랜치에 직접 작업하지 마세요. 반드시 Feature 브랜치에서 작업 후 merge하는 방식을 유지해야 합니다.

2.4 merge

Feature 브랜치에서 작업이 완료되면 main 브랜치에 합치는 과정입니다. 방향이 매우 중요합니다. main으로 체크아웃한 상태에서 Feature 브랜치를 우클릭하여 머지를 진행합니다.

main 브랜치로 체크아웃
→ Feature 브랜치 우클릭
→ "Merge Feature into current branch" 클릭

 

머지 전 체크리스트

  • 빌드 및 게임플레이 정상 확인
  • 언리얼 에디터 종료 후 소스트리 F5 새로고침
  • 변경사항 꼼꼼히 읽기
  • 머지 직전 반드시 Fetch / Pull 먼저 진행
⚠️ 팀원이 먼저 push한 경우 (선빵 당했을 때) main 로컬 브랜치를 삭제 → origin/main 더블클릭으로 재생성 → Fetch/Pull → 다시 merge를 시도합니다.

2.5 conflict 해결

같은 파일을 두 사람이 동시에 수정했을 때 발생합니다. 소스트리에서 주황색 삼각형으로 표시된 파일이 충돌 파일입니다.

  • 충돌 파일을 열면 <<<<<<< HEAD, =======, >>>>>>> 브랜치명으로 두 버전이 구분됩니다.
  • 팀원과 상의 후 합의한 내용으로 직접 수정합니다.
  • 수정 후 파일 우클릭 → Resolve Conflicts → Mark Resolved
  • 이후 커밋으로 마무리합니다.
// 충돌 마커 예시
<<<<<<< HEAD
UE_LOG(LogTemp, Warning, TEXT("AMyActor is ticking~~~"));
=======
//UE_LOG(LogTemp, Warning, TEXT("AMyActor is ticking!"));
>>>>>>> Refac
💡 핵심 충돌은 로컬에서만 발생하는 일이므로, 내 파일만 영향을 받습니다. 팀원과 대화로 차분히 해결하면 됩니다.

3. 핵심 개념 요약

명령 / 기능 설명 소스트리 위치
Fetch 리모트 변경사항을 조회만 함 (로컬 미반영) 상단 Fetch 버튼
Pull 리모트 변경사항을 로컬에 실제 반영 상단 Pull 버튼
Branch 독립적인 작업 공간(평행세계) 생성 Branch 버튼
Checkout 다른 브랜치로 이동 브랜치 더블클릭
Merge 브랜치 작업 내용을 현재 브랜치에 합침 브랜치 우클릭 → Merge
Conflict 같은 파일 동시 수정 시 발생, 수동 합의 필요 주황색 삼각형 파일

4. 느낀 점 & 회고

Git을 혼자 쓸 때는 add → commit → push 반복이었는데, 팀 협업 시뮬레이션을 직접 해보니 fetch와 merge의 타이밍이 생각보다 훨씬 중요하다는 것을 깨달았습니다.

 

특히 머지 전에는 반드시 Fetch/Pull을 먼저 해야 한다는 습관이 핵심인 것 같습니다. '선빵 당했을 때' 브랜치를 지우고 다시 만드는 방법도 처음엔 황당하게 느껴졌지만, 직접 해보니 오히려 명쾌한 해결법이었습니다.

 

충돌(conflict)도 처음에는 무섭게 보였는데, 마커(<<<<<<<, =======, >>>>>>>)의 의미를 이해하고 나면 그냥 '코드 합의'에 불과하다는 것을 알게 되었습니다.


5. 다음에 할 것

  • 팀원과 함께 실제 충돌 상황 재현 및 해결 연습
  • Git LFS 용량 관리 확인 (GitHub Settings → Billing → Git LFS Data)
  • Pull Request 워크플로우 학습 (리뷰 기반 merge)