삽질인가 고찰인가

Git 명령어) 중간 commit 삭제하기

우당탕 오리의 개발모험 2024. 9. 20. 14:18

 

N개 commit 히스토리 중 중간에 특정 commit 만 삭제하고 싶을 때 명령어가 있을까?

 

싶었지만 당연히 있다.

 

땡큐 git!

 

 

git rebase -i

-i 옵션: interactive 약자. 최근 커밋을 하나씩 처리할 수 있다.

순서

  1. (최근 커밋이 아닌 예전 커밋을 삭제해야 할 때만) 삭제할 커밋 바로 앞으로 이동한다 (switch {branch})
  2. git rebase -i HEAD~삭제할커밋갯수 명령어를 실행한다.
  3. 에디터가 열리고, 최근 커밋 히스토리 목록이 노출되면, 삭제할 커밋의 pick 단어 대신 drop 으로 변경한다.
  4. 에디터 저장&종료하고 나온다. (:wq)

[최신 커밋 이력 수정할 때]

# 최근 3개의 커밋을 대상으로 rebase 시작
git rebase -i HEAD~3

# 열린 에디터에서 삭제할 커밋의 pick을 drop으로 변경
pick f7e3051 first commit
pick 3104e52 second commit
drop 9c083ec this is the commit to drop  # 삭제할 커밋
pick 1a025dd fourth commit

 

[꽤 지난 커밋 이력 수정할 때]

# 삭제할 커밋 이전으로 이동
git checkout 커밋해시값

# rebase & drop 진행(위 코드 참고)

# 다시 브랜치의 최신으로 이동
git switch 브랜치명

# log를 보려면 이렇게
git log

# rebase 했던 커밋해시값 새 브랜치 생성
git branch 새브랜치명 rebase처리한커밋해시값

# 최신브랜치로 다시 이동 후 최신브랜치에 새브랜치를 rebase
git switch 브랜치명
git rebase 새브랜치명

 

 

주의사항

  • 커밋 삭제 후 복구할 수 없으므로 신중하게 결정해야 한다.
  • 협업 시 주의: 다른 개발자와 함께 작업하는 경우, rebase로 인해 다른 개발자의 로컬 브랜치가 깨질 수 있다.
    이 경우, 다른 개발자들은 로컬 브랜치 삭제 후 다시 checkout 받는게 좋다.

 

소감

rebase는 squash 할 때만 사용했었는데, 이렇게 중간 커밋을 삭제할 수도 있구나!