메인
투자 노트

Git 커밋(Commit) 합치기 & 수정하기

@7/22/2024
git rebase squash & reword
깃(Git) 쓰다보면 비슷한 수정사항이 연속으로 발생하는 경우가 있다. 예를 들면 update README 같은거
그리고 커밋 메세지 수정하고 싶을때도 있다. 두 경우 모두 git rebase로 해결할 수 있다.

편집 범위 선택하는 방법

git rebase -i 는 과거 커밋들의 범위를 선택해 편집한다. 범위를 선택하는 방법은 다음과 같다.
과거 n개의 커밋: git rebase -i HEAD~<커밋갯수>
예시) git rebase -i HEAD~4
특정 커밋에서 특정 커밋까지: git rebase -i <이전 커밋 해시>^..<이후 커밋 해시>
예시) git rebase -i a1b2c3d^..e4f5g6h
모든 커밋: git rebase -i --root
최초의 커밋을 선택하려면 이렇게 해야 한다.
모든 커밋을 선택하기 때문에 부하가 크고 위험하다.
이렇게 git rebase -i로 범위를 선택하면 편집기가 열린다.
앞으로 이것을 “rebase 편집기 열기“라고 부르겠다.
편집기는 vi라고 가정하고 설명한다.

유의사항 및 실수 복구 방법

rebase 하기 전에 백업 수단으로 최신 상태를 깃 저장소(GitHub)에 push 해두자. 어차피 rebase하고 나면 force push 해야한다.
rebase가 종료되지 않았다면 git rebase --abort 로 취소할 수 있다.
이미 rebase가 되었다면 깃 저장소의 최신 커밋으로 복구해야 한다.
1.
git fetch origin
2.
git reset --hard origin/main

합치기 (삭제하기)

우리의 목표 (커밋이 1~7까지 있을 때)
커밋 2,3을 지우고 1에 합치기
커밋 5,6을 지우고 4에 합치기
1234567 Commit message 1 - 가장 옛날 커밋 2345678 Commit message 2 3456789 Commit message 3 4567890 Commit message 4 5678901 Commit message 5 6789012 Commit message 6 7890123 Commit message 7 - 가장 최신 커밋
Shell
복사
Before
7890123 Commit message 1 - 가장 옛날 커밋 4567890 Commit message 4 1234567 Commit message 7 - 가장 최신 커밋
Shell
복사
After

1. rebase 편집기 열기

git rebase -i <편집 범위 선택>
Shell
복사

2. 합칠 부분 지정하기

rebase 편집기를 열면 아래와 같은 커밋 리스트가 나타난다.
pick 1234567 Commit message 1 - 가장 옛날 커밋 pick 2345678 Commit message 2 pick 3456789 Commit message 3 pick 4567890 Commit message 4 pick 5678901 Commit message 5 pick 6789012 Commit message 6 pick 7890123 Commit message 7 - 가장 최신 커밋 ...
Shell
복사
편집 시작: i 편집 종료: ESC
커밋 리스트의 정렬은 위(옛날)에서 아래(최신)로 되어있다. squash로 지정한 커밋은 위에 있는 pick에 합쳐진다. (이전 커밋으로 합쳐진다.)
이제 남겨둘 커밋과 합쳐질 커밋을 지정해주면 된다. 합쳐질 커밋의 pick부분을 s로 바꾸자. s는 squash의 약자이다. squash라고 써도 된다.
pick 1234567 Commit message 1 - 가장 옛날 커밋 s 2345678 Commit message 2 s 3456789 Commit message 3 pick 4567890 Commit message 4 s 5678901 Commit message 5 s 6789012 Commit message 6 pick 7890123 Commit message 7 - 가장 최신 커밋 ...
Shell
복사
다 했으면 ESC누르고 :wq 눌러서 저장하고 나오면 된다.
이전 커밋으로 합쳐지므로 가장 이전(옛날) 커밋은 무조건 pick이어야 한다.

3. 합쳐진 커밋의 커밋 메세지 작성하기

저장하고 나오면 커밋 메세지 작성 창으로 이동한다. 여기에서 커밋 메세지를 작성하면 된다.
아래와 같이 기본값이 주어지는데 원하는대로 편집해주면 된다.
# This is a combination of 3 commits. # This is the 1st commit message: Commit message 1 # This is the commit message #2: Commit message 2 # This is the commit message #3: Commit message 3 # Please enter the commit message for your changes. Lines starting # with '#' will be ignored, and an empty message aborts the commit. ...
Shell
복사
줄단위 삭제: 편집 종료(ESC) 상태에서 원하는 줄로 커서를 옮기고 dd
원하는 커밋 메세지만 남기거나, 다 지운 뒤 커밋 메세지를 다시 작성할 수 있다.
여기에서는 원하는 커밋 메세지만 남기고 나머지를 지운다. ( 커밋 메세지 작성 방법 )
# This is a combination of 3 commits. # This is the 1st commit message: # This is the commit message #2: # This is the commit message #3: Commit message 3 # Please enter the commit message for your changes. Lines starting # with '#' will be ignored, and an empty message aborts the commit. ...
Shell
복사
줄단위 삭제: 편집 종료(ESC) 상태에서 원하는 줄로 커서를 옮기고 dd 다 했으면 ESC누르고 :wq 눌러서 저장하고 나오면 된다.
커밋 메세지를 작성하고 나오면 끝난다.
만약 합쳐지는 pick이 여러개라면 해당 커밋들의 메세지를 모두 작성해야 하므로 연속해서 커밋 메세지 편집 창이 뜰거다. 당황하지 말고 각 커밋 메세지를 모두 작성해주면 된다.

커밋 메세지 작성 방법

# 이것은 주석입니다. 주석은 앞에 #를 붙입니다. 첫번째 줄은 타이틀입니다. 두번째 줄은 비워야 하고 세번째 줄부터는 본문입니다. 본문은 줄바꿈 있는 긴 텍스트가 될 수 있습니다.
Shell
복사

4. 깃 저장소에 반영하기

우선 git log 를 실행해서 의도한대로 잘 적용되었는지 확인하자.
히스토리 변경을 적용하려면 강제(force) push를 해야 한다.
git push -f <저장소> <브랜치> # git push -f origin main
Shell
복사

수정하기

커밋 합칠때는 squash, 수정할때는 reword를 쓴다. 방법은 squash랑 똑같다.
squash 대신에 reword라고 써주기만 하면 된다. squash와 마찬가지로 reword의 약자인 r만 써줘도 된다.

1. rebase 편집기 열기

git rebase -i <편집 범위 선택>
Shell
복사

2. 수정할 부분 지정하기

pick 1234567 Commit message 1 - 가장 옛날 커밋 r 2345678 Commit message 2 r 3456789 Commit message 3 pick 4567890 Commit message 4 r 5678901 Commit message 5 r 6789012 Commit message 6 pick 7890123 Commit message 7 - 가장 최신 커밋 ...
Shell
복사

3. 커밋 메세지 수정하기

두번째 커밋 메세지 이곳은 본문입니다. 저는 이것과 저것을 하였고 이런것을 생각하고 있습니다.
Shell
복사

4. 깃 저장소에 반영하기

우선 git log 를 실행해서 의도한대로 잘 적용되었는지 확인하자.
git push -f <저장소> <브랜치> # git push -f origin main
Shell
복사