[Git] Interactive Rebase 실습

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)
  1. git log --oneline 명령어로 체크포인트 시점을 확인해본다.

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

  3. 다시 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 은 최신 커밋 삭제뿐만 아니라 파일의 변경분도 완전히 삭제한다.

좋은 웹페이지 즐겨찾기