특정 branch가 역할들을 모두 구현하여
다른 branch와 합치려면 어떻게 해야 할까?
브랜치를 합치는 방법으로는 Merge와 Rebase가 존재한다.
1. Merge (병합)
두 개의 branch를 서로 이어 붙이는데 그 과정에서 합쳐진 커밋이 하나 생기게 된다.
main 브랜치에 초록 브랜치의 내용들을 모두 적용한 다음 커밋을 하는 느낌이다.
그러다 보니 기존 브랜치의 흔적이 남아있게 된다.
merge를 이용해서 브랜치 합치기 (main 브랜치에 develop 브랜치를 합친다.)
1. 합쳐져야 할 브랜치로 이동을 한다.
git switch main
2. 현재 위치한 브랜치로 합칠 브랜치를 merge 한다.
git merge (브랜치 이름)
git merge develop
3. 병합(merge)할 때 커밋 메시지 적용하기
git merge (브랜치 이름) -m "커밋 메시지"
+ merge도 결과적으로 commit이 되는 것이라 reset으로 다시 되돌릴 수 있다.
+ 합치고 나면 develop 브랜치는 필요가 없어져서 삭제를 해도 된다.
2.Rebase
branch를 그대로 가져와서 대상 branch에 옮겨서 붙여 넣는다.
그러다 보니 기존 브랜치의 흔적이 없어지게 된다.
rebase를 이용해서 브랜치 합치기 (main 브랜치에 develop 브랜치를 합친다.)
1. merge와 반대로 가져올 브랜치로 이동을 한다.
git switch develop
2. 현재 위치한 브랜치를 합칠 대상의 브랜치에 rebase 한다.
git rebase (브랜치 이름)
git rebase main
+ 그러면 아래의 그림처럼 develop은 가장 최신의 커밋에 위치하고 main은 가만히 있다.
그래서 main의 위치를 develop과 같이 최신으로 이동시켜 준다.
git merge develop
그러면 develop은 merge때와 같이 더 이상 필요가 없어져서 삭제해 주면 된다.
브랜치 병합(merge) 시 충돌 발생
--
만약 합치려는 두 브랜치가 서로 같은 파일에 같은 요소의 값이 다르다면
합칠 때 두 값 중에서 최종적으로 어떠한 값을 결정하지 못하기 때문에 충돌이 생긴다.
이때 개발자가 직접 최종 값을 결정해줘야 한다.
<<<<<<< HEAD
name: gildong
=======
name: jin
>>>>>>> 브랜치 명
충돌이 일어나면 위와 같은 형태로 충돌이 일어난 파일에 코드가 변경된다.
(위 name은 최종으로 합칠 브랜치의 값, 아래 name은 최종 브랜치로 합치려는 브랜치의 값)
- 충돌이 일어난 모든 값을 수정
- git add .
- git commit
만약 당장 충돌 해결이 어려운 경우 합치기 전으로 돌아가는 명령어
git merge --abort
--
브랜치 rebase시 충돌 발생
--
merge같은 경우는 모든 내용을 한 번에 병합하는 것으로 충돌 해결 또한 한 번에 해결이 가능하지만
rebase는 커밋을 하나 하나 차례로 옮겨가며 합치기 때문에 옮기는 커밋마다 충돌 과정을 차례로 해결해야 한다.
그래서 merge 충돌과 다르게
각 단계별로 코드 수정 후 add . 다음 충돌 이동 후 다시 코드 수정 후 add . 반복한 뒤에 마지막에 commit을 해야 한다.
측 여러 커밋을 합칠 때 커밋을 순서대로 합치기 때문에
충돌 또한 한 번에 발생하는 것이 아니라 순서대로 충돌이 일어나게 된다.
그래서 첫 충돌이 발생하면 해당 충돌을 해결 후 add .로 저장하고
rebase --continue로 다음 충돌로 이동한 뒤에 다시 코드를 수정 후 add .를 반복한 뒤에 마지막에 commit을 한다.
다음 충돌로 이동하는 명령어
git rebase --continue
rebase 후 충돌
- 첫 커밋의 합치기에서 충돌이 발생한 파일로 이동하여 값 수정
- git add .
- git rebase --continue로 다음 커밋의 합치기에서 충돌이 발생한 파일로 이동하여 값 수정
- git add .
- 반복
- git commit
rebase의 충돌을 나중에 해결하고 다시 rebase 전으로 돌아가는 명령어
git rebase --abort
--
참고 및 출처
'Git & GitHub' 카테고리의 다른 글
로컬 저장소와 GitHub 원격 저장소 연결 및 업로드하기 (0) | 2024.01.10 |
---|---|
Vi모드에서 자주 사용하는 명령어 (0) | 2024.01.10 |
branch 생성, 이동, 조회, 수정, 삭제하는 명령어 (0) | 2023.12.18 |
git으로 관리하고 있는 프로젝트 내용을 commit하기 (0) | 2023.12.18 |
이전 버전(commit)으로 되돌리기 (reset, revert) (0) | 2023.12.10 |