git이랑 이제 조금 친해졌나 싶었는데 아직 갈 길이 한참 남은 걸 깨달았다. 이번주 위코드 세션에서는 rebase가 무엇인지에 대해 배우게 되었다 ㅋㅋ
이번 주제의 썸네일이 왜 할로윈 호박이나면.. 호박과 관련되기도 하고.. rebase는 할로윈의 밤처럼 으스스하기 때문이다.
rebase란
단어 그대로 기준을 설정한다는 뜻이다. 쪼꼼 바꿔말하면.. 우리가 Git에 commit한 history를 바꿔버릴 수 있는 무시무시한 녀석이다. 그럼 우리는 이 rebase를 이용해 무엇을 하냐…
나의 첫 2주짜리 프로젝트 커밋목록을 한번 살펴보자!
무려 169개의 커밋내역이 있다… 와우! 이제부터는 커밋의 개수가 너무 많지 않게 양을 조절할 것이다!
본격적으로 rebase를 하기 앞서 우리가 해야할 일…
백업
바로 백업이다! 혹시 날릴수도 있으니 미리 백업을 해둔다. 실제로 동기님중에 rebase땜에 파일도 멘탈도 탈탈 털린분이 있다 ㅠㅠ 그냥 복붙해서 다른폴더에 저장해도 좋지만! 우린 개발을 배우는 사람이니까 명령어를 써보자.
cp -rpv adwards-frontend adwards-frontend2
cp -rpv옆에 왼쪽꺼가 현재의 폴더명, 오른쪽이 새로 생성할 폴더명
이 때 경로를 조심해야 한다! 내 폴더가 속하기 바로 전 단계의 경로에서 저걸 실행해야 한다. (나의 경우는 front-end 폴더) 명령어를 입력하면 이렇게 쌍둥이 폴더가 뙇! 생긴다.
오 씐기씐기!! 진짜 똑같은게 새로 생성되었다!!
다시 이동
cd adwards-frontend
다시 원본폴더로 이동 고고!
중간에 tig 깔아주었음
apt-get install tig
tig 명령어 치면 이렇게 다 내역을 볼 수 있음! 나갈땐 아마 q였나? 치면 나갈 수 있다!
gcm
rebase를 하기 전에 우리는 로컬에 있는 master 브랜치를 업데이트 해줘야 한다! 그러기 위해선 쳌아웃을 해준다.
git checkout master
git pull origin master
pull까지 땡겼으면 다시 마스터에서 원래 작업하던 브랜치로 돌아간다. 쳌아웃!
그 전에 git status
명령어를 쳐서 내가 정말로 커밋을 다 끝냈는지 확인한다.
rebase는 push 전 단계에서 하는거기 때문에 commit까진 다 해야한다.
rebase
아기다리 고기다리던 rebase 시간!! 몸과 마음을 가다듬고 정신 집중쓰! 아주 중요한 시간 두 가지 방법이 있다. master에 현재 브랜치를 합치는 방법과 HEAD에서 커밋의 개수만큼 세서 합치는 방법! 난 둘다 해보았다 ㅋㅋ 후자부터 한번 살펴보자.
최근 커밋 리스트 개수 세는 rebase
git rebase -i HEAD~3
난 최근 commit이 3개라서 HEAD~3라고 했음.
명령어를 치면 최근 커밋한 목록이 3개 나온다. 처음에는 전부 pick으로 되어있는데, pick은 하나만 남기고 전부 squash로 바꿔준다. s로 써도 된다. 그래서 내가 할로윈 호박을 썸네일로 했지 ㅋㅋㅋ 하나만 남기고 전부 찌부찌부해서 커밋을 하나로 줄여준다는 의미쓰~!
ctrl+x하면 끝내기다. 그다음에 변경사항을 저장하겠습니까?가 뜨면 y. 그다음 엔터누르고 넘어가면
커밋 메시지는 최종적으로 한 개만 남겨야 함. #을 이용해 필요없는 커밋메시지는 주석처리 하거나 지워준다! 나는 최종 메시지를 seperated components로 남겼다.
이거 한담에 내 branch에서 push하고 pr까지 날리면 성공! 만약에 conflict가 난다면… 아래의 링크를 참조하시오..!
successfully rebased and updated
어쩌구가 뜨면 당신은 성공한 것입니다! 추카추카~
이제 평소와 마찬가지로 push 날리고 Github에서 Pull request 날리면 된다.
그러면 확실히 보일것이다. 커밋 3개였던걸 1개로 줄였다!! 오ㅋㅋㅋㅋ 신기하구먼
인제 또 다른 방법을 소개소개쓰~~
master 브랜치에 직접 접근하는 방식
git rebase -i master feature/ad_upload
저 타이틀이 맞는 말인진 모르겠다.. 아직 아마추어이기 때문이다 나는ㅋㅋㅋ
여튼 git rebase -i를 치고 master와 마스터에 병합할 브랜치명을 순서대로 써준다! 여기서 -i는 interactive하게 처리하겠다는 의미
그럼 아까와 동일한 화면이 뜨고, pick은 하나만 남기고 전부 s로 바꿔주면 끝! 두번째 rebase 도전이라 이번엔 commit을 좀 많이 해봤다 ㅋㅋ
역시나 성공쓰! 사실 이렇게 되기 전에 한번 conflict 나서 당황했던 적이 있다 ㅋㅋㅋ
만약 충돌이 있다면 수정 후 git add .
하고 그담에 git rebase --continue
그냥 터미널에 써진대로 고대로 읽으면서 하면 된다..ㅋㅋ
이렇게 나의 rebase 도전은 성공적으로 끝났다. 아 근데 다른 팀원분과 branch 충돌이 별로 안 일어나서 성공이였는데,,, 나중에 계속 충돌날까봐 벌써 무섭다~~~ 커밋 개수대로 충돌을 처리해야해서 넘나 귀찮은 과정인 것! 그래도 난 개발자니까 꼼꼼하게 커밋을 남기는게 나은것 같아서 앞으로 커밋은 더 많이 할 예정!
이미 Github에 PR을 날린 상태라면?
위의 과정과 마찬가지로 진행하는데 push 하는 과정에서 force push를 해줘야한다.
git push origin -f 브랜치명
이렇게 진행하면 된다!
force push를 하고 github commit 내역을 보면 1개로 줄어있다. 오예!
Reference
- 위코드 rebase 세션