Git Rebase

윤남주·2022년 2월 20일
0

wecode archive

목록 보기
13/13
post-thumbnail

Git Rebase

Git merge

Main 기준으로 브랜치들이 생기고 작업을 함
→ 한 브랜치를 머지를 하면 Main에 모든 커밋들이 머지됨 + Merge Commit이 생겨남
→ 다른 브랜치를 머지하려면 새 Main을 일단 pull 해야함
→ 그러면 다른 브랜치의 커밋 + 다른 브랜치의 머지커밋 + 내 커밋 + 내 머지커밋 들이 main에 머지됨

🚨 커밋이 너무 많고 복잡해 특정 커밋으로 돌리기가 어려움 (rollback을 빨리하기 쉽지 않음)


Git rebase

→ merge를 완전히 대체함. 머지와 똑같이 브랜치를 합치는 액션.
➕ 불필요한 merge commit이 생기지 않음
➕ 같은 작업을 진행한 commit끼리 모음 (커밋 시점으로 정렬되는 것이 아니고, rebase를 한 순서로 브랜치끼리 뭉쳐있음)

Main에서 브랜치를 만들면 그 브랜치는 base가 Main의 마지막 커밋이 됨
→ sign-up 브랜치가 rebase 된 순간 계속 작업하고 있는 sign-in의 base가 바뀌게 됨 = RE-BASE
→ 그러면 같은 작업끼리 모아질 수 있음!


Squash

: 커밋들을 grouping하는 것

Main에 rebase를 하면 squash가 되어 커밋이 하나가 됨
→ ✨롤백하기 엄청 좋음 (커밋이 하나밖에 없으니까)


Rebase 시 충돌

코드가 사라진 것 처럼 보일 수 있음
rebase로 하면 커밋 하나하나에 다 충돌이 일어날 수 있음

💖 Rule
1. rebase 하기 전까지 커밋을 4개 이상 하지 마라 → 커밋 2-3개 쌓이면 rebase
2. 메인이 업데이트 안되었어도 2-3개 정도 되면 squash 용도라도 rebase를 해줘라
3. 커밋들은 제일 오래된거만 pick으로 두고 나머지 아래것들은 다 s로 둬라
4. 문제 생기면 abort하고 추스르고 다시 해라

실제 Rebase 실행

개발이 다 끝났으면 Local Main가서 최신화를 시키고 push를 해야함
→ 보통은 merge를 했겠지만 이제는 rebase를 함!

  1. 내 브랜치명 에 위치한 상태에서 git rebase -i main 진행
    (-i = interactive = interactive shell이 열림)

  2. 커밋들이 나옴

  3. squash : 기준이 되는 커밋을 정하고 나머지들을 다 녹여버리면 됨

  4. 맨 위에 있는 커밋이 제일 오래된 커밋 → 1을 pick하고 2,3은 s (=squash)로 바꿔주면 됨

  5. esc → :wq로 나가기

  1. rebase + squash를 한 결과 최종 커밋 메시지를 다시 씀 (멀티라인 사용하는게 좋음)

    • vim 명령어 : shift+v 로 전체줄 선택, j로 선택 아래로 내림, d로 제거
  2. Rebase는 커밋을 조작하는 것 = 이를 푸쉬했을 때 github에서 막음!

  3. 그래서 force push를 해야함 : -f

🚨 Rebase 중 충돌 해결하기

충돌이 나는 경우 sqash를 하고 나가면 바로 충돌 뜸
conflict가 난 파일이름 적혀있음 + vscode에서 git source tree 가면 맨 위에 충돌난 애들만 보여줌

  1. 각 파일 열기 → 충돌 해결

  2. git add .

  3. commit 안하고 바로 rebase로 넘어감 (git rebase --continue) (지금 아직 rebase 중인 것임)

  4. 계속 컨플리트 뜨면 계속 이 과정 반복 해야함

🔥 뭔가 잘못된 것 같으면 git rebase --abort를 하면 rebase 시작하기 전으로 바로 돌아갈 수 있음 → 정신을 좀 추수르고 어느 시점인지 확인 하고 멘토한테 옆에서 봐달라 하고 다시 rebase

profile
Dig a little deeper

0개의 댓글