[Git] Git flow와 Git rebase

김상웅·2022년 7월 15일
0

Git Flow


아마 개별로 혹은 팀 단위로 프로젝트를 진행하면서 가장 많이 쓰는 명령어는 다음 다섯가지일 것 같습니다.

git add .

git commit -m "message"

git push origin branch

git pull origin main

git merge main

작업을 하는 feature/... 브랜치에서 merge를 진행하면 보통 main 브랜치로 병합이 되는데요.

배포를 해야하는데 feaure/... 브랜치에서 버그나 오류를 확인하지 않았다면 어떨까요..?😂

이런 문제점을 방지 하기 위해 git merge 이전 단계에 git rebase라는 명령어를 사용합니다.



✅ git rebase


main 브랜치에 merge 하기 전 작업 브랜치의 모든 commit들을 하나의 commit으로 만들고 하나의 PR 묶음으로 바꾼다!!!

📌 명령어 순서

  1. 우선 작업물을 commit 해줍니다.
git add 작업파일

git commit
  1. 새로운 작업물을 다음 명령어로 리베이스해줍니다.
git rebase -i main

다음 명령어를 통해 여러 커밋을 하나로 squash 할 수 있는데요

아래 사진과 같은 에디터 창에서 가장 윗부분 커밋만 남겨두고,
모두 pick → s로 바꿔줍니다.

수정했다면 :wq로 저장 후 종료합니다.

  1. rebase된 commit을 작성해줍니다.

2번 과정을 마치면 새로운 에디터 화면이 나타나는데요

현재까지 작성한 커밋 메시지가 모두 보입니다.

필요한 하나의 메시지만 남겨두고 모두 지워줍니다. 다음과 같이:

수정했다면 :wq로 빠져나와줍니다!

  1. rebase된 커밋 내용을 push 해줍니다.
git push origin "branch-name"

만약 이전에 해당 branch에서 push 한 이력이 남아있다면 다음과 같은 명령어를 볼 수 있을 텐데요.

git은 history가 다른 branch의 push를 허용하지 않습니다.

그렇기 때문에 -f 옵션을 사용하여 force push를 진행해주면 됩니다.

git push origin "branch-name" -f

※ Case By Case

rebase의 sync를 맞추기 위해 pull 명령어 이후에 push하는 경우도 있습니다.


📌 왜 사용할까?

우선 merge 명령어를 사용했을 때 git flow는 다음과 같습니다:

작업 브랜치가 main에 통합되면서 작업 내역이 flow 사이사이에 위치하게 되는데요

작업 내역이 브랜치 구분없이 시간별로 통합되어 작업 이력을 확인하기 어렵고 복잡해 보입니다.

rebase 명령어를 사용했을 때 git flow는 다음과 같습니다:

어떤가요?

가장 아래있는 작업 브랜치가 모두 모여 정리가 되고 있습니다.

브랜치를 모두 통합했을 땐 다음과 같은 그래프를 보실 수 있을 것입니다!

어떤가요?

브랜치별로 커밋 내용이 정리되어 작업 이력을 확인하기 훨씬 용이해진 것 같습니다.


📌 Conflict

conflict 해결 요청

작업 브랜치에서 rebase 명령어를 통해 push를 한 이후 conflict가 발생하는 경우가 있습니다.

당황하지 말고 해당 브랜치로 이동해줍니다!

merge 명령어를 사용할 땐 아래 명령어를 입력할 것입니다:

git merge main

하지만!! 이번엔 rebase 명령어를 사용해보겠습니다:

git rebase -i main

이후 다시 squash하는 에디터가 나타날 것이고, 다시 commit을 줄여주면 됩니다.

그 이후에

code .

명령어로 VS코드 에디터를 열어보면 conflict가 발생한 파일을 확인할 수 있을 것입니다.

conflict를 해결하였다면, 다음 명령어를 사용하여 다시 push를 해주세요.

git add 변경작업파일

아래 명령어 통해 commit별 conflict 해결

git rebase --continue

만약 conflict를 해결할 사항이 더 이상 없으면

rebase가 되고 update가 되었다!

라는 영어 메시지를 볼 수 있을 것입니다.

rebase를 마치고 conflict를 해결하였다면 다시 push를 진행해주면 됩니다.

profile
누구나 이해할 수 있도록

0개의 댓글