팀프로젝트를 진행하면서 develop 브랜치에 merge할 때는 rebase merge를 하고 있어요.
최신화한 develop 브랜치에서 새 브랜치를 파생하고, 거기서 작업을 하고 있었어요.
그 도중에 다른 분이 develop 브랜치에 rebase merge 하고, 최신화된 develop 브랜치를 내 브랜치에 가지고 오고 싶었는데, pull origin develop 했다가...... files changes가 많아져서 난감했던 적이 있었어요... ㅠㅠ
다른 팀원이 develop 브랜치에 rebase merge하고, 작업중인 내 브랜치에 develop 브랜치를 최신화해서 가지고 오고 싶으면 어떻게 해야하는지 기록해봅니다.
1️⃣ 상황
- feat/order-CRUDS-30 브랜치에서 작업하고 있었음
- develop에 rebase된 pr 이 있음
- rebase : 커밋 아이디를 새로 만들면서 commit 내용을 한 줄로 깔끔하게 만든다.
- feat/order-CRUDS-30 브랜치에서 develop 브랜치 최신화 하고 싶었음
- git pull origin develop을 함
- 기존에 내 feat/order-CRUDS-30 브랜치에서는 만약 A- B - C 커밋내역이 있었던 develop에서 파생되었던 브랜치임. 근데 develop 브랜치에서 rebase merge를 한 뒤에 develop에는 commit 내역이 A1 - B1 - C1 - D1 로 바뀜. (A~C는 rebase되면서 새로운 커밋 ID로 바뀜) 이상태에서 내가 pull을 했으니, 내 브랜치에서는 커밋내역이 달라졌으니까 다른 변동사항으로 확인해서 file Changes로 감지하는 것임.
- Git은 공통 조상(A/B/C vs A1/B1/C1)을 못 찾거나 새로 계산하므로, 로컬 커밋과 develop 커밋이 겹치지 않는다고 판단하여 모든 변경 파일을 “다른 변경사항”으로 감지하는 것임.
2️⃣ 왜 이런 일이 발생할까?
Git은 커밋 ID를기준으로 차이를 계산한다.
rebase를 하면 같은 내용이라도 커밋 ID가 새로 만들어진다.
그래서 로컬 브랜치와 develop이 같은 내용이더라도 "다른 커밋"으로 취급되어, pull 시 변경 파일이 많게 나오는 것이다.
Rebase Merge를 하게 되면
develop
A --- B --- C
\
feat/delivery (팀원)
D --- E
develop(rebase)
A1 --- B1 --- C1 --- D1
이렇게 이전에 develop 브랜치에 있었던 커밋ID가 새로운 커밋 ID로 바뀐다.
다음과 같은 상황이라고 해보자.
A-B-C 커밋내역만 있었던 develop 브랜치에서 나도 새로 브랜치를 팠고, 팀원도 새로운 브랜치를 팠다.
feat/order-CRUDS-30
D - E (내 커밋)
/
A - B - C
\
feat/delivery
D - E
팀원이 먼저 작업을 끝내서 pr 올리고 develop 브랜치에 rebase merge를 했다.
feat/order-CRUDS-30
D - E (내 커밋)
/
A1 - B1 - C1 - D1
이 상태에서 내가 git pull origin main을 하면?!
A - B - C - D - E (내 로컬)
/ \
A1 - B1 - C1 - D1 ----- M (병합 커밋 M)
- 새 merge 커밋 M이 생긴다.
- 내 브랜치 히스토리는 A-B-C-D-E 기록을 유지하고, 원격의 A1-B1-C1-D1 기록도 함께 포함된다.
- 많은 파일이 변경된 것처럼 보일 수 있다. 특히 A vs A1 등의 커밋이 내용상 같아도 해시가 달라서 diff가 커 보일 수 있다.
- 깔끔한 선형 히스토리가 아니고 병합 커밋이 생겨 히스토리가 복잡해진다.
3️⃣ 이럴땐 어떻게 해야할까?
rebase merge 된 develop에서부터 pull 받고 싶으면 어떻게 해야할까.
1️⃣ git pull —rebase origin develop
이 명령어는 develop 브랜치 fetch를 한 후에 rebase로 pull 한다.
A1 - B1 - C1 - D1 - D' - E'
- Git은 내 커밋 D, E를 origin/develop 최신(A1-B1-C1-D1) 뒤로 재배치한다.
- 내 커밋 D, E는 내용은 그대로지만 새로운 커밋 ID를 갖게 된다.
2️⃣ 새 브랜치 생성 + cherry-pick
현재 develop 브랜치로부터 새로운 브랜치를 파고, 그 브랜치에서 내가 작업했던 브랜치의 커밋 ID를 cherry-pick 하는 방법이다.
git checkout -b feat/order-clean origin/develop // develop으로부터 새 브랜치 팜
git cherry-pick <내 커밋 해시들> // 변경 커밋 내역 가지고옴, 오래된 커밋부터 먼저 작성해야함
git branch -m feat/order feat/order-old // 브랜치 order -> order-old 로 변경
git branch -m feat/order-clean order/order // order-clean -> older로 변경
git push -u origin feat/order // 원격에 푸쉬, 이미 꼬인 상태로 push한 내역있으면 원격 브랜치 삭제했다가 push
-> develop이랑 합쳐서 충돌이 많이 날 것 같거나 이미 그냥 pull 받아서 꼬였으면 2번 방식을 추천한다.
왜냐하면...
4️⃣ git pull --rebase origin develop의 동작
상황
- a- b-c에서 나, 팀원1, 팀원2가 새 브랜치를 팜
- 팀원1이 d-e 작업을 rebase merge 함 -> develop branch : a1 - b1- c1- d1- e1
- 그리고 팀원2가 f- g 작업을 rebase merge 함-> develop branch : a2 - b2 - c2 - d2- e2 - f2 - g2
- 내 브랜치엔 a - b - c - d -e -f 작업 있음
- 근데 팀원1이 나랑 같은 파일을 수정해서 d1에 커밋함
- 내 브랜치에서 develop 브랜치를 최신화 해서 가지고 오고 싶음 git pull --rebase origin develop
그럼 어떻게 될까?? 충돌 커밋이 있으면?
- Git이 origin/develop 최신 커밋을 가져옴 (a2-b2-c2-d2-e2-f2-g2)
- 내 커밋(D, E, F)을 떼어내고 develop 뒤로 재적용
- 순서대로 적용: d → e → f
- 충돌 발생 시 멈춤
- 예: d2와 d 충돌 → Git이 알려줌 → 파일 수정 → git add → git rebase --continue
- 다음 커밋 적용: e 충돌 → 수정 → continue
- f 커밋 적용 → continue
즉, 같은 파일이 여러 develop 커밋에서 수정되었으면, 각 커밋을 재적용할 때마다 충돌을 해결해야 한다.
-> 같은 파일이 수정된 커밋이 많으면 2번 방식을 추천합니다.!
'Trouble Shooting' 카테고리의 다른 글
| @OneToOne 관계에서 mappedBy 쪽은 fetch.Lazy 적용이안됨 (0) | 2025.12.08 |
|---|---|
| 트랜잭션 커밋 지연 @TransactionalEventListener로 해결 (0) | 2025.11.23 |
| @Autowired 사용 후 "오토와이어링할 수 없습니다." 오류 해결 방법 (0) | 2025.11.23 |