Git에서 한 브랜치에서 다른 브랜치로 합치는 방법은 Merge와 Rebase 다.
Merge와 Rebase의 실행결과는 같지만 커밋 히스토리가 달라진다는 차이점이 있다.
00. merge 란 ?
merge는 각 분기된 커밋을 하나의 커밋으로 다시 합치고 싶을 때 사용하는 git 명령어 이다.
01. rebase 란 ?
merge와 비슷하게, 하나의 브랜치에서 다른 브랜치로 변경 사항을 통합하도록 설계한 것이다.
즉, rebase는 말 그대로 (re-base)로 베이스를 재배치(다시 정의)하는 것을 의미한다.
02. 왜 rebase 를 사용할까 ? => 깔 끔 함
기준을 재지정하는 것의 주요 이점은 히스토리를 더 명확하게 얻을 수 있다는 것이다.
즉, rebase를 사용한다면, git 병합에서 필요로 하는 불필요한 병합 커밋을 제거해주기 때문이다.
merge를 사용하면 git 히스토리를 볼 때, 뿌리가 여러 개로 나눠져 있어서 히스토리를 찾아갈 때 보기가 복잡하고 어렵다는 단점이 있다.
반면에, rebase는 베이스를 다시 정의함으로써, 새롭게 커밋 라인을 정리하여 히스토리를 깔끔하게 볼 수 있게 해준다.
∴ 즉, Merge는 쉽고 안전하지만 커밋히스토리가 지저분할 수 있는 반면, Rebase는 잘 모르고 사용할 경우 위험할 수 있어 까다롭지만 커밋히스토리를 깔끔하게 관리할 수 있다.
merge를 사용하면 모든 commit 을 남기게 되지만, rebase를 사용하면 필요 없는 commit을 생략하기 때문에 master의 commit은 항상 깔끔하다.
03. merge 와 rebase 의 차이 ?
feature/byul 라는 branch를 만들어서 작업한 후, master에 merge를 사용해서 병합한다면, feature/byul에서 기록한 모든 commit이 master의 commit으로 기록된다.
반면에, rebase 방식을 사용해서 병합하면, 작업을 하면서 남겼던 commit 중 불필요한 것들은 생략시키고 필요한 commit만 남겨서 master에 병합하기 때문에 master의 commit은 항상 오른쪽 그림처럼 깔끔하게 관리된다.
같은 병합이지만, 나중에 master의 commit을 볼 때 깔끔하게 볼 수 있어서 여러 명이 협업할 때 rebase를 사용하는 것이 유용하다.
(참고 : WIP는 "Work In Progress" 의 약자로 작업중이라는 뜻이다. 커밋은 남겨야겠고, 딱히 쓸 말 없을 때 사용)
04. rebase 하는 방법 ?
master(혹은 main) 브랜치로 우선 이동하기
↓
pull 하기 ! => git pull origin master(혹은 main)
↓
rebase할 브랜치로 다시 이동해주기 !! => git checkout feature/브랜치
↓
rebase 하기 !! => git rebase -i master(혹은 main)
↓
가장 오래된 commit을 pick한다. (다른 commit의 작업내역이 사라지는 것은 아님)
즉, 맨 위 빼고, pick을 s로 바꿔준 후 ESC누르고 :wq 누른 후 엔터 (창 빠져나오기)
↓
현재까지 적은 commit 내역이 모두 나온다.
불필요한 내용을 모두 지우고, 현재 수정 내역에 대한 commit 메시지를 적는다.
ESC누르고 :wq누른 후 엔터 (창 빠져나오기)
↓
성공적으로 rebase 됬다는 메시지가 보이면 => git push origin feature/브랜치이름 -f
강제로 push해야 push가 된다. (-f : 강제의 의미)
※ rebase abort : 리베이스 취소를 의미함.
05. rebase 중 충돌 해결하기
- 충돌이 일어난 경우, rebase가 진행되지도, 끝나지도 않고 도중에 멈춰 있게 된다.
- 터미널이 rebase가 진행중임을 알려주니 겁먹을 필욘 없다.
- 충돌은 충돌일 뿐, 해당하는 코드를 수정 후에 아래와 같이 입력한다.
- git add .
- Git commit은 하지 않는다. ( 수정 사항이 없으니까 )
- git rebase --continue를 진행한다.
- 멈춰 있던 리베이스가 진행된다.
- 충돌이 여러 번 나면 그 때마다 충돌을 해결하고 git add . / git rebase --continue를 반복한다.
- 계속 해결이 안된다면, git rebase --abort로 아예 rebase를 진행하기 전 상황으로 돌아갈 수도 있다.
'wecode [TIL]' 카테고리의 다른 글
[TIL] Git & Git-hub ( 2탄 ) (0) | 2022.02.26 |
---|---|
[TIL] Git & GitHub ( 1탄 ) (0) | 2022.02.26 |
[TIL] Wecode 중간고사 (JavaScript) (0) | 2022.02.13 |
[TIL] H.T.T.P (Hyper-Text Transfer Protocol) (0) | 2022.02.13 |
Westagram Login-page (HTML & CSS & JavaScript) (0) | 2022.02.12 |
댓글