Main 기준으로 브랜치들이 생기고 작업을 함
→ 한 브랜치를 머지를 하면 Main에 모든 커밋들이 머지됨 + Merge Commit
이 생겨남
→ 다른 브랜치를 머지하려면 새 Main을 일단 pull 해야함
→ 그러면 다른 브랜치의 커밋 + 다른 브랜치의 머지커밋 + 내 커밋 + 내 머지커밋 들이 main에 머지됨
🚨 커밋이 너무 많고 복잡해 특정 커밋으로 돌리기가 어려움 (rollback을 빨리하기 쉽지 않음)
→ merge를 완전히 대체함. 머지와 똑같이 브랜치를 합치는 액션.
➕ 불필요한 merge commit이 생기지 않음
➕ 같은 작업을 진행한 commit끼리 모음 (커밋 시점으로 정렬되는 것이 아니고, rebase를 한 순서로 브랜치끼리 뭉쳐있음)
Main에서 브랜치를 만들면 그 브랜치는 base가 Main의 마지막 커밋이 됨
→ sign-up 브랜치가 rebase 된 순간 계속 작업하고 있는 sign-in의 base가 바뀌게 됨 = RE-BASE
→ 그러면 같은 작업끼리 모아질 수 있음!
: 커밋들을 grouping하는 것
Main에 rebase를 하면 squash가 되어 커밋이 하나가 됨
→ ✨롤백하기 엄청 좋음 (커밋이 하나밖에 없으니까)
코드가 사라진 것 처럼 보일 수 있음
rebase로 하면 커밋 하나하나에 다 충돌이 일어날 수 있음
💖 Rule
1. rebase 하기 전까지 커밋을 4개 이상 하지 마라 → 커밋 2-3개 쌓이면 rebase
2. 메인이 업데이트 안되었어도 2-3개 정도 되면 squash 용도라도 rebase를 해줘라
3. 커밋들은 제일 오래된거만 pick으로 두고 나머지 아래것들은 다 s로 둬라
4. 문제 생기면 abort하고 추스르고 다시 해라
개발이 다 끝났으면 Local Main가서 최신화를 시키고 push를 해야함
→ 보통은 merge를 했겠지만 이제는 rebase를 함!
내 브랜치명
에 위치한 상태에서 git rebase -i main
진행
(-i = interactive = interactive shell이 열림)
커밋들이 나옴
squash : 기준이 되는 커밋을 정하고 나머지들을 다 녹여버리면 됨
맨 위에 있는 커밋이 제일 오래된 커밋 → 1을 pick
하고 2,3은 s
(=squash)로 바꿔주면 됨
esc → :wq로 나가기
rebase + squash를 한 결과 최종 커밋 메시지를 다시 씀 (멀티라인 사용하는게 좋음)
Rebase는 커밋을 조작하는 것 = 이를 푸쉬했을 때 github에서 막음!
그래서 force push를 해야함 : -f
충돌이 나는 경우 sqash를 하고 나가면 바로 충돌 뜸
conflict가 난 파일이름 적혀있음 + vscode에서 git source tree 가면 맨 위에 충돌난 애들만 보여줌
각 파일 열기 → 충돌 해결
git add .
commit 안하고 바로 rebase로 넘어감 (git rebase --continue
) (지금 아직 rebase 중인 것임)
계속 컨플리트 뜨면 계속 이 과정 반복 해야함
🔥 뭔가 잘못된 것 같으면 git rebase --abort를 하면 rebase 시작하기 전으로 바로 돌아갈 수 있음 → 정신을 좀 추수르고 어느 시점인지 확인 하고 멘토한테 옆에서 봐달라 하고 다시 rebase