본문 바로가기

기타/Git

[git] squash로 commit 합치기

반응형

1. squash

때로는 하나의 기능을 구현하는데 있어서 프론트, 서버 또는 여러번의 수정으로 인해 커밋의 개수가 여러개가 될 때가 있다. 이럴 때 커밋 이력 등을 정리하기 위해서 git squash 를 사용하여 커밋 이력을 합치면 된다.

git의 squash 기능은 여러개의 커밋 이력을 하나의 커밋 이력으로 만들 때 사용한다. 정확히 말하면 git rebase 를 통해서 이전 commit log 등을 되돌릴 수 있는데, 이 때 squash 옵션을 사용하여 되돌리는 커밋들을 하나의 커밋으로 만들 수 있다.

 

# git commit log 를 확인한다.
git log

# log를 통해서 확인하여 rebase 명령어를 통해 해당 commit 으로 원복을 수행한다.
# 이때 -i 옵션(interactive)을 주면 rebase 명령어를 대화형으로 사용할 수 있다.
git rebase -i HEAD~3


위의 스크립트를 통해서 git log 를 확인하여 내가 돌아갈, 합칠 commit 메세지를 확인한 후에 rebase 명령어를 통해서 해당 이력까지 원복을 시도한다. 이때 interactive 옵션을 주게되면 수정하려는 커밋 목록이 첨부된 스크립트를 텍스트 편집기로 열어준다.

스크립트는 다음과 형식으로 구성되어 있다.

 

pick f7f3f6d changed my name a bit
pick 310154e updated README formatting and added blame
pick a5f4a0d added cat-file

# Rebase 710f0f8..a5f4a0d onto 710f0f8
#
# Commands:
#  p, pick = use commit
#  r, reword = use commit, but edit the commit message
#  e, edit = use commit, but stop for amending
#  s, squash = use commit, but meld into previous commit
#  f, fixup = like "squash", but discard this commit's log message
#  x, exec = run command (the rest of the line) using shell
#
# 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


맨 위에는 수정하려는 커밋의 목록이 log 순서 반대로 정렬되어 있다. 특정 커밋에 대해서 다른 작업을 수행하고 싶으면 아래의 명령어를 참고하여 적절한 명령어를 주어야 한다.

이 게시물에서는 squash를 통해서 3 커밋을 합치는 방향으로 커밋 로그를 수정할 것이다.

 

pick f7f3f6d changed my name a bit
squash 310154e updated README formatting and added blame
squash a5f4a0d added cat-file

# Rebase 710f0f8..a5f4a0d onto 710f0f8
#
# Commands:
#  p, pick = use commit
#  r, reword = use commit, but edit the commit message
#  e, edit = use commit, but stop for amending
#  s, squash = use commit, but meld into previous commit
#  f, fixup = like "squash", but discard this commit's log message
#  x, exec = run command (the rest of the line) using shell
#
# 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


위의 스크립트와 같이 pick 이 아닌 s 또는 squash 명령어를 사용하면 해당 커밋 메세지를 pick 으로 설정된 커밋 메세지와 합치도록 한다.
위와 같이 스크립트를 수정한 후 :wq 명령어를 통해 스크립트를 저장하면 아래와 같은 화면이 출력된다.

# This is a combination of 3 commits.
# The first commit's message is:
changed my name a bit

# This is the 2nd commit message:

updated README formatting and added blame

# This is the 3rd commit message:

added cat-file


이 화면은 합쳐진 커밋 이력들에 대해서 어떤 커밋 메세지로 합칠 것인지를 에디터를 통해서 열어준 화면이다. 에디터를 사용하여 해당 메세지를 수정하게되면 수정한 메세지로 3개의 커밋 이력이 합쳐져서 하나가 된다. 이때 주석 처리된 부분은 메세지에서 나타나지 않는다.

메세지를 수정한 화면에서 앞서 스크립트를 수정한 것과 같이 :wq 를 사용하여 저장한 후에 나오게 되면 해당 커밋이 하나로 합쳐진 것을 볼 수 있다.

 

 

[reference]

- https://git-scm.com/book/ko/v2/Git-%EB%8F%84%EA%B5%AC-%ED%9E%88%EC%8A%A4%ED%86%A0%EB%A6%AC-%EB%8B%A8%EC%9E%A5%ED%95%98%EA%B8%B0

 

Git - 히스토리 단장하기

커밋을 고치는 작업은 커밋 메시지 고치를 덩달아 이끌 수 있음 커밋을 고치는 것은 커밋 메시지를 고치는 것일수도 있고 또는 커밋 담고 있는 변경 내용을 고치는 것 일수도 있다. 커밋의 고치

git-scm.com

 

반응형

'기타 > Git' 카테고리의 다른 글

[git] git hooks / pre-commit  (0) 2023.02.03
[git] git 브랜치 병합 전략 (merge, rebase)  (0) 2022.06.15
[git] git stash  (0) 2021.10.30
[git] git submodule / subtree  (0) 2021.10.19
[git] git add, commit, push 취소하는 방법  (0) 2021.04.05