Section 16: Interactive Rebase를 사용하여 히스토리 삭제하기

김남훈·2024년 2월 3일

Git & Github

목록 보기
14/18

Critical

Important

Nice To Have

피처 브랜치에서 작업한 후 커밋을 푸쉬하기 전에 커밋을 없애거나 수정하고 싶을 때 git rebase 를 사용할 수 있다. 현재 어떤 브랜치에 있든 해당 브랜치의 끝을 기점으로 리베이스를 한다. 이때 git rebase -i HEAD~4와 같이 -i 옵션을 사용하면 인터랙티브 모드가 활성화 되고 커밋 이름을 변경하거나 커밋을 제거하거나 할 수 있다. 이때 git rebase -i HEAD~9 처름 히스토리를 다시 쓰는 커밋 개수를 정해야 한다. 그리고 히스토리를 다시 쓰는 커밋 갯수는 최소화하는 것이 좋다.
git rebase -i HEAD~9을 실행하면 텍스터 에디터가 실행된다. 아래의 그림을 보면 알 수 있다.

대상 커밋 목록이 명령어와 함께 표시가 된다. 디폴트 값으로는 pick 으로 나와있다. 이때 pick 대신에 다른 명령어를 넣어준다면 명시된 명령어를 실행한다. 중요한 명령어는 다음과 같다.

  • pick - use the commit
  • reword -use the ecommit but edit the commit message
  • edit - use commit, but stop for amending
  • fixup - use commit contents but meld it into previous
  • drop - remove commit

Rewording Commits

우선 reword는 아까 위에서 텍스트 에디터가 열렸을 때 pickreward로 바꾸고 나서 저장후에 창을 닫는다. 그러면 COMMIT_EDITMSG 창이 나오는데, 이때 깃 메시지를 재작성하면 된다. 이런식으로 작업을 하게 되면 아래와 같은 브랜치 도식이 생긴다.

즉 아까 수정하려고 한 것들이 모두 사본처럼 복사가 된다(재생산->커밋이 다름).

Fixing Up/Squashing Commits

만약에 커밋을 하나로 만들어도 되는데 쓸데없이 여러개를 만들었다고 치자.(같은 주제의 커밋을 여러개 만듦) 이때 커밋을 하나로 병합하려면 fixup이라는 명령어를 사용하면 된다.

"whoops forgot to add bootstrap js script" 을 지우고 이전 커밋과 합치는데 fixup은 해당 커밋을 폐기한다. 위의 사진처럼 없애고 싶은 것에 fixup을 추가한다면, 바로 전 커밋에 fixup이라고 표시된 커밋을 추가하게 된다. 이렇게 되면 "whoops forgot to add bootstrap js script"라고 메시지가 붙여진 커밋은 없어지지만 그 안에 들어있던 내용은 이전 커밋과 합쳐진 상태가 된다. 이 때 fixup 한 이후 커밋은 재생성된다.

Dropping Commits

완전히 커밋 자체를 제거하는지 알아보겠다. 현실에서 작업하기 전에 없애고 싶은 커밋이 있으면 지울 수 있어야한다. 이때는 명령어를 drop을 사용하면 된다.

  • 만약에 커밋메시지를 바꾸고 싶으면, git commit --amend 를 사용하면 된다.
profile
안녕하세요

0개의 댓글