[github] git commit 하나로 합치는 방법

서론

Git을 많이 사용하다 보면 많은 양의 커밋이 쌓이곤 합니다.

간단한 오류부터, 빼먹고 올려버린 커밋, 제외해야 하는 한 줄짜리 로그 출력 코드 등 다양한 이유로 commit이 늘어나게 됩니다.

이러한 의미없는 커밋을 합치고, 추후 로그를 찾을 때 편하게 하기 위해 커밋을 합치는 작업을 진행하려고 합니다.

앞서 다뤘던 Rebase, Merge, Cherry-pick과 같은 명령어를 활용합니다.

Git Commit을 합치는 이유

앞서 말한대로 Git Commit을 합치는 이유는 다음과 같습니다.

  1. 길어진 Commit log를 정리하기 위해
  2. 추후 변경된 코드의 대한 기록을 쉽게 찾기 위해서.

이러한 이유로 Commit Log를 관리하게 됩니다.

우리의 목표는 깔끔한 히스토리를 유지하기 위해 Commit Log를 정리하는 것입니다.

Git Commit Log를 정리하는 방법

Rebase를 사용한 방법

먼저 Rebase를 활용하여 정리하는 방법에 대해 알아보죠.

rebase는 commit log를 깔끔하게 관리하기 위해 사용됩니다. 또한, 한 브랜치의 변경사항을 다른 branch에 적용할 때 유용합니다. 많은 동료분들과 다양한 기능을 만들고 합칠 때 유용한 방법이죠.

Rebase는 사용에 따라 중요한 commit log 내용도 지울 수 있기 때문에 Rebase 하기 전 합쳐지는 commmit log의 내용도 전부 갱신해서 적어두는 걸 추천합니다.

git checkout feature-branch
git rebase master

위 명령어는 ‘feature-branch’의 commit들을 ‘master’ branch에 rebase 합니다. 충돌이 발생하면 충돌을 해결한 후 ‘git rebase —continue’를 사용하면 계속해서 rebase를 할 수 있습니다.

git commit 하나로 합치는 방법
[github] git commit 하나로 합치는 방법 12

Rebase 명령어 중 최근 3개의 커밋을 수정할 수 있는 Interactive 모드를 사용할 수 있습니다.

git rebase -i HEAD~3

이 모드는 커밋을 수정할 수 있습니다. 아래와 같이 말이죠.

git commit 명령어

커밋을 보면 pick commit-id commit-message가 나오게 됩니다. pick은 commit 메시지로 사용될 커밋입니다. 아래 Commands를 보면 squash을 s로 줄여서 사용할 수 있습니다. 아래와 같이 바꾸면 pick의 commit message만 남기고 s는 commit message는 버리고 commit 내용만 함께 가져갑니다.

git commit 명령어

가장 위의 커밋을 pick으로 남겨두고 나머지 커밋을 squash로 합쳐줍니다. 가장 위의 커밋을 squash로 하면 에러가 발생합니다.

git commit 명령어

이제 commit 내용을 바꿀 수 있습니다.

#은 주석 처리입니다. 필요한 커밋 내용만 남기거나 수정해서 올리면 rebase가 완성됩니다.

commit 된 내용은 합쳐지고 마지막에 commit message로 바뀌어 올릴 수 있습니다.

주의사항

Rebase 방법은 이미 push 한 commit log를 합쳐주진 않습니다.

저 또한 이것으로 많이 헷갈려했는데요.

push 한 것은 다시 revert, reset과 같은 다양한 명령어를 조합해서 해야 합니다.

그러다 보니 push는 최소한으로 하고, 커밋을 여러 번 함으로써 이 방법을 사용할 수 있게 됩니다.

Squash vs Fixup

앞서 Squash는 commit을 합치는 방법으로 여러 commit을 하나로 합치면서 각 commit message를 함께 편집할 수 있도록 기능을 제공한다고 했습니다. 그래서 Squash 같은 경우 Pick 한 커밋에 Squash 한 commit을 합치면서 log을 좀 더 쉽게 읽고, 파악할 수 있도록 합니다.

여기에 Fixup이라는 기능도 있는데요. Fixup은 특정 commit을 이전 commit과 합치지만, 이전 commit의 message만을 유지하고 합치는 기능을 제공합니다. 즉, 특정 commit이 가진 message가 최종 commit message로 등록됩니다.

사용자가 사소한 commit 사항이 많아졌을 때, 사용하게 되면 쉽게 log를 간결하게 만들 수 있습니다.

Merge —Squash를 사용한 방법

Merge —squash 명령어는 여러 커밋을 단일 커밋으로 합치는 Git 명령어 입니다.

즉, 병합할 브랜치의 모든 commit을 하나의 commit으로 Squash 한 새로운 commit을 Base 브랜치에 추가하는 방식으로 병합하는 방법입니다.

git checkout main
git merge --squash <합치려는 브랜치 이름>
git commit -m "merge squash 적용"

위 명령어로 실행할 수 있으며, 특징은 다른 브런치에서 작업했던 커밋 내용을 쉽게 합쳐서 올릴 수 있다는 장점이 있습니다. 또한, 명령어를 치고 바로 커밋 내용을 새롭게 작성할 수 있다는 장점도 있죠.

git graph
[github] git commit 하나로 합치는 방법 13

위와 같이 merge –squash를 사용하면 커밋 내용을 합칠 수 있습니다. 단, Squash를 하면 보는 바와 같이 commit 내용이 사라진다는 점을 알고 사용해야 합니다. 상세히 적은 중요 commit도 한 번에 합쳐지기 때문에 남겨야 할 기록은 꼭 확인 후 명령어를 활용하는 게 좋습니다.

Cherry-pick를 사용한 방법

Cherry-pick 명령어는 특정 commit을 합치는 방법을 제공합니다.

즉, 여러 의미 없는 commit을 합칠 때 사용하는 것이 아닌, 특정 중요 commit만 가져와 branch에 합칠 때 사용합니다.

아직 준비가 안된 커밋들 중 몇몇 commit만 가져올 때 사용하기 좋습니다.

git checkout main
git cherry-pick [commit_hash]
git cherry-pick [commit_hash_1] [commit_hash_2]

기본 commit에 대해서는 위 명령어를 사용하면 됩니다.

그리고 merge commit 한 것에도 cherry-pick이 가능합니다.

즉, 앞서 사용한 merge –squash와 같은 commit을 사용할 때 활용하면 좋습니다.

git cherry-pick -m 1 [merge_commit_hash]

PR 할 때 활용하는 방법

지금까지 다룬 방식은 대체로 Local Commit에서 활용 가능한 내용이 많았습니다.

우리가 현업에서 다른 팀원들과 함께 일하거나 프로젝트를 진행할 때는 PR를 많이 사용합니다.

PR에서는 어떻게 활용 가능한지 알아보겠습니다.

github PR
[github] git commit 하나로 합치는 방법 14

PR를 생성하게 되면 위와 같이 나옵니다. 그중에서 Merge Pull Request를 많이 활용하고 있습니다.

평소에는 Merge Pull Request를 사용해도 문제가 없습니다. 오히려 log를 확인할 때 편하게 볼 수 있다는 장점이 있어서 많이 활용하고 있습니다.

하지만 위와 같이 의미 없는 commit log를 합치거나 정리하기 위해서는 Squash and merge 옵션을 사용해야 합니다. 어떻게 처리되는지 한번 보겠습니다.

github PR
[github] git commit 하나로 합치는 방법 15

먼저 기존 commit message를 정리하고 합칩니다.

branch remove
[github] git commit 하나로 합치는 방법 16

그리고 branch를 삭제합니다.(선택)

이렇게 진행하면 main에는 어떻게 적용될까요?

git graph
[github] git commit 하나로 합치는 방법 17
git 적용 이미지
[github] git commit 하나로 합치는 방법 18

위 이미지처럼 Github에서 PR로 합쳐질 때 하나의 commit으로 정리되어 합쳐지게 됩니다.

현업에서 PR 할 때는 Squash and merge 옵션을 많이 사용할 수 있을 것 같습니다.

마무리

git commit 하나로 합치는 방법에 대해 알아봤습니다. 많은 방법들이 있고, 상황에 따라 사용할 수 있는 방법들이 다릅니다. 각 사용 방법과 활용법을 보고 사용하면 도움이 많이 될 것 같습니다.

저 또한 이 글을 쓰면서 새롭게 안 사실들도 있고, 좀 더 다양한 시도를 하면서 Git command와 친숙하게 되었습니다. 이 글을 보시는 분들도 다양하게 명령어를 사용하면서 git과 친밀해지길 바랍니다.

참고자료

https://zzang9ha.tistory.com/417

https://computer-science-student.tistory.com/449

https://jangjjolkit.tistory.com/49

https://velog.io/@code-bebop/Github-merge-squash-merge-rebase-merge

Leave a Comment