Git rebase 를 해보자

정성욱·2019년 11월 17일
4

협업에서 git은 효과적인 도구이다. 작업을 commit한 시점별로 버전을 저장해주고, remote master 브랜치를 활용하여 실시간으로 공유하며 협업을 이어나갈 수 있다.

이러한 git은 기본적으로 commit을 한 시점 기준으로 merge를 하게되는데 이는 동시다발적인 작업을 할때 각자 진행한 작업 단위로 revert를 어렵게 만드는 요소이기도 하다.

따라서 각자의 작업량을 한데 묶은 후 최신 master 브랜치 시점에 push하여 merge를 진행하는 것이 바로, rebase의 개념이다. 간단히말해서, 최신 베이스 기점으로 이전 커밋들을 합친 작업을 푸쉬 하는 것이라고 이해하면 될것 같다.

거의 모든 git 작업들이 그렇듯 rebase도 마찬가지로 터미널 작업으로 진행된다.
아래 명령어들을 참고하여, 순차적으로 따라해보자.

1. 로컬 master 브랜치 상태를 최신화 시켜준다.

git checkout master
터미널을 작업중인 프로젝트 위치로 이동한 뒤, 나의 작업 중인 노트북 혹은 데스크톱의 master브랜치로 checkout을 해준다.
git pull origin master
위 명령어를 이용해 git의 master브랜치에 있는 최신 상태를 업데이트 해주자. (rebase는 나의 로컬에서 진행되기 때문이다!)

2. 작업중인 브랜치로 돌아와 본격적인 rebase를 시작한다.

git checkout mybranch
작업 중인 나의 브랜치로 이동한 이후,
git rebase -i master
rebase 실행 명령어를 입력한다.

rebase 명령어가 잘 실행되었다면, 터미널 상단에 commit 한 횟수만큼 pick 으로 시작하는 commit 목록들이 보일 것이다. 여기서 commit 들을 하나로 묶어주는 작업을 하게되는데 이것을 squash라고 한다.

3. squash

rebase 명령어 실행 후, 맨 위의 가장 상단의 pick 만 남겨두고, 그 다음번째 줄부터 pick을 squash(혹은 s 만쳐도 된다.)로 바꿔주자. i 를 입력하면 insert모드가 실행되고 수정할 수 있게된다!!

상단의 pick외 나머지들을 모두 squash하겠다고 입력한 이후에는 esc키 입력후 : w q 키를 차례로 눌러 squash를 반영해준다.

4. confict 발생시 해결

만약 squash 이 후, conflict가 발생을 할 수 도 있다. conflict가 발생하면 당황하지 않고, conflict를 해결해나가면 된다. conflict 이 후, git add (conflict 해결한 파일명) 해주고 git rebase --continue를 입력한다. 여기서 squash 한 commit들이 많을수록 conflict가 지속적으로 발생되는데, 마찬가지로 당황하지않고, 위의 과정을 차례로 밟아나가면서 해결해 주면된다.

5. 마지막 commit 메시지 편집

conflict도 모두 해결했다면, 아마 successfully ~~ 라는 기분좋은 터미널 메시지를 볼 수 있을 것이다.
성공적으로 rebase를 끝마쳤기때문에 하나로 합친 commit 메시지를 git 상에 남길 수 있도록 한다.
squash 와 마찬가지로 i를 입력하여 insert모드로 바꿔준 이후, commit 메시지들을 편집해 주고 : w q 키를 차례로 눌러 반영해 주면 끝이난다.

6. rebase결과 git에 push하기

rebase가 끝이 났다면 git 의 나의 브랜치에 push를 해주면된다.
여기서 conflict를 해결한 경우라면 git에서 거부를 하게되는데 이때는, push 명령어에 -f 를 붙여 강제로 push하면 된다.

profile
Show me the code

2개의 댓글

comment-user-thumbnail
2020년 6월 24일

감사합니다.

1개의 답글