본문 바로가기
PulseBoard

Xcode + Sourcetree + GitHub 초기 연동 시 push 에러 해결기

by 밤새는 탐험가89 2025. 12. 17.
728x90
SMALL

📌 상황 요약 

새 프로젝트 PulseBoard를 만들면서 다음과 같은 흐름으로 작업을 시작했다.

  1. Xcode에서 iOS 프로젝트 생성
  2. 해당 프로젝트를 Sourcetree에 등록
  3. GitHub에서 미리 생성해 둔 repository를
    • Sourcetree의 Remotes 설정을 통해 연결
  4. 로컬에서 첫 커밋 생성
  5. Push 시도 → ❌ 에러 발생

처음 GitHub와 프로젝트를 연결할 때 자주 겪을 수 있는 문제였고,
결과적으로 Git의 보호 메커니즘을 이해하는 계기가 되었다.

 

❌ 발생한 에러

! [rejected] main -> main (non-fast-forward)
error: failed to push some refs
hint: Updates were rejected because the tip of your current branch is behind

 

이 에러의 의미

원격(main 브랜치)에 내가 아직 가져오지 않은 커밋이 이미 존재한다

 

즉,

  • GitHub repo에는 이미 커밋이 있음 (README, 초기 설정 등)
  • 로컬 main 브랜치는 그 커밋을 모른 채 push를 시도
  • Git이 “이거 덮어쓰면 위험한데?” 하고 막은 상황

 

🔍 1차 오해: origin 문제 

에러 해결을 위해 다음을 실행했다.

git pull origin main

 

실제 설정은 다음과 같았다.

Remote  git@github.com:89Explorer/PulseBoard.git

 

✅ 해결 1단계: 올바른 remote로 pull 

git pull Remote main

 

이제 remote 자체는 정상 인식되었지만,
다음과 같은 메시지가 다시 등장했다.

 

❌ 두 번째 에러: divergent branches

hint: You have divergent branches and need to specify how to reconcile them.
fatal: Need to specify how to reconcile divergent branches.

 

이게 무슨 뜻이냐면

로컬과 원격이 서로 다른 커밋을 가진 채 갈라진 상태라는 뜻이다.

Remote/main:   A --- B --- C
Local/main:    A --- B --- D

 

  • C : GitHub에만 있는 커밋
  • D : 로컬에서 만든 커밋

Git은 이 상황에서 자동으로 판단하지 않고,
개발자에게 “어떻게 합칠지”를 직접 선택하라고 요구한다.

 

🧠 Git이 제안한 선택지

1️⃣ merge

  • 히스토리를 모두 남김
  • 협업에서 안전
  • 커밋 그래프가 다소 복잡

2️⃣ rebase

  • 내 커밋을 최신 커밋 위로 재정렬
  • 히스토리가 깔끔
  • 개인 프로젝트 / 포트폴리오에 적합

3️⃣ fast-forward only

  • 이미 분기되었으므로 불가능

 

✅ 최종 해결: rebase 방식 선택

PulseBoard는 개인 프로젝트 + 포트폴리오 목적이므로
히스토리가 깔끔한 rebase 방식을 선택했다.

git pull --rebase Remote main

 

이 명령의 의미는:

“원격(main)의 최신 커밋을 먼저 가져오고,
그 위에 내 로컬 커밋을 다시 얹어라”

 

문제없이 완료된 후:

git push

🎉 정상적으로 GitHub에 반영되었다.

 

📌 핵심 원인 정리

이번 문제의 핵심은 단 하나였다.

GitHub repository에 이미 커밋이 존재했는데,
로컬에서 그 사실을 모른 채 push를 시도했다

Git은 이를 막기 위해:

  • non-fast-forward push를 거부했고
  • merge / rebase 중 하나를 선택하라고 요구했다

이는 에러가 아니라 Git의 안전장치다.

 

✨ 배운 점

  • Sourcetree에서 remote 이름은 반드시 확인할 것 (origin이 아닐 수도 있음)
  • 첫 push 전에 git pull 습관화
  • divergent branches 메시지는 “위험”이 아니라 “선택 요구”
  • 개인 프로젝트에서는 rebase가 히스토리 관리에 유리

 

728x90
LIST