TIL

유용한 Git 명령어 - rebase

sincerely10 2020. 8. 9. 21:08
반응형

이번 포스트는 git에 대해 다뤄 보겠습니다. git은 정말 장점이 많은 협업툴입니다. 저의 경우는 운영업무를 하면서는 git을 한 번도 사용해보지 않다가 개발을 배우면서 다시 사용중에 있습니다.

한 가지 아쉬운 것은 처음 사용할 때, 다소 어렵게 느껴질 수도 있다는 점입니다. 그리고 혹여나 실수를 할 때... 가 어려운것 같습니다. 혹여나 남의 코드나 작업하는 repository를 망치지 않을까 하기 때문입니다.

다른 git 명령어는 많이 어렵지는 않아서 포스팅을 작성하지는 않았는데 rebase의 경우는 생소하고 다소 새롭기 때문에 작성하고자 합니다.

1. git Rebase 살펴보기

단어 그대로 기점을 다시 잡는 명령어 입니다. 한 마디 말보다 좋은 예제 그림이 더 명확하기 때문에 업로드 해보겠습니다. 

기존의 경우에는 merge에서 보시는 것과 같이 local의 master를 'git pull origin master'로 가져오고 현재 개발중인 branch로 가서 merge로 내용을 합쳤습니다.
그러나 이 방법은 여러 commit message를 남기게 됩니다. 제가 작성했던 모든 불필요한 commit message까지 함께 오는 것이죠.

 

2. git Rebase 실전

이제 git rebase를 사용하고자 합니다. git rebase는 하나의 branch에 여러 commit을 했더라도 최종적으로는 하나의 commit만 남길 수 있게하는 굉장히 효율적인 명령어 입니다.

간단한 rebase 테스트를 해보겠습니다.
테스트 Repository를 만들고 아무 파일을 만들어보겠습니다. 그리고 이 상태를 commit 합니다. 이어서 두 번 더 commit 해보겠습니다.

그 결과는 아래 화면과 같습니다. 제가 만든 branch로 세 개의 commit이 보입니다.

작성한 branch의 상황

여기서 master branch로 옮기고 조금 전에 작성한 파일을 똑같이 만들고 commit 해보겠습니다. 즉, 새로운 master를 어떻게 합치는가 보고자 하기 때문입니다.

master branch의 상황

 

터미널에서 'git rebase -i master'를 입력해보겠습니다. 지금까지 한 번도 보지 못 한 화면이 떴습니다. 그렇지만 하나씩 정리하면 어떻게 해결할지 길이 보일것입니다.

feature branch에서 rebase한 상황에서의 전환하면

먼저 이 화면은 제가 작성한 commit중 어떤 대상을 합칠지에 대한 선택화면 입니다. 저는 처음의 markdown 파일을 작성한 commit만을 남기고 싶기 때문에 이 commit message만 가져가겠습니다. 나머지는 가장 첫 번째 commit에 병합할 것입니다. 물론 파일 수정이력은 그대로 이고요.

선택하는 것을 pick 병합할 것을 squash 상태로 변경하면 이 화면은 끝입니다. 아래 처럼 바꾸고 저장해보겠습니다.

 

이제 끝이라고 생각하는 순간 충돌이 발생했음을 알려줍니다. 계속 하려면 confict(충돌)을 해결하고 'git rebase --continue' 를 입력해야 합니다.

작성한 md 파일을 열고 아래 처럼 충돌난 부분을 수정해줍니다. 저는 master의 내용을 남기겠습니다. 그리고 git add 해주고 위에서 언급한 git rebaes --continue를 입력합니다.

현재의 commit만을 남긴 것을 볼 수 있습니다.

 

다시 한번 저장을 하면 다음 화면으로 다음과 같이 넘어갑니다. 저는 처음 commit message만 남길 것이므로 주석과 첫 commit message를 제외하고 전부 지워주겠습니다.

 

드디어 마무리 된 것 같습니다. git log를 살펴보겠습니다.

제가 작성한 local master의 수정이 origin master에 이어지고 그 다음에 feature branch가 붙었습니다!
혹시 모르니 markdown 파일을 확인해보겠습니다.

작성한 파일에서도 master의 내용이 자연스럽게 이어져 있습니다. 그런데 만약 조금 전에 master에서 작성한 파일이 첫 번째 줄을 넘어 세번째 줄이었으면 어땠을까요? 3개의 commit에 대해 각각의 수정을 했어야 합니다. 왜냐하면 각 충돌이 해결되지 못 하면 이어지지 못하기 때문입니다.

만약 10개의 commit이 다 충돌 났다면 10번을 반복해야 했을 것입니다. 이러한 불상사를 줄여주기 위해서는 어떻게 해야할까요?
조금 번거로울지라도 깔끔한 commit message를 작성하시려면 각 branch에서
'git rebase -i HEAD~{병합할 commit 수}'
로 브랜치에서 미리미리 commit을 합쳐줘야 합니다.

여기까지 git의 정말정말 유용한 rebase에 대해서 공부했습니다. 모두 깔끔하고 충돌없는(없을 수는 없겠죠.. 있을지라도 지혜롭게 병합하시길) git 사용하시길 바랍니다.

반응형