안녕하세요, 김선진입니다.
이번에 개발서버에 배포를 줄기차게 하는 프로젝트(모바일 웹뷰 테스트...) 개발을 진행하면서,
커밋로그를 신경쓰지 않고 작업했더니 로컬 브랜치의 깃 히스토리가 살짝 보기싫어졌습니다.
비슷한 커밋로그의 반복... 그래서 마스터 브랜치에 푸시하기 전에 커밋을 하나로 합쳐버릴 생각입니다.
그럼 어떻게 하면 커밋을 하나로 만들 수 있는지 알아볼까요?
0. 서론
However, once you push your work, it is a different story entirely, and you should consider pushed work as final unless you have good reason to change it. In short, you should avoid pushing your work until you’re happy with it and ready to share it with the rest of the world.
먼저, 깃이 자유로워도 이미 커밋한 내용을 물리기는 불가능하기 때문에
PUSH하지 않은 로컬 저장소에서만 가능하다는 사실을 잊지 말아야 한다.
* rebase 명령어를 쓰기 때문에 이미 공용 브랜치에 커밋한 경우라면 다른 작업자들을 위해서라도
커밋 합치기 같은 짓을 하면 안 된다.
1. 마지막 커밋 수정
마지막 커밋 메시지를 단순히 수정할 경우라면 다음 명령어를 사용할 수 있다.
git commit --amend
git commit --amend --no-edit
저장소에서 위 명령을 터미널에 입력하면 편집기로 들어갈 수 있는데, 여기서 커밋 로그를 수정하면 된다.
만약 커밋을 수정할 필요가 없다면 --no-edit을 같이 추가해주면 됨.
하지만 이건 마지막 커밋에 대해서만 쓸 수 있는 방법이다.
나처럼 이미 28301580개의 커밋을 했다면 다른 명령어를 찾아야 한다.
(아무 숫자나 쓴 거지만 실제로 수십개의 테스트 및 오타수정 등의 커밋을 했다.)
그럼 여러 커밋을 변경하는 명령어는 뭘까? 바로 rebase 명령어에 -i옵션을 추가해서 쓴다.
2. 커밋 합치기
git rebase -i HEAD~3
HEAD~3은 HEAD(현재 위치)부터 그 위로 3개의 커밋을 수정한다는 뜻이고,
HEAD까지 4개의 커밋이 수정된다.
pick f7f3f6d Change my name a bit
pick 310154e Update README formatting and add blame
pick a5f4a0d Add cat-file
# Rebase 710f0f8..a5f4a0d onto 710f0f8
#
# Commands:
# p, pick <commit> = use commit
# r, reword <commit> = use commit, but edit the commit message
# e, edit <commit> = use commit, but stop for amending
# s, squash <commit> = use commit, but meld into previous commit
# f, fixup <commit> = like "squash", but discard this commit's log message
# x, exec <command> = run command (the rest of the line) using shell
# b, break = stop here (continue rebase later with 'git rebase --continue')
# d, drop <commit> = remove commit
# l, label <label> = label current HEAD with a name
# t, reset <label> = reset HEAD to a label
# m, merge [-C <commit> | -c <commit>] <label> [# <oneline>]
# . create a merge commit using the original merge commit's
# . message (or the oneline, if no original merge commit was
# . specified). Use -c <commit> to reword the commit message.
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out
터미널에서 명령을 실행하면 위와 같은 화면을 볼 수 있다.
사용할 수 있는 명령어가 주루룩 나열되는데,
내가 원하는 건 커밋 합치기이기 때문에 squash 명령어를 사용한다.
pick f7f3f6d Change my name a bit
squash 310154e Update README formatting and add blame
squash a5f4a0d Add cat-file
이 명령을 수행하고 나면 이전 커밋이 모두 변경된다.
로컬 브랜치를 사용하면서 git 히스토리가 더럽혀지는 게 싫었는데,
깃에서 편리한 기능을 제공해줘서 안심할 수 있었다.
집에서는 깃을 안쓰기 때문에... 모든 예시는 깃에서 퍼왔다.
그럼 이만~
Referances
https://book.git-scm.com/book/en/v2/Git-Tools-Rewriting-History
'개발새발 > Git' 카테고리의 다른 글
[git] 날려버린 스태시를 찾아서 (0) | 2022.12.06 |
---|