이번시간에서 rebase
를 일부로 충돌을 내고 그 과정에서 어떻게 rebase
가 동작하는지 알아보고 그것을 해결하는 방법에 대해 알아보겠습니다.
그리고 rebase
를 사용할때는 다른사람과 공유하지않은 commit
들에 대해서만 사용해야합니다.
즉 git pull
을 통해 파일을 다운 한 다음에 rebase
를 적절하 시용하고 마지막에 git push
를 하는겁니다. 이제 알아봅시다.
rebase
디렉토리를 재생성하고 저장소로 만들어줍니디.
이후 f1.txt
를 생성해서 add
와 commit
을 해줍니다.
rb
라는 새로운 branch
를 만들어 주고 그곳에서 f1.txt
를 수정한 후에 commit
을 했습니다.
이후 git log --decorate --all --oneline --graph
를 통해 현재 상태를 확인 할 수 있습니다.
다시 master
로 이동하고 f1.txt
의 파일을 수정한 후에 commit
을 하겠습니다.
이후 git log --decorate --all --oneline --graph
를 통해 현재 상태를 확인 할 수 있습니다.
즉 이제 master
와 rb
는 서로 다른 길을 가기 시작했습니다.
그리고 중요한 것은 두 커밋에서 똑같은 부분을 수정했기 떄문에 병합을 하면 충돌이 날 수밖에없다는 것입니다.
rebase
에서 충돌은 많이 복잡하기 때문에 일단 commit
을 좀더 해보겠습니다.
rb
로 이동해준 후에 f1.txt
를 한번더 수정하고 commit
해줍니다.
또 한번더 수정하고 commit
을 하면 아래 화면과 같이 상태가 변하게 됩니다.
즉 rb
는 R1
, R2
, R3
라는 3개의 commit
을 가지고 있고 master
는 M1
을 최신 commit
으로 가지고 있고 현재 전부 같은 부분을 수정했기 때문에 병합을 할 시 필연적으로 충돌이 발생합니다.
이때 git rebase master
가 가지는 의미가 무엇일까요? rb
의 base
는 커밋메세지가 인데 master
의 최신 commit
인 M1
으로 base
를 바꾸겠다는 의미입니다.
그러면 R1
의 commit
은 부모가 이 아니라 M1
이 되고 rb
는 master
가 작업한 내용을 포함하게 됩니다.
그리고 rebase
사용시 R1
과 사이에있는 소스코드의 차이점만 가지고 있는 정보들이 임시저장소에 저장됩니다. 이후 R1
과 R2
, R3
가 저장됩니다.
이후 임시저장소에 보관되어있는 R1
이 M1
과 merge
가 됩니다.
git rebase master
실행시 R1
을 commit_id - 560e016
으로 바꾸는 것에 문제가 생겨 conflict
가 발생하게 됩니다.
f1.txt
파일을 열어보면 rb
에서 수정한 내용과 master
에서 수정한 부분이 같기 때문에 다음과 같이 파일이 변경되게 됩니다.
따라서 저는 다음과 같이 수정해보겠습니다.
수정후에 add
를 하고 git status
실행시 rebase
를 continue
하라고 뜨네요. 즉 정상적으로 수정이 되었다는 뜻입니다.
git rabse --continue
로 병합을 계속 해봅시다.
하지만 다시 병합하는데 실패하였습니다. 일단 R1
과 M1
은 정상적으로 평합이 된것을 확인할 수 있습니다.
오류가 난 이유는 R1
과 R2
또한 똑같은 2번째 줄에서 똑같은 내용을 수정했기 때문에 오류가 발생했습니다.
즉 현재 이런상태인 것이죠
이렇게 수정해보겠습니다.
하지만 또 에러가 발생했습니다. R1
, R2
, M1
까지는 병합이 정상적으로 되었지만 R3
또한 같은 부분이 수정되었기 떄문에 conflict
가 발생했습니다.
이제 이 파일을 수정해봅시다.
이렇게 수정하겠습니다.
드디어 rebase
가 정상적으로 완료되었습니다.
git log --decorate --all --graph --oneline
을 통해 상태를 확인 해줍시다. 현재 rb
는 master
의 모든 commit
내용을 담고있을 뿐만 아니라 rb
가 작업했었던 기존 내용도 담고있고 rb
가 어떤 히스토리를 가지고 있는지 분기점 없이 한 라인으로 깔끔하게 한줄로 보여줍니다.
이것이 바로 rebase
의 핵심적인 가치입니다.
지금까지 rebase
에서 충돌이 발생하는 경우와 그 해결법에 대해 알아보았습니다.
여기까지 하도록 하겠습니다.