이제 앞서 설명한 rebase 기능을 실제 우리의 실습 repository에서 적용해 보도록 하겠습니다. 우선 이번 실습 역시 NEWBIE의 입장에서 진행된다는 것을 생각해 주세요.
아래의 히스토리 그래프를 보면, NEWBIE의 [선물하기 기능 추가]라는 커밋의 베이스 커밋은 [즐겨찾기 기능 추가] 커밋임을 알 수 있습니다. 우리의 목적은 NEWBIE의 [선물하기 기능 추가] 커밋을 떼어내서 이 커밋의 베이스 커밋을 [개발자 NEWBIE 추가] 커밋으로 바꿔치기하는 것입니다.
우선, 현재 상태에서 우리가 베이스로 고치려고 하는 대상의 커밋 - 즉 [개발자 NEWBIE 추가] 커밋을 우클릭하고 "재배치(rebase)"를 클릭합니다.
자신의 현재 커밋인 [선물하기 기능 추가]를 rebase 하겠냐는 질문입니다. 참고로, rebase를 실행하는데 있어서 가장 중요한 전제조건은 자신이 떼어내서 조작하고자 하는 브랜치를 혼자만 사용하고 있어야 한다는 점입니다. 다른 사람이 이 커밋을 따로 푸시한다거나 수정하면 꼬여버리기 때문이죠. 여기서는 NEWBIE의 브랜치를 혼자만 사용한다고 가정하고 있습니다. 일단 [확인]을 클릭하겠습니다.
그럼 위와 같이 충돌 병합 경고 팝업이 출력됩니다. 예상했다시피 [선물하기 기능 추가] 커밋은 [포인트 지급 기능 추가] 커밋과 충돌하기 때문이지요. 일단 [닫기]를 클릭합니다.
그럼 아래의 그림과 같이 히스토리가 생겨났습니다.
여기서부터는 기존에 처리해 봤던 충돌 처리와 동일합니다. NEWBIE의 로컬 저장소로 이동하여, 충돌이 난 [favorite.md] 파일을 수정해 보겠습니다.
이제 소스트리로 돌아가서, 충돌했던 [favorite.md]를 스테이지에 올려둡니다. 상단에 커밋(1)이 출력되지만, 현 상태에서는 일단 [액션] 메뉴의 [재배치 계속]을 클릭합니다.
리베이스가 성공하게 되면, 아래와 같은 상태가 됩니다.
NEWBIE의 [선물하기 기능 추가] 커밋이 원본 저장소(upstream)의 [개발자 NEWBIE 추가] 커밋을 베이스로 하는 커밋으로 바뀌었습니다. 그러나 여기서 주의할 점 하나, NEWBIE의 로컬 [master] 브랜치는 적용되었지만 [origin/master]는 여전히 [선물하기 기능 추가] 커밋이 [즐겨찾기 기능 추가]를 베이스로 하고 있습니다.
그럼 원격 저장소에도 반영을 하기 위해서 push를 진행해야겠죠? 단, 주의해야 할 사항이 있습니다. 다시 말하지만 리베이스는 이력 조작이기 때문에 다른 개발자는 이 변경사항에 손을 대고 있으면 안 됩니다. 또한, 이련 경우에는 단순 push로는 반영이 되지 않습니다(일반적이지 않은 이력 조작이므로). "강제 푸시"를 사용해야만 합니다. 이제 [도구] > [옵션]으로 들어가 [Git] 탭으로 이동합니다.
해당 옵션 메뉴에서 [강제 푸시 가능] > [안전한 강제 푸시 사용 (--foce-with-lease)]를 모두 체크해주고 [확인]을 클릭합니다.
이제 [push]를 클릭해 진행해 보겠습니다. [강제 푸시] 옵션을 체크해 줍니다. 참고로 지금 푸시가 진행되는 원본 저장소는 NEWBIE의 원본 저장소입니다. 경고창이 뜨더라도 진행합니다.
자! 이제 그래프를 볼까요? NEWBIE의 원격 저장소에서는 이제 앞의 그래프는 찾아볼 수 없고, upstream(원본 저장소)의 [개발자 NEWBIE 추가] 커밋 다음에 이어서 [선물하기 기능 추가] 커밋을 만든 것으로 되었습니다. 앞서 충돌이나 이런 히스토리는 없어진 것이죠. 이제, 이 상태에서 원본 저장소에 풀 리퀘스트를 보내고 병합을 진행하면 됩니다.
NEWBIE의 github 웹 페이지로 들어가 보겠습니다. 우리가 익히 진행해온 풀 리퀘스트를 하면 됩니다.
이제 ME의 계정으로 github 페이지를 들어가 봅시다. NEWBIE가 보낸 풀 리퀘스트가 도착해 있습니다. 이를 병합까지 진행해 봅시다.
그리고 이제 소스트리의 ME 원본 저장소로 돌아가 볼까요?
원본 저장소 웹 상에서는 병합이 반영되었습니다. 그러나 ME의 로컬에는 아직 반영이 안 되었죠? 여기서 [Pull]을 진행하면, ME의 로컬에 있던 [favorite.md]에도 변경 사항이 반영되고 그래프도 완료됩니다.
'Project Management > Git & Github' 카테고리의 다른 글
[Chapter 5] Case Study(2) - amend : 커밋 수정하기 (0) | 2023.04.17 |
---|---|
[Chapter 5] Case Study(1) - 신규 repository 생성 (0) | 2023.04.10 |
[Chapter 4] 복수의 repository로 협업(2) - rebase 3 (0) | 2023.04.04 |
[Chapter 4] 복수의 repository로 협업(2) - rebase 2 (0) | 2023.04.01 |
[Chapter 4] 복수의 repository로 협업(2) - rebase 1 (0) | 2023.03.30 |