팀 프로젝트를 하면서 깃(git)을 많이 사용해서 많이 익숙해 지게 되었다.
팀끼리 초기설정을하고 생성된 레포에 올린 후 나머지 팀원은 클론을 받아서 쉽게 작업을 할수 있는 깃은 개발자에게 날개를 달아주는 것 같다.
깃(git)의 작업 흐름은 앞서 말한것처럼 간단하지만 강력하다.
팀끼리 작업할때 필수라고 생각이 든다.
우선 한명의 컴퓨터에서 초기설정을 하게 된다. 설치해야 할것, 사용할 폴더 들을 정한뒤에 깃을 이용해서 생성해둔 레포에 pull하게 된다.
초기세팅을 마치고 나머지 팀원들은 깃 클론 혹은 push를 받아서 설정을 맞추고 개인 브랜치를 생성하여 작업을 진행하게 된다.
진행하면서 git add, git commit , git push 과정을 통해 깃에 작업상황을 저장하게 되는데 이를 통해서 저장된 히스토리를 찾아서 과거로 이동할수도 있다. 모든 작업을 마치게 되면 merge를 이용하여 작업들을 하나로 합치는 과정을 겪는다. 하나의 브랜치에서 작업이 완료되고 수정사항이 없다면 브랜치 끼리 우선 merge도 가능하다.
1차 프로젝트 까지 merge를 이용했다. merge 를 하면서 충돌도 생기고, 충돌을 수정하면서 merge가 대단하기도 하고 두렵기도 하였는데 이번 2차 프로젝트때 rebase에 대해서 배우게 되었다.
merge를 이용하면 merge 커밋이 생긴다. 커밋을 할수록 커밋이 계속 쌓이기도 하고 불필요한 작업과 복잡한 history를 방지하기위해서 rebase 작업을 하게 된다.
rebase는 merge 커밋도 안생겨서 불필요함을 제거 시키고 커밋도 하나로 합칠수 있어서 복잡한것도 방지할수 있다.
rebase는 말 그대로 base 를 재 지정하는 과정이다.
브랜치를 merge 하게 되면 다른 팀원이 커밋한 모든 커밋들도 모두 딸려와서 합쳐지게 된다. 그러면 복잡해 지지만 rebase 를 이용하면 커밋을 하나로 관리하고 베이스를 재 지정하여서 불필요하고 복잡한 과정들이 생략된다.
이런 강력한 기능을 가지고 있지만 문제점도 가지고 있다.
커밋마다 충돌 문제가 발생할수 있다는 것이다. 만약 20개의 커밋을 하나로 합치게 되면 충돌이 발생할수가 있는데 이게 커밋마다 충돌이 발생해서 20개 충돌이 발생할수 있다. 물론 충돌을 해결할수 있지만 복잡하고 이것 또한 일이 될수 있기에 바로바로 rebase를 하는 것이 권장된다.
최신화를 무조건 해줘야 한다. (local 메인 업데이트)
master로 checkout 해주고
git pull origin master 를 해준다.
push할 브렌치로 다시 이동을 해서 아래 명령어를 입력한다.
git rebase -i main
(내 메인을 새로운 거점으로 변경시킨다는 뜻이다 )
그러면 새로운 편집기가 등장하고 자신이 과거에 커밋한 내용들이 등장한다.
i를 눌러 인서트 모드로 진입해준다.
맨위에 첫번째 값을 p로 변경해주고 나머지를 S로 변경해준다.
앞에 값들만 변경해주고 나머지는 수정하지 않는다.
#으로 된것은 주석처리가 된것이다.
수정이 완료가 되었다면 esc를 누르고 :wq을 눌러 저장하고 나간다.
그리고 새로운 커밋메시지를 입력해준다. 통합 커밋 메시지 이다.
작성이 완료 되었다면 다시 esc를 누르고 :wq 를 눌러서 저장하고 나간다.
push를 진행해준다.
오류가 발생하지 않았다면 정상적으로 완료가 된것이다. 하지만 만일 오류가 발생한다면 아래 명령어를 쳐야한다.
rebase후 push가 거절된 경우.. history가 달라지기 때문이다. (새로운 거점)
그럴 경우 강제 푸시로 해결하는데 무작정 강제 푸시를 하는 것은 좋은 방법이 아니다. 이후의 값들이 사라질수 있기 때문에 몇번 고려해보고 상관없다면 아래 명령어를 쳐서 강제 푸시를 시도해준다.
강제 푸시 : git push origin 브랜치이름 -f
이러면 rebase 과정이 끝난다.
만일 충돌이 나게 될경우
1 충돌을 해결하고 git add . 를 친다
2. git rebase -- continue를 하고 리베이스를 계속 진행해준다.
참고로
git rebase --abort 로 rebase를 진행전으로 돌아갈수 있다.
오늘도 git에대해서 우리는 한걸음 나갈수 있었다.
멋지고 훌륭하게 git을 사용하길 바란다.