본문 바로가기
Git/Rebase

여러 커밋(commit) 하나로 합치기

by BAYABA 2021. 10. 10.
  1. 아래 출처를 참고하여 개인 공부 목적으로 작성한 글입니다.
  • 더 자세한 내용은 아래 출처를 참고하시면 됩니다.
  1. 계속 업데이트할 예정입니다.

목차

  1. Intro
  2. rebase 사용하기 (rebase -i)
  3. 합치거나 편집할 commit 선택
    3-1. 합치거나 편집할 commit 선택 시 사용하는 명령어 설명
  4. 커밋 메시지 수정하기
  5. 원격 저장소에 강제 push 하기
  6. rebase 사용 시 주의사항

1. Intro

  1. 여러 커밋을 합치는 git rebase -i 명령어에 대해 알아보겠습니다.
  • 아래처럼 대충쓴 커밋 메시지1~3을 합쳐서 하나의 커밋으로 만들어보겠습니다.


2. rebase 사용하기 (rebase -i)

$ git rebase -i [수정을 시작할 커밋의 이전 커밋]

  1. 3개의 커밋 메시지를 합쳐줄 것이기 때문에 git rebase -i HEAD~3을 실행합니다.
  • 만약에 2개의 커밋 메시지를 합치고 싶다면 ~2를 입력하면 됩니다.
$ git rebase -i HEAD~3 

3. 합치거나 편집할 commit 선택

  1. 위 git rebase 명령어를 수행하면 아래와 같은 vi창이 뜨는데, '대충쓴 커밋 메시지 2, 3'의 pick을 s로 바꿔줍니다.
  • s는 squash 처리의 약자입니다.
  • 이 때 중요한 점은 이력상 가장 먼저 올린 커밋을 pick하고 나머지 커밋을 s 처리해야 에러가 발생하지 않습니다.
  • git rebase -i HEAD~3를 수행한 화면

  1. 위처럼 화면이 뜨면 아래처럼 적어주고 :wq를 눌러 저장,종료 해줍니다.
  • 이 경우 '대충쓴 커밋 메시지2,3'을(s) '대충쓴 커밋 메시지1'로(pick) 합치겠다는 뜻입니다.


3-1. 합치거나 편집할 commit 선택 시 사용하는 명령어 설명

명령어의 종류는 엄청 많지만 우선 제가 이해한 내용만 적었습니다.

  1. pick
  • pick은 해당 커밋을 사용하겠다는 의미이입니다.
  • 이를 이용해서 커밋의 순서를 바꿀 수도 있고, 커밋의 해쉬값을 이용해 특정 커밋을 가져올 수도 있습니다.
  1. squash
  • squash 은 해당 커밋을 이전 커밋과 합치는 명령어입니다.
  • 위에서 커밋을 합칠 때 이력상 가장 먼저 올린 커밋을 pick하고 나머지 커밋을 s 처리해야 에러가 발생하지 않습니다.라는 말을 했었습니다.
  • 그 이유는 squash가 '해당 커밋을 이전 커밋과 합치는 명령어'이기 때문에 가장 먼저 올린 커밋을 squash 처리해버리면, 가장 먼저 올린 커밋 입장에서 자신이 합쳐질 이전 커밋을 찾지 못하므로 오류가 발생합니다.
  1. reword
  • reword는 커밋 메시지를 변경하는 명령어입니다.

4. 커밋 메시지 수정하기

  1. 그러면 아래처럼 합쳐서 보여줄 커밋 메세지를 수정할 수 있습니다. 원하는 메세지로 변경해서 다시 :wq를 눌러 저장, 종료해줍니다.
  • 사용할 메시지는 그대로 두고, 사용하지 않을 메시지는 앞에 #을 붙여 주석처리하거나 지워버리면 됩니다.


5. 원격 저장소에 강제 push 하기

  1. git repository로 강제 push를 해주면 원격 저장소에 반영이 됩니다.
  • 원격 저장소에 push까지 하면 rebase를 통해 여러 커밋을 하나로 합치는 과정이 끝납니다.
$ git push -f origin ${YOUR_BRANCH_NAME}


6. rebase 사용 시 주의사항

  1. git rebase는 이전의 커밋 히스토리를 변경하기 때문에 항상 주의해서 사용해야 합니다.
  2. 만약 이미 GitHub과 같은 원격 저장소에 push까지 한 커밋이라면 변경한 커밋들은 원격 저장소에 push되지 않을 것입니다.
  • 이 때 git push --force 또는 git push -f 명령어로 강제로 원격 저장소에 커밋 히스토리를 덮어쓸 수도 있습니다.
  • 하지만 만약 이전에 push한 커밋들을 다른 개발자들과 공유하고 있었다면 커밋 히스토리의 불일치가 발생해 흔히 말하는 "git이 꼬였다."하는 상황이 발생할 수 있습니다.
  1. 따라서 협업 시 브랜치를 공유하는 상황에서 git rebase는 가급적이면 지양해야 합니다.
  • 혼자서만 작업하는 feature branch에서 커밋을 정리할 때 사용하는 게 좋습니다.

출처

  1. [#git] 여러 커밋(commit) 하나로 합치기
  2. git rebase -i 사용하기