Recent Posts
Recent Comments
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
관리 메뉴

ㅇ.ㅇ

[Git] Rebase 본문

Today I Learned

[Git] Rebase

yun_ 2025. 3. 31. 10:46
반응형

 

 

1. 기본 rebase 명령어

git rebase

  • rebase는 브랜치의 커밋들을 다른 브랜치의 최신 상태 위에 다시 쌓는 명령어.
  • 쉽게 말해, 내 작업을 최신 상태 기준으로 정리해서 얹는 작업이다.
git rebase 브랜치명
  • 현재 브랜치의 커밋들을 '지정한 브랜치'의 최신 커밋 뒤로 재배치한다.
  • 주로 feature 브랜치를 최신 main 브랜치 기준으로 정리할 때 사용한다.
git checkout feature
git rebase main

// 실행 전

main:    A---B---C
                \
feature:         D---E---F


// 실행 후

main:    A---B---C
                    \
feature:             D'--E'--F'

 

2. 왜 rebase를 사용할까?

기본적으로 Git에서 협업할 때 merge를 많이 사용한다. 하지만 merge는 브랜치를 합치면서 불필요한 머지 커밋이 쌓이기 쉽고, 커밋 로그가 복잡해진다. rebase는 커밋 히스토리를 깔끔하게 정리하고 싶을 때 매우 유용하다.

 

3. 언제 rebase 사용하면 좋을까?

  • 작업 브랜치를 최신 상태로 맞추고 싶을 때
  • 협업 전에 커밋 히스토리를 깔끔하게 정리하고 싶을 때
  • 불필요한 merge commit 없이 브랜치를 정리하고 싶을 때
  • 여러 개의 커밋을 하나로 합치고 싶을 때

 

4. 자주 사용하는 git rebase 명령어 정리

브랜치를 다른 브랜치 위로 재배치

git checkout feature-branch
git rebase main
 
  • feature-branch의 작업을 main 브랜치 뒤에 다시 정리해서 쌓는다.
  • 협업 전 rebase를 해두면 충돌도 줄고 로그도 깔끔해진다.
 

인터랙티브 rebase (커밋 수정, 합치기, 삭제 등)

git rebase -i HEAD~3

// 실행 결과
pick 123abc 첫 번째 커밋
pick 456def 두 번째 커밋
pick 789ghi 세 번째 커밋
  • 최근 3개의 커밋을 인터랙티브 모드로 편집한다.
  • 여기서 pick을 reword, squash, drop 등으로 바꾸면 원하는 대로 커밋을 조정할 수 있다.

 

rebase 충돌 해결 후 재개

// 충돌 발생 (예시)
CONFLICT (content): Merge conflict in app.js 

// 충돌된 파일 수정 후
git add 파일명

// rebase 계속 진행
git rebase --continue

// 현재 rebase 진행 중인 내용을 취소하고 원래 상태로 돌아간다
git rebase --abort

 

pull 시 rebase 사용

git pull --rebase

// 실행 전
원격:    A---B---C
로컬:    A---B---X---Y

// 실행 후
로컬:    A---B---C---X'---Y'
  • 원격 브랜치의 최신 변경 사항을 내 브랜치에 merge 없이 정리해서 적용한다.
  • 협업 시 커밋 히스토리가 깔끔하게 유지된다.

 

특정 커밋 이후만 옮기기

git rebase --onto main feature~3 feature
  • feature 브랜치의 마지막 3개 커밋만 main 위에 얹는다.
  • 특정 부분만 골라서 재배치할 수 있다.

 

rebase 후 강제 푸시

git push --force

// 더 안전함
// 원격 저장소의 브랜치 상태가 내 로컬에서 마지막으로 pull한 상태와 같을 때만 푸시를 허용
git push --force-with-lease

 

GPT가 만들어준 시각자료로 마무리 ㅎㅎ

 

반응형

'Today I Learned' 카테고리의 다른 글

[DEV] curl  (0) 2025.03.30
[Tomcat] Tomcat의 war-tracker 파일  (0) 2025.03.28
[Git] Stash  (0) 2025.03.23
[Java] META-INF 디렉토리와 MANIFEST.MF  (0) 2025.03.12
[Java] try-with-resources (자원 관리 최적화)  (1) 2025.03.11