push를 취소하고 싶을 때

이럴 때 참고하세요

“실수로 push 해버렸어요” / “push한 커밋을 없애고 싶어요”

상황별 빠른 해결

개인 브랜치

git reset --hard HEAD~1
git push -f origin 브랜치명

협업 브랜치 (안전)

git revert HEAD
git push origin 브랜치명

방법 비교

방법히스토리협업 안전성용도
force push변경위험개인 브랜치
revert유지안전협업 브랜치

방법 1: Force Push (개인 브랜치)

주의

다른 사람이 해당 브랜치를 사용 중이면 문제가 발생합니다. 개인 feature 브랜치에서만 사용하세요!

# 1. 로컬에서 커밋 취소
git reset --hard HEAD~1
 
# 2. 강제 push
git push -f origin feature/my-branch

여러 커밋 취소

# 최근 3개 커밋 취소
git reset --hard HEAD~3
git push -f origin 브랜치명

특정 커밋으로 되돌리기

# 해당 커밋으로 reset
git reset --hard a1b2c3d
git push -f origin 브랜치명

방법 2: Revert (협업 브랜치)

새 커밋으로 변경사항을 되돌립니다. 히스토리가 유지되어 안전합니다.

# 직전 커밋 되돌리기
git revert HEAD
git push origin main

결과

Before:
[c1]──▶[c2]──▶[c3]

After:
[c1]──▶[c2]──▶[c3]──▶[Revert c3]

여러 커밋 되돌리기

# 하나씩 되돌리기 (최신 것부터)
git revert HEAD
git revert HEAD~1
git push
 
# 또는 범위로
git revert HEAD~2..HEAD
git push

상황별 상세 가이드

상황 1: 비밀 정보를 push 했을 때

긴급!

API 키, 비밀번호 등이 유출되면 즉시 해당 키를 무효화하세요. Git 히스토리에서 완전히 제거하려면 추가 작업이 필요합니다.

# 1. 로컬에서 제거
git reset --hard HEAD~1
# 또는 파일만 제거
git rm --cached secret.env
git commit -m "chore: 비밀 파일 제거"
 
# 2. .gitignore에 추가
echo "secret.env" >> .gitignore
git add .gitignore
git commit -m "chore: gitignore 업데이트"
 
# 3. force push (개인 브랜치) 또는 협업 시 새 커밋
git push -f origin 브랜치명
 
# 4. ⚠️ 중요: 유출된 키는 반드시 무효화/재발급!

상황 2: 잘못된 브랜치에 push

# 1. 잘못된 브랜치에서 제거
git push origin --delete 잘못된브랜치
 
# 또는 reset + force push
git reset --hard HEAD~1
git push -f origin 잘못된브랜치
 
# 2. 올바른 브랜치에 push
git switch 올바른브랜치
git push origin 올바른브랜치

상황 3: main에 직접 push 해버렸을 때

# 안전하게 revert
git revert HEAD
git push origin main
 
# 올바른 브랜치에서 다시 작업
git switch -c feature/correct-branch
git cherry-pick 원래커밋ID
git push origin feature/correct-branch

안전한 Force Push

--force-with-lease를 사용하면 더 안전합니다:

git push --force-with-lease origin 브랜치명

특징:

  • 내가 마지막으로 본 상태에서만 강제 push
  • 다른 사람이 push한 커밋이 있으면 실패
  • 실수로 다른 사람 작업을 덮어쓰는 것 방지

자주 하는 실수

force push 후 팀원 코드 유실

예방:

  • 협업 브랜치에서는 force push 금지
  • --force-with-lease 사용
  • 팀원과 미리 소통

revert 후 다시 해당 기능 추가

revert를 또 revert하면 원래 코드가 복원됩니다:

git revert 리버트커밋ID

관련 문서

더 알아보기