리모트에 올린 커밋 취소 or 되돌리기

요즘 번역 오픈소스 프로젝트를 하다보니 커밋하고 나서 보이는 오타들이 있었다. 하지만 글자 하나 때문에 새로 커밋 올리는 것은 깔끔하지 않다고 생각되고 어떤 오픈소스 프로젝트에서는 불필요한 커밋은 합쳐서 올리기를 요청하기도 한다고 했다(기본인가..?)🤔
이럴땐 커밋 취소, 되돌리기, 덮어쓰기를 상황에 맞게 사용하자.

git log --oneline
현재 커밋 로그를 조회해서 어느 지점 커밋으로 되돌리고 싶은지 확인한다.

8d9111b (HEAD -> ddp_pipeline, origin/ddp_pipeline) 커밋4
cedfd58 커밋3
f0780f0 커밋2
b908557 커밋1

✅ 이미 올라간 커밋을 바꾸고 싶다! 어떻게?

  • 방법1 커밋 취소하기:git reset --soft HEAD^
    로컬 저장소 상태를 커밋 이전 상태로 강제 변경해린다.
    ⚠️ 해당 브랜치를 협업하고 있다면 위험할 수 있다⚠️
    • --soft: 지정한 커밋에 있던 내용이 stage에 있는 상태로 되돌려진다.
    • --hard: 지정한 커밋 기점의 상태로 되돌아간 상태이다.
    • HEAD^: 바로 이전 커밋으로 돌아가기
    • HEAD~n: n전 커밋으로 돌아가기 (HEAD~1==HEAD^)
  • 방법2 커밋 되돌리기:git revert HEAD^
    커밋을 되돌렸다는 게 히스토리에 남는다.
  • 방법3 커밋 덮어쓰기: git commit --amend
    추가 작업을 이전 커밋에 포함시킨다. (이게 제일 좋은 방법같다..)
    하지만 이미 원격 저장소에 push한 커밋 내용이라면 resest처럼 force push 필요하다)

나는 해당 브랜치를 함께 작업하는 사람이 없어서 reset을 사용하는데 문제가 없었고 이전 커밋을 취소하고 새 커밋을 올리리고 싶었다. 이 방법으로 오타까지 고친 커밋5를 새로 올리고 히스토리에 커밋4를 남기지 않는다.

  1. git reset --soft HEAD^
cedfd58 (HEAD -> ddp_pipeline) 커밋3
f0780f0 커밋2
b908557 커밋3
  1. 기존의 수정한 내용을 지우지 않고 한군데만 더 고치면 되어서 hard 대신 soft 옵션을 줬다.
    스테이지에 추가되어있던 파일을 내려주고 수정하기
  2. git commit -m "message" 커밋 올리기
  3. git push -f origin ddp_pipeline
cfb8eec (HEAD -> ddp_pipeline, origin/ddp_pipeline) 커밋5
cedfd58 커밋3
f0780f0 커밋2
b908557 커밋3

다음엔 revert를 사용해야겠다.