[Git] Interactive Rebase 실습

오픈소스 프로젝트의 Git History에서 체크 포인트를 만들어 과거의 commit으로 되돌아 갔다가 돌아오는 작업이 필요한 이유

2021 오픈소스 컨트리뷰션 아카데미의 오픈소스 101 교육을 듣고 정리한 내용입니다.

1. commit 과거 시점으로 되감기(rewind), 풀기(continue)

체크 포인트를 만들어 과거의 commit으로 되돌아 갔다가 돌아오는 작업이 필요한 이유

✅ 과거에 작성했던 commit을 수정/삭제하기 위해서는 과거 시점으로 돌아가서 수정해야 한다. 그 돌아가는 과정이 rebase라고 보면 된다.

✅ 오픈소스 프로젝트에서는 내 PR에 대해 " 커밋 두개를 합쳐라, 커밋을 쪼개라, 몇 개는 메세지를 변경해라 " 등 세밀하게 리뷰를 받게 된다. 그때마다 과거로 돌아가 그 이후의 커밋을 모두 삭제하거나 새로 커밋을 쌓을 수는 없기 때문에 이런 Interactive Rebase 작업이 필요한 것이다.

✅ 특정 커밋 이후에 새로운 커밋 몇 개를 추가한 뒤 현재로 돌아오는 경우도 생길 수 있다.

1.1. rewind

git rebase -i --root
  • -i 는 interactive의 약자이고, --root는 리와인드 범위를 전체 커밋으로 하겠다는 의미이다.

    • git rebase -i HEAD~5
      • HEAD~5 는 리와인드 범위를 현재 HEAD를 기준으로 과거 5개 까지로 하겠다는 의미이다.

  • commit 의 "pick" 글자를 "edit" 으로 수정하면, 과거 시점 commit에 체크 포인트를 만들 수 있다.

  • 만약 가장 오래된 커밋의 pick을 edit으로 수정한뒤 git log --oneline 으로 커밋 리스트를 확인해보면 커밋이 한 개였던 과거 시점으로 돌아갔음을 확인할 수 있다.

1.2. continue

git rebase --continue
  • 체크 포인트를 해제하는 명령어. 그러면 다시 원래 시점 (되감기 전)의 커밋으로 돌아올 수 있다.

  • 다시 commit, push 할 필요도 없다.

  • 만약 체크 포인트를 여러 개 만든다면?

    • git rebase -i --root 로 각각 3, 5, 6번째 commit에 체크 포인트를 만든다면, --continue 할 때마다 3번째 commit, 5번째 6번째 commit으로 이동하고 마지막으로 --continue를 하면 최신 시점으로 돌아올 수 있다.

1.3. abort

git rebase --abort
  • rebase 과정을 취소하려면 --abort 옵션을 사용

2. [실습] 커밋 로그의 두번째 commit 이후에 새로운 commit 3개 넣기

  1. git rebase -i --root 명령어로 체크 포인트를 만들 커밋 목록을 확인한다.

    • 커밋 내역이 과거 순으로 나온다는 점 주의

    • 확보하고 싶은 커밋 ID를 edit 으로 수정하는 점 주의 (두번째 커밋이 존재하는 시점으로 가고 싶다면 두번째 커밋 edit)

  2. git log --oneline 명령어로 체크포인트 시점을 확인해본다.

  3. 새로운 3개의 commit을 추가한 뒤 git rebase --continue로 현재 시점으로 돌아온다.

  4. 다시 git log --oneline 명령어로 중간에 새 커밋이 추가 되었음을 확인한다.

    • git log 명령어는 최신순으로 정렬된다.

3. [실습] 과거 commit 정보 삭제하기 (두 개의 commit을 하나로 합치기)

3.1. reset --soft

git rebase -i --root // 합쳐서 남길 커밋 HEAD를 edit 해준다.
git reset --soft HEAD~1

git commit --amend
git rebase --continue
  • reset--soft 옵션은 commit 정보만 삭제하고 파일의 변경분은 남겨둔다. 즉, 소스의 변화는 그대로 두고 커밋 두 개를 하나로 합칠 때 사용하는 것이다.

    • HEAD~1 은 현재 commit에서 과거로 하나까지를 의미한다.

  • --amend 옵션으로 변경한 커밋을 적용하고, 현재 시점으로 돌아온다.

3.2. reset --hard

git reset --hard HEAD~1 은 최신 커밋 삭제뿐만 아니라 파일의 변경분도 완전히 삭제한다.

Last updated