팀스파르타 내일배움캠프

📚 TIL - 2025년 4월 10일 (목) – Git & Unity 실전 병합, 브랜치 실습 정리

creator2041 2025. 4. 10. 15:14

 

🔧 Git 파트 – 진짜 실전으로 부딪히며 배운 깃

🧩 상황 요약

  • GitHub에서 Unity 프로젝트 클론 후 main 브랜치로 올리기 실습 진행.
  • quni라는 새 브랜치를 main에 병합 시도하다 충돌 발생.
  • 병합 실패 → 충돌 수동 해결 → 병합되지 않은 기록을 담는 orphan 브랜치까지 생성해봄.

1. 📦 git push 오류 (refspec 문제)

  • 오류 메시지:
error: src refspec main does not match any
error: failed to push some refs to 'origin'
  • 원인 분석:
    • 아직 main 브랜치가 존재하지 않음.
    • 커밋도 없어서 Git이 트래킹할 내용이 없음.
  • 해결 방법 (브랜치 생성 + 초기 커밋 후 푸시):
git branch -M main         # main 브랜치 이름 설정
git add .                  # 현재 모든 변경사항 스테이징
git commit -m "Initial commit"  # 커밋 메시지와 함께 첫 커밋 생성
git push -u origin main    # 원격 origin의 main 브랜치로 푸시

🔎 참고: -M 옵션은 브랜치를 강제로 이름 변경하며, -u는 추후 git push 시 브랜치 이름 생략 가능하게 함

2. ⚔ 병합 시도 중 충돌 (non-fast-forward, unrelated histories)

  • 상황: 서로 다른 이력이 있는 main과 quni를 병합하려고 할 때 발생
  • 오류 메시지:
Updates were rejected because the tip of your current branch is behind...
  • 해결 방법 (강제로 병합 허용):
git pull origin main --allow-unrelated-histories
  • --allow-unrelated-histories는 서로 관련 없는 커밋 기록 간 병합을 허용함.

💡 Unity 프로젝트는 외부에서 생성된 프로젝트를 GitHub에 업로드하며 이 문제가 자주 발생함.

3. 🔥 충돌 발생 → Visual Studio 병합 에디터 사용

  • 병합 도중 충돌이 발생한 파일을 VS에서 열면 병합 툴에서 충돌 구간 표시됨.
  • 구간 예시:
<<<<<<< HEAD
내가 작업한 내용
=======
상대 브랜치 내용
>>>>>>> quni
  • .cs, .meta, manifest.json 등 각각 다른 방식으로 충돌 처리해야 함

파일 종류 해결 방식 비고

.cs 직접 코드 병합 (로직 선택) <<<<<<< 구간 제거, 의도한 기능 확인
.meta quni 기준으로 선택 GUID 기준 연결 보존 필요
manifest.json quni 버전 유지 InputSystem 등 패키지 버전 일치 필요
  • 병합 완료 후 반드시 다시 커밋:
git add .
git commit -m "Merge quni into main with conflicts resolved"
git push origin main

4. 🌱 병합되지 않은 브랜치 만들기 (orphan)

  • orphan 브랜치는 기존 Git 기록 없이 완전히 새롭게 시작하는 브랜치임.
  • 실험용, 테스트용 브랜치 만들 때 사용.
git checkout --orphan experimental
  • 현재 커밋 히스토리는 사라지고, 작업 디렉토리는 유지됨
  • 최소 한 개의 커밋을 생성해야 push 가능
git add .
git commit -m "Initial commit from experimental branch"
git push -u origin experimental

📘 실전 명령어 정리 및 설명

# Git 초기 설정 (처음 시작할 때)
git init                                       # Git 로컬 저장소 초기화
git remote add origin <URL>                   # 원격 저장소 등록
git branch -M main                            # 브랜치 이름을 main으로 설정

# 커밋 및 푸시
git add .                                     # 전체 변경 사항 스테이징
git commit -m "설명"                          # 커밋 메시지 작성
git push -u origin main                       # 원격 저장소로 푸시

# 병합 전 pull (충돌 방지)
git pull origin main --allow-unrelated-histories

# 병합 시도
git merge quni --allow-unrelated-histories

# orphan 브랜치
git checkout --orphan 브랜치이름              # 기존 기록 없는 새 브랜치 생성
git add .
git commit -m "내용"
git push -u origin 브랜치이름

📌 : 병합 전에는 항상 git pull로 최신 원격 상태를 받고, 푸시 전에는 충돌이 없는지 확인해야 함.

항목 배운 점

GitHub 오류 refspec, non-fast-forward, unrelated histories 직접 해결
충돌 처리 VS 병합 도구로 .cs, .meta, .json 충돌 정복
orphan 브랜치 병합 안 된 독립 브랜치 생성 + GitHub 푸시 조건 이해

🎮 Unity 파트 – Git과의 연동

⚙ .meta 파일 충돌

  • 문제: 같은 리소스를 다르게 만들면 GUID 충돌
  • 해결 기준: quni에서 만든 리소스의 .meta 유지
    → Unity는 GUID 기반으로 리소스를 연결하기 때문에, 변경되면 연결이 끊어질 수 있음

🧾 manifest.json 패키지 충돌

  • 예시:
    "com.unity.inputsystem": "1.7.0"
    "com.unity.inputsystem": "1.7.0-pre.2"
  • 해결 기준: quni에서 사용하는 리소스를 기반으로 선택
    → 버전 불일치 시 Unity 에디터에서 패키지 충돌 오류 발생 가능

🧪 .cs 파일 충돌

  • 충돌 구간: <<<<<<<, =======, >>>>>>>
  • 해결 방법: 원하는 로직을 골라서 충돌 구간 삭제 및 직접 병합

🧵 Canvas Render Mode (UI 렌더링 모드)

Unity에서 UI를 표시하기 위한 Canvas는 렌더링 방식(Render Mode) 에 따라 UI의 동작과 위치, 계층구조 등에 큰 영향을 미칩니다.

1. Screen Space - Overlay

  • UI가 카메라와 무관하게 항상 화면 상단에 렌더링됨
  • 장점:
    • 성능이 가장 좋음 (카메라 계산 없음)
    • 씬에 배치된 오브젝트에 가려지지 않음
  • 용도: HUD, 고정형 UI 등

2. Screen Space - Camera

  • UI가 지정한 카메라를 통해 렌더링
  • 장점:
    • UI에 원근감 및 후처리 효과 적용 가능
  • 주의점: Render Camera 설정 필수

3. World Space

  • UI가 3D 오브젝트처럼 동작함
  • 특징:
    • 크기 단위가 유니티 유닛 (world 단위)
    • Transform, Collider 등 적용 가능
  • 용도: NPC 머리 위 UI, 인터랙션 UI 등

🔎 참고: World Space 캔버스는 CanvasScaler 설정에 주의!
TextMeshPro는 항상 RectTransform 정확히 설정 필요.

✍️ TextMeshPro 활용

TextMeshPro는 Unity의 기본 텍스트보다 고화질 + 고기능 제공

✅ 장점

  • Signed Distance Field 기반 고해상도 텍스트
  • 그림자, 외곽선, 색상 등 스타일 다양
  • <b>, <i>, <color> 등 리치 텍스트 태그 지원

⚙ 사용법

  • 처음 사용할 때 Essentials Import 필수
  • UI용 → TextMeshProUGUI,
    3D용 → TextMeshPro

🔄 기존 Text → TextMeshPro 변환

  • 우클릭 > Convert to TextMeshPro (자동 변환 지원)

💡 팁

  • 폰트 에셋 생성 시 Dynamic 설정은 런타임에서 한글/특수문자 지원에 유리
  • 리치 텍스트 태그 조합으로 인터랙티브한 텍스트 연출 가능

🔎 Unity 특성 어트리뷰트 (Attribute)

Unity는 Inspector와 직렬화 제어를 위해 다양한 특성(Attribute)을 제공합니다.

🔒 [SerializeField]

  • 설명: private 필드를 Inspector에 노출시켜 수정 가능하게 함
  • 사용 이유: 정보 은닉(캡슐화)은 유지하면서도 에디터 편의성 확보
[SerializeField] private int health;

🙈 [NonSerialized]

  • 설명: public 변수이지만 직렬화에서 제외시킴 (Inspector에서 숨김)
  • 주의: Unity의 직렬화는 public 또는 [SerializeField] private 만 저장 대상임
[NonSerialized] public int tempValue;

📋 그 외 유용한 특성들

  • [Header("제목")]: 인스펙터에서 변수 그룹에 제목 추가
  • [Range(min, max)]: 슬라이더 형태로 숫자 입력 제한
  • [Tooltip("설명")]: 마우스 오버 시 설명 텍스트 표시

⌨️ 유용한 단축키 (Unity 기준)

단축키 기능 설명

Ctrl + Shift + C 콘솔 창 열기
Ctrl + Shift + P Parse (일시정지 토글)
Ctrl + Shift + A 컴포넌트 추가 창 열기
Ctrl + D 선택한 오브젝트 복제
Ctrl + Shift + N 빈 GameObject 생성
F 선택한 오브젝트로 포커스 이동
Ctrl + P 게임 실행/정지 토글
Alt + 클릭 (Hierarchy) 하위 오브젝트 전체 펼치기/접기
Ctrl + Z / Y 실행 취소 / 다시 실행
Ctrl + E 씬 뷰(Scene View)와 게임 뷰(Game View) 전환
Q / W / E / R / T 이동, 회전, 스케일, 사각형 툴 등 전환
Shift + 스페이스 현재 창 최대화 / 최소화 토글

💡 참고: Unity 단축키는 Edit > Shortcuts 메뉴에서 커스터마이징도 가능합니다.