본 문서는 Git Notes for Professionals (라이센스:CC-BY-SA) 를 한글로 번역한 문서입니다. 번역상 오류가 있을 수 있으므로 정확한 내용은 원본 문서를 참고하세요.
Section 16.3: rebase 수행 중에 squash 하기
커밋들은 rebase 수행 중에도 squash 될 수 있다. 이러한 방식의 squash 를 시도하기 전에, rebase 작업에 대한 전체적인 개념을 이해하는 것이 권장된다.
-
rebase 를 시작할 커밋을 결정한 후, 해당 커밋의 해시값을 기록해둔다.
-
git rebase -i [커밋 해시값]
을 입력한다.또다른 방법으로는, 가장 마지막 커밋과 해당 커밋 이전의 4개의 커밋을 표시하려는 경우 특정 커밋의 커밋 해시값 대신에 HEAD~4 와 같은 형식을 입력할 수도 있다.
-
위에서 입력한 명령어에 의해 편집기가 열리게 되면, 표시된 커밋들 중에 squash 하고자 하는 대상을 결정한다. 대상 커밋의 줄 시작부분에 pick 이라고 되어있는 부분을 squash 라고 변경하여 해당 커밋이 이전 커밋에 합쳐지도록(squash) 설정한다.
-
squash 할 대상 커밋을 모두 선택하고 나면, 커밋 메시지를 입력할 수 있는 프롬프트가 나타날 것이다.
Rebase 시작점을 결정하기 위해 커밋들의 목록 표시하기
> git log --oneline
612f2f7 This commit should not be squashed
d84b05d This commit should be squashed
ac60234 Yet another commit
36d15de Rebase from here
17692d1 Did some more stuff
e647334 Another Commit
2e30df6 Initial commit
> git rebase -i 36d15de
이 시점에서 선택된 커밋들에 대해 어떤 작업을 수행할지 선택할 수 있는 편집기가 나타나게 된다. Git 은 주석의 형태로 작업 수행에 필요한 도움말을 제공하고 있음을 알 수 있다. 편집기 내용을 수정하지 않는다면 모든 커밋들이 유지되며 그들의 순서 역시 rebase 전과 동일할 것이므로 결과적으로 아무런 일도 일어나지 않게 된다. 이 예제에서는 아래와 같이 수정을 할 것이다:
pick ac60234 Yet another commit
squash d84b05d This commit should be squashed
pick 612f2f7 This commit should not be squashed
# Rebase 36d15de..612f2f7 onto 36d15de (3 command(s))
#
# 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 = "squash" 와 비슷하지만, 커밋의 로그 메시지를 유지하지 않는다 (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.)
#
# 그러나, 모든 라인을 삭제한다면, rebase 작업이 취소될 것이다.
# (However, if you remove everything, the rebase will be aborted.)
#
# 빈 커밋들은 주석 처리될 것임에 유의하라
# (Note that empty commits are commented out)
커밋 메시지까지 입력 완료한 이후의 log 는 아래와 같이 변경될 것이다.
> git log --oneline
77393eb This commit should not be squashed
e090a8c Yet another commit
36d15de Rebase from here
17692d1 Did some more stuff
e647334 Another Commit
2e30df6 Initial commit
[출처] https://books.goalkicker.com/GitBook/ (CC BY-SA)
'번역 > Git Notes for Professionals' 카테고리의 다른 글
16.5: 자동 stash (autosquash): rebase 시에 squash 시킬 코드 커밋하기 (0) | 2019.11.26 |
---|---|
16.4: 자동 squash (autosquash) / 자동 fixup 기능 사용하기 (0) | 2019.11.26 |
16.2: merge 수행 중에 squash 하기 (0) | 2019.11.25 |
16.1: rebase 하지 않으면서 최근 몇개의 커밋들을 squash 하기 (0) | 2019.11.25 |
15.1: master 에는 있지만 origin/master 에는 존재하지 않는 커밋들 검색하기 (0) | 2019.11.25 |