- 아래 출처를 참고하여 개인 공부 목적으로 작성한 글입니다.
- 더 자세한 내용은 아래 출처를 참고하시면 됩니다.
- 계속 업데이트할 예정입니다.
목차
- Intro
- rebase 사용하기 (rebase -i)
- 합치거나 편집할 commit 선택
3-1. 합치거나 편집할 commit 선택 시 사용하는 명령어 설명 - 커밋 메시지 수정하기
- 원격 저장소에 강제 push 하기
- rebase 사용 시 주의사항
1. Intro
- 여러 커밋을 합치는 git rebase -i 명령어에 대해 알아보겠습니다.
- 아래처럼 대충쓴 커밋 메시지1~3을 합쳐서 하나의 커밋으로 만들어보겠습니다.
2. rebase 사용하기 (rebase -i)
$ git rebase -i [수정을 시작할 커밋의 이전 커밋]
- 3개의 커밋 메시지를 합쳐줄 것이기 때문에 git rebase -i HEAD~3을 실행합니다.
- 만약에 2개의 커밋 메시지를 합치고 싶다면 ~2를 입력하면 됩니다.
$ git rebase -i HEAD~3
3. 합치거나 편집할 commit 선택
- 위 git rebase 명령어를 수행하면 아래와 같은 vi창이 뜨는데, '대충쓴 커밋 메시지 2, 3'의 pick을 s로 바꿔줍니다.
- s는 squash 처리의 약자입니다.
- 이 때 중요한 점은 이력상 가장 먼저 올린 커밋을 pick하고 나머지 커밋을 s 처리해야 에러가 발생하지 않습니다.
- git rebase -i HEAD~3를 수행한 화면
- 위처럼 화면이 뜨면 아래처럼 적어주고 :wq를 눌러 저장,종료 해줍니다.
- 이 경우 '대충쓴 커밋 메시지2,3'을(s) '대충쓴 커밋 메시지1'로(pick) 합치겠다는 뜻입니다.
3-1. 합치거나 편집할 commit 선택 시 사용하는 명령어 설명
명령어의 종류는 엄청 많지만 우선 제가 이해한 내용만 적었습니다.
- pick
- pick은 해당 커밋을 사용하겠다는 의미이입니다.
- 이를 이용해서 커밋의 순서를 바꿀 수도 있고, 커밋의 해쉬값을 이용해 특정 커밋을 가져올 수도 있습니다.
- squash
- squash 은 해당 커밋을 이전 커밋과 합치는 명령어입니다.
- 위에서 커밋을 합칠 때 이력상 가장 먼저 올린 커밋을 pick하고 나머지 커밋을 s 처리해야 에러가 발생하지 않습니다.라는 말을 했었습니다.
- 그 이유는 squash가 '해당 커밋을 이전 커밋과 합치는 명령어'이기 때문에 가장 먼저 올린 커밋을 squash 처리해버리면, 가장 먼저 올린 커밋 입장에서 자신이 합쳐질 이전 커밋을 찾지 못하므로 오류가 발생합니다.
- reword
- reword는 커밋 메시지를 변경하는 명령어입니다.
4. 커밋 메시지 수정하기
- 그러면 아래처럼 합쳐서 보여줄 커밋 메세지를 수정할 수 있습니다. 원하는 메세지로 변경해서 다시 :wq를 눌러 저장, 종료해줍니다.
- 사용할 메시지는 그대로 두고, 사용하지 않을 메시지는 앞에 #을 붙여 주석처리하거나 지워버리면 됩니다.
5. 원격 저장소에 강제 push 하기
- git repository로 강제 push를 해주면 원격 저장소에 반영이 됩니다.
- 원격 저장소에 push까지 하면 rebase를 통해 여러 커밋을 하나로 합치는 과정이 끝납니다.
$ git push -f origin ${YOUR_BRANCH_NAME}
6. rebase 사용 시 주의사항
- git rebase는 이전의 커밋 히스토리를 변경하기 때문에 항상 주의해서 사용해야 합니다.
- 만약 이미 GitHub과 같은 원격 저장소에 push까지 한 커밋이라면 변경한 커밋들은 원격 저장소에 push되지 않을 것입니다.
- 이 때 git push --force 또는 git push -f 명령어로 강제로 원격 저장소에 커밋 히스토리를 덮어쓸 수도 있습니다.
- 하지만 만약 이전에 push한 커밋들을 다른 개발자들과 공유하고 있었다면 커밋 히스토리의 불일치가 발생해 흔히 말하는 "git이 꼬였다."하는 상황이 발생할 수 있습니다.
- 따라서 협업 시 브랜치를 공유하는 상황에서 git rebase는 가급적이면 지양해야 합니다.
- 혼자서만 작업하는 feature branch에서 커밋을 정리할 때 사용하는 게 좋습니다.