2021 오픈소스 컨트리뷰션 아카데미의 오픈소스 101 교육을 듣고 정리한 내용입니다.
체크 포인트를 만들어 과거의 commit으로 되돌아 갔다가 돌아오는 작업이 필요한 이유
✅ 과거에 작성했던 commit을 수정/삭제하기 위해서는 과거 시점으로 돌아가서 수정해야 한다. 그 돌아가는 과정이 rebase라고 보면 된다.
✅ 오픈소스 프로젝트에서는 내 PR에 대해 " 커밋 두개를 합쳐라, 커밋을 쪼개라, 몇 개는 메세지를 변경해라 " 등 세밀하게 리뷰를 받게 된다. 그때마다 과거로 돌아가 그 이후의 커밋을 모두 삭제하거나 새로 커밋을 쌓을 수는 없기 때문에 이런 Interactive Rebase 작업이 필요한 것이다.
✅ 특정 커밋 이후에 새로운 커밋 몇 개를 추가한 뒤 현재로 돌아오는 경우도 생길 수 있다.
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
으로 커밋 리스트를 확인해보면 커밋이 한 개였던 과거 시점으로 돌아갔음을 확인할 수 있다.
git rebase --continue
체크 포인트
를 해제하는 명령어. 그러면 다시 원래 시점 (되감기 전)의 커밋으로 돌아올 수 있다.체크 포인트
를 여러 개 만든다면? git rebase -i --root
로 각각 3, 5, 6번째 commit에 체크 포인트
를 만든다면, --continue
할 때마다 3번째 commit, 5번째 6번째 commit으로 이동하고 마지막으로 --continue를 하면 최신 시점으로 돌아올 수 있다.git rebase --abort
git rebase -i --root
명령어로 체크 포인트를 만들 커밋 목록을 확인한다.
edit
으로 수정하는 점 주의 (두번째 커밋이 존재하는 시점으로 가고 싶다면 두번째 커밋 edit) git log --oneline
명령어로 체크포인트 시점을 확인해본다.
새로운 3개의 commit을 추가한 뒤 git rebase --continue
로 현재 시점으로 돌아온다.
다시 git log --oneline
명령어로 중간에 새 커밋이 추가 되었음을 확인한다.
git rebase -i --root // 합쳐서 남길 커밋 HEAD를 edit 해준다.
git reset --soft HEAD~1
git commit --amend
git rebase --continue
reset
의 --soft
옵션은 commit 정보만 삭제하고 파일의 변경분은 남겨둔다. 즉, 소스의 변화는 그대로 두고 커밋 두 개를 하나로 합칠 때 사용하는 것이다. git reset --hard HEAD~1
은 최신 커밋 삭제뿐만 아니라 파일의 변경분도 완전히 삭제한다.