본문 바로가기

기술스택/Git

[Git] 작업 도중, 실수로 이전 커밋 관련한 작업물을 올리지 못했을 때

git add <실수로 못한 작업물>

git commit --amend

 

git show --only-name

: 이전 커밋의 파일명 확인 가능.

 
 

 

실수로 이미 push를 해버렸다면?.

git add <실수로 못한 작업물>

git commit --amend

 

git push --force-with-lease origin <작업 브랜치>

 

 

force없이 push 하려고 한다면?

🔍 오류 핵심 요약

non-fast-forward 오류는 로컬의 커밋 해시가 원격의 HEAD와 달라졌는데,
--force 없이 push 하려고 해서 Git이 거부한 것

 

amend를 하면 커밋 메시지가 변경되지 않아도 해시는 변경되기에, PR에 올라간 마지막 commit(HEAD)와 로컬의 amend한 커밋은 다름.

➡️ 그래서 amend는 이전 커밋을 새 커밋으로 "덮어쓴 것처럼 보이지만 실제로는 완전히 새로운 커밋을 만든 것입니다.

  • 원격 브랜치의 마지막 커밋 해시 = A
  • 로컬에서 --amend 후 커밋 해시 = B (A ≠ B)
  • Git은 A → B로의 변경이 fast-forward가 아님 → 거부

✅ 해결 방법:

git push --force-with-lease origin your-branch
  • 강제로 원격의 A 커밋을 B로 덮어쓰겠다는 의미
  • GitHub PR에서도 커밋 히스토리가 자동 갱신됨 (PR URL은 그대로)

🛑 주의사항

항목 설명
--amend 커밋 내용은 같아 보여도 커밋 해시가 바뀜
--force 바뀐 커밋을 덮어쓰려면 반드시 필요
GitHub PR 이미 열려 있어도 자동으로 반영됨 (단, 해시 변경 감지됨)

 

 

PR을 merge하기 전이라면 --amend + --force 전략은 안전하며, 실무에서도 널리 사용되는 방식입니다.
오히려 PR 하나당 커밋을 깔끔하게 정리하고 싶은 경우 적극적으로 권장됩니다.


🔍 정리: --amend + --force 전략은 언제 괜찮은가?

상황 사용 가능 여부 설명
PR 작성 전 ✅ 안전 혼자 브랜치 작업 중이라 자유롭게 정리 가능
PR 작성 후, 아직 merge 전 ✅ 안전 GitHub에 열려 있어도 강제 푸시하면 변경사항 반영됨
merge 된 후 ❌ 금지 강제 푸시는 기존 기록을 덮어써 협업에 치명적
 

👍 실무에서도 선호되는 이유

이유 설명
커밋 기록 정리 가능 typo 수정, 누락 파일 추가 등을 하나의 커밋으로 정리 가능
리뷰어 입장에서도 가독성 좋음 fixup, amend된 내용이 여러 커밋으로 흩어지지 않음
GitHub PR에 자동 반영 기존 PR 커밋도 업데이트되어 히스토리 깨지지 않음
 

팀마다 "merge 전까지는 강제 푸시 허용"이라는 룰을 따르는 곳이 많습니다.


🔧 안전하게 사용하려면 이렇게

git commit --amend --no-edit
git push --force-with-lease origin your-branch
  • --force-with-lease는 원격에 다른 변경이 있을 경우 푸시를 막아줌
  • 혼자 작업할 땐 --force도 가능하지만 협업 땐 --force-with-lease 권장