✅ git push -f
의 동작 원리와 일부 폴더만 클론했을 때의 주의사항
🔍 에러 상황 요약
error: failed to push some refs to '원격 저장소 주소'
hint: Updates were rejected because the tip of your current branch is behind
이 에러는 로컬 브랜치의 커밋 이력이 원격보다 뒤처졌기 때문에, git push
가 거부된 상황입니다. Git은 기본적으로 기존 커밋을 덮어쓰는 걸 방지하려고 합니다.
💣 git push -f
하면 어떻게 되나?
git push -f
-f
옵션은 강제로 내 로컬 커밋을 원격 브랜치에 덮어씌우는 명령입니다.
- 로컬 커밋 기록만 남기고, 원격 저장소의 기존 커밋 내역은 사라집니다.
- 특히 내가
.git
디렉토리 없이 일부 폴더만 복사해서 작업한 경우, 그 폴더만 포함된 새로운 커밋 기록이 생기므로, 푸시 시 기존 원격의 다른 폴더들은 삭제됩니다.
⚠️
git push -f
는 원격 저장소의 변경 내용을 모두 덮어쓰기 때문에, 기존 파일들이 삭제될 수 있습니다. 개인 프로젝트에서만 사용하거나, 협업 중일 경우 팀원과 상의 후 사용해야 합니다.
🧨 예시 상황
- 전체 리포지토리가 아니라 특정 폴더만 따로 복사해서 작업했음
- 새로
git init
하고remote add
로 원격 연결 후git push -f
함 - 이 경우 원격 저장소의 다른 파일들(복사하지 않은 폴더들)은 모두 사라짐
✅ 안전한 작업 방식
✔️ 방법 1. 기존 리포지토리 전체를 클론해서 작업
git clone [원격 저장소 주소]
# 작업한 폴더 복사해서 덮어쓰기
git add .
git commit -m "작업 내용 반영"
git push
→ 원격의 기존 폴더들도 유지되며, 내 작업도 반영됨.
✔️ 방법 2. pull
없이 병합해서 푸시
git fetch origin
git merge origin/main
git push
→ git pull
을 하지 않더라도, 원격 변경사항을 병합하여 안전하게 푸시 가능.
🧭 덮어썼는지 확인하는 방법
git log --oneline
또는 GitHub에서 "Commits" 탭 확인
→ 기존 커밋들이 모두 사라지고 내 커밋 하나만 남아 있다면, 덮어씌운 상태입니다.
⏪ 이미 -f
로 푸시했을 경우 복구법
- GitHub의 이전 커밋을 브랜치로 복원하거나
- 이전 커밋 해시를 이용해
git reset
또는git cherry-pick
으로 복구 가능
🧷 정리 요약
목적 | 명령어 | 주의사항 |
---|---|---|
원격 내용을 무시하고 덮어쓰기 | git push -f |
기존 파일들 전부 삭제 가능성 |
안전하게 병합 후 푸시 | git fetch + merge + push |
충돌 해결 필요 가능성 |
리포지토리 전체 작업 | git clone → 작업 → push |
가장 안전하고 권장되는 방식 |
'git' 카테고리의 다른 글
[Git] Git 2.25 이상: `git sparse-checkout set`을 이용한 특정 폴더 클론 방법 (0) | 2025.04.10 |
---|---|
[Git] Git 저장소에서 특정 하위 폴더만 클론하는 방법 (여러 폴더 선택 포함) (0) | 2025.04.10 |
[Git] git 특정 커밋 다운 (1) | 2024.05.08 |
[Git] git clone change directory name (1) | 2024.01.03 |
[Git] 강제 pull 하기 (0) | 2023.11.02 |
댓글