git의 세계에서 시간여행을 하는 히치하이커를 위한 안내서
위 사진을 보면 rebase가 뭔지 감이 옵니다.
내 branch를 맨 뒤로 보내 마스터 브랜치의 이력을 더 깔끔하게 관리할 수 있습니다!!
또한 불필요한 commit들을 하나로 squash해 푸쉬하여 더 깔끔하게 이력을 관리할 수 있습니다!!!
git pull origin master
로컬 마스터브랜치를 최신으로 업데이트합니다.
git checkout 브랜치명
내가 작업하던 브랜치로 다시 돌아옵니다.
git rebase -i master
master브랜치를 기준으로 rebase를 진행하겠다는 뜻입니다.
-i
를 입력하면 좀 더 interactive하게 rebase를 할 수 있다고 합니다.
이렇게 하면 command:~~ 하고 commit들이 쫘라락 뜹니다.
이미지 출처: https://linuxhint.com/squash-all-commits-git/
위 이미지를 예시로 설명하겠습니다.
맨 위의 pick 옆에 써있는 번호가 commit의 고유번호입니다. 그 옆은 commit할때 적었던 텍스트 내용.
pick 7d1c5d692 ci: run codeql
원하는 commit 하나만 pick으로 냅두고 나머지는 pick을 squash라고 바꿔줍니다. s라고만 입력해도 됩니다.
squash 7d1c5d692 ci: run codeql
i
를 누르면 insert모드 진입!!!!!! esc
를 눌러 insert모드 빠져나오기!!:wq!
를 입력해 다시 원래화면으로 돌아오기!!!!!!하지만 만약에 conflict가 나면???ㅎㅎㅎㅎㅎㅎㅎ
conflict를 모두 수정해줘야 합니다!ㅋㅎㅋㅎㅋㅎㅋㅎ
그나마 친절하게 어디서 conflict가 났는지 알려주니 다 가서 수정하기!
수정 다 하면 git add .
입력해 추가해주기.
git rebase --continue
를 입력하면 다음으로 넘어갑니다.
더이상 conflict가 없으면 rebase가 종료됩니다.
하지만 만약에 모든 commits에 전부 conflict가 났으면!?!?!?ㅋㅋㅋㅎㅎㅎㅎㅎㅎ
거기서도 컨플릭트를 해결해줘야 합니다~!^^ㅎㅎㅎ
4번을 무한반복 하시면 됩니다!!
이미지 출처: https://talis.github.io/images/topics/squash/squash_example_004.png
이것도 예시 사진을 가지고 설명하겠습니다.
모든 컨플릭트를 다 해결하면 마지막으로 commit 메세지를 편집할 수 있는 화면에 진입합니다. 여기까지 왔으면 다 끝난거~!!
원하는 커밋메세지 하나만 남기고 나머지는 전부 삭제해줍니다.
만약에 STORY-002 Modifications WIP라는 커밋메세지만 남기고 싶다면?
1,3,4번의 커밋메세지를 삭제해주시면 됩니다!
만약에 모든 commit 메세지가 다 맘에 안든다면?
the first commit message is:
아래에 원하는 텍스트를 입력 후 종료합니다.
git push origin 내브랜치명
푸쉬를 해줍니다...ㅠㅠ 이렇게 하면 정말 rebase가 끝났습니다 ㅠㅠㅠ
여기까지 오느라 고생하셨습니다 ㅠㅠ
이제 당신도 시간여행자!!!👍👍
git rebase --abort
rebase 중단하기!
git push origin 내브랜치명 -f
만약 이미 푸쉬를 한 상태에서 rebase를 하고 싶다면?
1번~7번까지의 프로세스를 그대로 한 후 마지막에 push 명령어 끝에 -f를 붙여 강제로 내 브랜치에 푸쉬를 해줘야 기존내역을 덮어쓰기하고 새로 rebase된 commit이 올라갑니다!
그래서 시간여행은 안하셨습니까?!ㅋ