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 권장
'기술스택 > Git' 카테고리의 다른 글
[Git] git add -A vs git add (디렉토리 구조 변환 중) (0) | 2025.05.11 |
---|---|
[Git] git branch -d 브랜치 캐싱 (0) | 2024.10.04 |
[Git] git 브랜치 흐름 관리 (0) | 2024.08.21 |
[Git] Git 명령어 심화 (0) | 2024.04.12 |
[Git] Issue, PR, git branch 전략 (0) | 2024.02.08 |