Post

[Git] Git Rebase를 통한 Commit 합치기/분리

Git Rebase로 Commit들 합치기

1.합칠 Commit 개수 지정

합칠 Commit의 개수를 지정합니다. 예를 들어 4개의 Commit을 합친다고 가정해봅시다.

1
git rebase -i HEAD~4 //뒤의 숫자는 합칠 개수입니다.


2.대표 Commit을 놔두고 나머지 s 처리하기

대표로 남을 Commit을 놔두고 나머지 pick들을 모두 s로 변경합니다. 되도록이면 에러가 나지 않기 위하여 대표로 남을 Commit은 최근꺼가 아닌 오래된 것으로 선택합시다.

1
2
3
4
pick abcdef00 feat: 커밋1
s abcdef11 feat: 커밋2
s abcdef22 feat: 커밋3
s abcdef33 feat: 커밋4(제일최근)


3.Commit 메세지 변경 및 저장

커밋의 메세지를 변경해주고 :wq로 저장해줍시다.

1
2
3
4
5
6
7
8
#This is the 1st commit message:
feat: 대표 커밋
#This is the commit message #2:
feat: 커밋2
#This is the commit message #3:
feat: 커밋3
#This is the commit message #4:
feat: 커밋4


4.강제 Push 하기

모두 끝났으면 -f push를 통해 강제로 push 해줍시다. 이유는 아직 모르겠지만 일반 push로는 push가 되지 않습니다.

1
git push -f origin main

그러면 이제 2,3,4 커밋이 1번 커밋 밑으로 들어가고 커밋내역이 매우 정돈되고 깨끗해지는걸 볼 수 있습니다.








Git Rebase로 Commit을 분리하기

1.분리할 Commit 찾기

우선 분리할 Commit이 몇번째에 있는지 체크합니다. 5번째에 있습니다고 가정해봅시다.

1
git rebase -i HEAD~5 //5번째에 있으니 그 commit을 수정할 수 있도록 5보다 크게 해줍니다.


2.분리할 Commit을 edit으로 바꾸기

분리할 Commit이 5번째에 있습니다고 가정하면 다른 것들은 놔두고 그 Commit만 edit으로 바꿔주고 :wq로 나가줍니다.

1
2
3
4
5
pick abcdef00 feat: 커밋1
pick abcdef11 feat: 커밋2
pick abcdef22 feat: 커밋3
pick abcdef33 feat: 커밋4
edit abcdef44 feat: 커밋5(안에 Commit이 여러개 있음)


3.합쳐진 Commit 나눠주기

아래의 명령어를 입력해줍니다.

1
git reset HEAD^

그러면 아래와 같은 배열로 Commit이 전부 나눠지게 됩니다.

1
2
3
4
5
6
7
8
Unstaged changes after reset:
M       app/header.js
M       app/header.module.scss
M       app/layout.js
M       app/page.js
M       app/project1/page.js
M       app/project2/page.js
M       app/project3/page.js


4.원하는 Commit들끼리 다시 합쳐주기

이제부터는 기존에 우리가 하던 Commit과 동일합니다. 원하는 Commit들끼리 합쳐주기 위해 합쳐줄 파일들만 add 하고 commit하면됩니다. 예를 들어 나는 이런 느낌으로 해봤습니다.

1
2
3
4
git add app/header.js
git add app/header.module.scss

git commit -m "refactor: 헤더 코드 정리"
1
2
3
4
5
git add app/globals.scss
git add app/layout.js
git add app/page.js

git commit -m "feat: global.scss를 레이아웃과 페이지에 적용"
1
2
3
4
5
app/project1/page.js
app/project2/page.js
app/project3/page.js

git commit -m "refactor: 각각의 project안의 page들 컴포넌트 재사용을 위한 작업"


5.확인 후 rebase 마무리

작업이 잘 되었는지 git log를 통하여 확인해봅시다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
commit 1231231323123123132131212312 (HEAD)
Author: alexjungdev <email@gmail.com>
Date:   Wed Jan 31 21:01:58 2024 +0900

    refactor: 각각의 project안의 page들 컴포넌트 재사용을 위한 작업


commit 1231231323123123132131212313 (HEAD)
Author: alexjungdev <email@gmail.com>
Date:   Wed Jan 31 21:00:58 2024 +0900

    feat: global.scss를 레이아웃과 페이지에 적용

commit 1231231323123123132131212314 (HEAD)
Author: alexjungdev <email@gmail.com>
Date:   Wed Jan 31 21:00:21 2024 +0900

    refactor: 헤더 코드 정리

제대로 했다면 이런식으로 log가 보일 것입니다. 확인이 끝났으니 이제 rebase continue를 통하여 마무리합시다.

1
git rebase --continue

그리고 마지막으로 저장소로 -f push 해주면됩니다.

1
git push -f origin main
This post is licensed under CC BY 4.0 by the author.