Dev/VCS

Git, GitHub 병합 정리

dragonhyeon 2025. 9. 18. 17:56
728x90
반응형

Git

(develop) git rebase -i main
  • develop 커밋 히스토리를 main 위로 재배열 (develop 에 변화 있음)
  • -i 옵션 여부에 따라 develop 의 커밋 압축 여부를 직접 지정할수도 혹은 지정 없이 모두 그대로 유지할수도 있음
(develop) git rebase -i HEAD~3
  • 그냥 develop 내부에서 혼자 커밋 히스토리 정리하는거 (develop 에 변화 있음)
(main) git merge --squash develop
  • develop 커밋 히스토리를 하나로 합쳐서 main 위로 새로운 커밋 하나 생성 (develop 에는 변화 없음)
  • 그냥 merge 해올때 커밋 하나로 압축해서 가져오는거
  • 이후 git add 및 git commit 진행해야 merge 완료됨

GitHub

Create a merge commit

  • 중간 커밋 + 병합 커밋 생김 (중간 커밋들은 SHA 동일. 병합 커밋은 당연히 새로운 SHA)
  • 중간 커밋 모두 남기 때문에 미리 상세히 작성할 것

Squash and merge

  • 중간 커밋이 하나의 새로운 커밋으로 합쳐짐 (중간 커밋은 사라짐. 하나로 새로 합쳐진 커밋은 당연히 새로운 SHA)
  • extended description 작성시 중간 커밋들의 header 를 재구성하여 사용
  • 중간 커밋들의 body 는 사실상 중요하지 않음
  • 따라서 PR 수락시 Squash and merge 계획이 있다면 중간 커밋들은 header 정도만 잘 작성하고 body 는 생략하는 경우 많음
  • 만약 중간 커밋이 하나일 경우는 header 와 body 모두 상세히 작성하는 편 (e.g. 커밋이 단독 하나이거나 로컬에서 미리 rebase 등을 활용하여 squash 해놓는 경우 등)

Rebase and merge

  • 중간 커밋만 들어옴 (중간 커밋 모두 SHA 변경)
  • 중간 커밋 모두 남기 때문에 미리 상세히 작성할 것

상황 추천

  • 기능 개발 브랜치에서 git rebase -i 를 활용하여 커밋 1개로 squash 하여 develop 으로 PR 을 올리고 이를 Squash and merge 혹은 Rebase and merge 로 수락하는 방식 흔함
    • 로컬에서 커밋 1개로 squash 해버린다면 중간 단계의 커밋 메시지는 사실상 어느곳에도 기록이 남지 않기 때문에 커밋 메시지 임시용으로 아무렇게나 작성해도 무방
    • 로컬에서 커밋 1개로 squash 해버리고 PR 올려 GitHub 상에서 Rebase and merge 하나 Squash and merge 하나 사실상 동일한 효과. 즉, squash 하기 위해 Rebase and merge 하나만 있어도 충분. 그럼에도 Squash and merge 기능이 따로 있는 이유는 아래와 같이 여러 개의 중간 커밋들을 로컬에서 혼자 squash 하는게 아니라 GitHub 상에서 리뷰어들과 함께 코드 리뷰 진행 후 Squash and merge 하려는 상황을 위한 것임
  • 혹은 기능 개발 브랜치에서 여러 커밋을 그대로 유지하여 develop 으로 PR 을 올리고 GitHub 상에서 코드 리뷰 진행 후 Squash and merge 하는 경우도 흔함
    • 중간 커밋들은 사실상 header 만 extended description 에 사용되므로 body 는 작성하지 않는 경우 흔함
  • Squash and merge: 기능 개발 브랜치에서 develop 으로 올리는 경우에 자주 사용 (중간 커밋 이력 사라지는 방식)
  • Rebase and merge: develop 에서 main 으로 올리는 경우에 자주 사용 (중간 커밋 이력 모두 남는 방식)
  • Create a merge commit: 중간 커밋 이력을 유지하며 병합 커밋도 기록에 남기고 싶은 경우에 사용. 사용한다면 주로 develop 에서 main 으로 올리는 경우에 사용. (중간 커밋 이력 모두 남는 방식)
  • 로컬 작업시 기능 개발 브랜치에서 develop 브랜치로부터 rebase 해와서 작업 진행 주로 함
  • git merge --squash 는 실제로는 잘 안쓰이며 협업시에는 더더욱 안쓰임
728x90
반응형

'Dev > VCS' 카테고리의 다른 글

GitHub Issues  (6) 2025.07.21
Git Flow 브랜칭 전략  (2) 2025.05.12
Git merge vs rebase  (2) 2025.05.12
GitHub PR Merge 옵션  (2) 2025.05.12
git fetch  (2) 2025.05.06