Rebase
Rebase는 한 branch에 있는 내용을 다른 branch에 병합하는 두가지 Git 유틸리티 중 하나 입니다. 다른 하나는 이미 모두가 사용하고 있는 git merge
입니다. merge는 항상 이후로 향하는 변경인 반면에, rebase는 git의 history를 다시 작성 하는 강력한 기능을 가지고 있습니다.
Rebase는 manual
과 interactive
이렇게 두 가지 메인 모드를 가지고 있습니다.
여러가지 역할이 가능 한 rebase 지만 이번 posting에서는 이미 커밋한 몇개의 커밋을 하나로 합치고 새로운 커밋 메시지를 남기는 용도로 사용 해 보겠습니다.
문제
커밋을 했는데 깜빡한게 있는 경우가 생겼습니다.
19 분 전에 커밋을 하자 마자 코드가 너무 지저분 하다는 생각이 들어 조금의 수정을 했는데요, 원래대로라면 하나의 커밋으로 남길 건데, 의도치 않게 두개가 되었습니다.
해결
Ubuntu 에서는 Ctrl + ` 를 입력하면 Github Desktop 에서 Terminal을 켤 수 있습니다. 어떤 방법으로도 상관 없으니 본인이 사용하시는 Ternimal을 켜시고, git 저장소가 있는 폴더로 이동해주세요.
Terminal이 커졌습니다. 작업중인 branch 이름을 확인 하고, 아래의 명령어를 입력 합니다.
병합하고 싶은 branch가 2개 보다 많다면 ~2
대신 그 숫자를 기입 해 주시면 됩니다.
저는 2개의 미리 push까지 마친 커밋을 병합 할 예정입니다.
git rebase -i HEAD~2
기존에 git 편집기로 지정해 둔 편집기가 뜹니다. 예상하지 못했던 nano 에디터가 켜져서 당황했습니다.
편집기가 뜨면 이제 합치거나 편집할 commit을 선택해줍니다.
아래 있는 커밋을 위에 있는 커밋으로 합치겠다는 의미에서 앞의 pick 을 s 로 바꿔줍니다. 커밋이 여러개라면, 하나의 커밋만 납두고 나머지 커밋들을 다 s 로 변경해주면 됩니다.
평소 vi 에디터를 쓰는데 nano가 켜져 단축키를 몰라 당황했지만 ctrl+s 로 저장하고, ctrl+x 로 종료 할 수 있었습니다. vim 이라면 wq!
를 입력 해 주면 됩니다.
이번에는 COMMIT_EDITMSG
가 뜹니다.이제 새로운 커밋 메시지를 작성할 수 있습니다.
원하는 커밋 메시지를 작성 하고, 다시 ctrl+s 로 저장하고 ctrl+x 로 나가면 됩니다. 이미 알고 계시겠지만, 주석이 달린 부분들은 커밋 메세지에 포함되지 않습니다.
rebase가 완료 되었습니다.
push를 할 차례인데, 이미 push 되었던 커밋들이므로, 강제로 push 해줍니다. -f 혹은 --force 라고 옵션을 붙여줍니다.
git push -f
push까지 마쳤습니다. 확인 해보니 두개의 commit이 하나로 합쳐졌습니다.
주의
참고로, Remote Repository 의 해당 Branch 가 보호되어 있으면 Push할 때 -f 옵션이 불가능 할 수 있습니다.
위의 스크린샷은 Gitlab의 예인데, Allowed to force push 를 허용하지 않은 상태 입니다. 이 경우에는 강제 Push가 불가능합니다.
해당 옵션을 잠깐 켜고 강제 푸쉬하는 방법이 있지만, 이 경우에는 브랜치를 보호하려는 목적에 위배 될 수 있으니, Remote Branch에 Push 하기 전에 최대한 신중하게 확인 하는 것이 좋겠습니다.
Git 기본 편집기 변경
마지막으로 git 기본 편집기를 nano 에서 vim 으로 변경하고 마치겠습니다.
git config --global core.editor "vim"
'Development > Git' 카테고리의 다른 글
Git) 실수로 삭제한 Branch 복구하기 (0) | 2022.01.12 |
---|---|
원격저장소 추가 - git remote add (0) | 2021.11.25 |
Github / Gitlab SSH 공개 키 등록하기 (0) | 2021.09.25 |
Sourcetree 에서 잘못된 비밀번호로 저장소 접근 안될때 해결방법 (5) | 2021.08.24 |
Github REST API 요청 한도 늘리기 (1) | 2021.06.22 |