[git] git에서 commit을 분리하는 방법 🚀
개발을 진행하면서 커밋을 할 때 하나의 커밋에는 하나의 기능만 들어가는 것이 좋습니다.
그런데 만약 하나의 커밋에 2개 이상의 기능을 넣고 커밋을 했다면 나중에 에러가 발생했을 때 수정하기가 까다롭기도 하고
기능이 붙어있기 때문에 깔끔하지 않은 느낌을 받을 수 있습니다. 그런 일을 방지하기 위해서 커밋을 분리하는 방법을 알아두면 정말 좋겠죠? ㅎㅎ
그래서 이번 포스팅에서는 rebase 명령어를 사용해서 커밋을 분리하는 방법을 정리하려고 합니다.
위의 commit history를 보면 로그인 UI와 카카오 로그인 기능 추가를 같은 커밋에 넣어서 올린 것을 볼 수 있습니다.
이런 경우 나중에 화면을 수정하거나 로그인 기능을 수정할 때 불편하고 알아보기도 어렵기 때문에 각각의 기능별로 분리하는 것이 바람직합니다.
Interactive rebase는 git rebase -i [commit hash], [HEAD] 와 같이 rebase 명령어에 -i(Interactive) 옵션을 붙여서 사용합니다.
commit의 hashcode나 HEAD 포인터를 이용해서 위치를 지정해주시면 됩니다. 이때 주의할 점은 수정할 커밋의 직전 커밋을 지정해주어야 합니다.
저는 지금 4번 째 커밋을 수정해야 하기 때문에 3번째 커밋을 지정해줘야겠죠 ㅎㅎ?
git rebase -i HEAD~3
위와 같이 작성해주시면 아래처럼 에디터나 터미널에 새로운 화면이 생깁니다.
왼쪽에 파란 글씨로 pick이라고 적혀있는데 commit의 상태를 나타낸다고 생각하시면 됩니다.
저는 맨 위의 커밋을 수정해야하니까 pick 대신에 edit를 써주겠습니다.
파일을 수정 후 저장을 하고 종료하고 터미널로 돌아가 보면 rebase가 진행되는 것을 확인할 수 있습니다.
그리고 분리 작업을 위해 HEAD 포인터가 해당 커밋을 가리키고 있는 걸 볼 수 있습니다.
커밋을 분리하기 위해선 커밋에 있던 작업 파일들을 working directory로 가져와야 합니다.
git reset --mixed 명령어를 이용해서 가져옵니다! (reset은 커밋을 초기화하고 작업 파일들을 되돌려주는 명령어입니다.)
git reset --mixed HEAD~1 (--mixed가 default 옵션이기때문에 생략 가능함)
reset 명령어 실행 후 status 명령어를 통해 작업 상태를 확인해보면 파일들이 working directory로 돌아온 걸 볼 수 있습니다.
(파일명은 빠르게 만드느라 간단하게 해놔서 헷갈릴 수도 있지만 login = 카카오 로그인 기능, login.html = 로그인 UI입니다...)
이제 하나씩 staging area에 추가해서 커밋을 해주면 됩니다!
git add login // staging area에 추가
git commit -m 'Add KaKao LoginService'
=======================================
git add login.html
git commit -m 'Add Login UI'
두 개의 파일을 하나씩 나눠서 커밋을 했습니다.
아래 commit history를 보면 제일 위에 카카오 로그인 커밋과 로그인 UI 커밋이 생긴 게 보이시죠? 커밋 분리가 된 상태입니다!
커밋 수정 작업이 끝나면 rebase를 완료했다는 명령을 줘야 합니다. 아래의 명령어를 통해서요 ㅎㅎ
git rebase --continue // rebase 작업 완료
--continue 옵션으로 rebase를 완료하면 커밋 수정 작업이 완료됩니다! 커밋이 분리돼 있는 게 보이시나요?ㅎㅎ
이렇게 분리를 해놓으니까 더 깔끔하죠? ㅎㅎ Interactive rebase는 정말 유용하니까 꼭 사용법을 잘 알아두시는 걸 추천드립니다!