🔧 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 메뉴에서 커스터마이징도 가능합니다.
'팀스파르타 내일배움캠프' 카테고리의 다른 글
| 부트캠프 1주차를 마치며... (0) | 2025.04.11 |
|---|---|
| 📚 TIL - 2025년 4월 11일 (금) – Git 협업 및 Unity 특강 정리 (2025.04.11) (0) | 2025.04.11 |
| [스파르타 유니티_10기 3일차] 유니티 실습과 깃! 학습 (0) | 2025.04.09 |
| [스파르타 유니티_10기 2일차] 개인 복습 일지: 고양이 밥주기 & 카드 뒤집기 (2025.04.08) (1) | 2025.04.08 |
| [스파르타 유니티_10기 1일차] TIL 강의 요약 – Git 협업 특강 (2025.04.07) (0) | 2025.04.07 |