본문 바로가기
⚠️ 오류백과

[Git] Pull request에서 충돌 없이 병합하기 + cherry-pick

by Tamii 2021. 3. 5.
반응형

먼저 갑자기 충돌이 다량 발생하기 시작한 github를 만나 방황하던 나..

미래의 나는 방황하지 않길 바라기에..  이  글을 씁니다.

 

 

일단 기존에 진행했던 방식을 그대로 사용했는데 이상하게 충돌이 많이 발생했다 .

 <- 결국 이사단이 나고 만다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

깃박사 Neis(20) 님의 분석 결과 기존의 PR 방식이 바뀌었다고 알려주셨다.

기존 현재
PR 보낸 commit들 그 상태로 merge  PR 보낸 commit들이 하나의 commit으로 합쳐져 merge

나는 뭉땡이와 현재 내 코드를 merge 하려니까 자꾸 충돌이 발생한다는 느낌으로 이해했다.

 

 

 

충돌이 나지 않기 위한 방법을 우선순위에 따라 정리해보았다.

예시를 통해 확인해보자🤓 

 

+참고로 이 글에선 rebase를 하지 않습니다.

 

 

 


 

< 현재 상황 >

현재 나는 local step3에서 구현을 열심히 했다. (최신상태)

 

git add .

git commit -m " ADD PR 최신 "

git push origin step3 

 

upstream/tami    <---   origin/ step3   PR 전송 

 

 

 

1️⃣ PR전송 후 바로 merge가 되었을 때 (CLOSED) ✨ 가장 best

다음작업 branch 를 만든후 리뷰어에 의해 merge된 상태를 복사 후 그 단계에서 시작

 

git checkout -b step4 upstream/tami

: step4 브랜치 생성 후 이동하고 upstream/tami 의 상태를 그대로 복사한다

 

다시 열심히 구현 시작

 

 

 

 

 

2️⃣ PR 전송 후 바로 merger가 되지 않았을 때 (OPEN) (아직 의문)

step3 에 머무르며 CLOSED 가 되기 전까지

commit 한건 전부 바로 push 한다

PR 이 오픈 상태이면 바로바로 반영이 되기 때문에, 변경사항을 바로 올려준다 .

 

 

 

그러다 PR (CLOSED) 가 되면 1️⃣ 반복

 

 

3️⃣PR 전송 후 바로 merger가 되지 않았고 PR (CLOSED) 후에

step3에서 진행햇을 시( 커밋/푸쉬 있을때 )

 -PR CLOSED 후에도 step3에서 개발진전이 많았고 upstream/tami 를 가져온 후에  이것을 얹어서 추가 진행하고 싶다.

 

*CLOSED 후 진행한 개발상황을 통틀어 개발진전이라 칭하겠다

 

 

3️⃣-1) 브랜치 생성 

1️⃣과 같이 step4에 upstream/tami 복붙한 상태로 생성한 후에 

step3에서 그 이후에 진행했던 개발진전 commit 을 가져온다

git checkout -b step4 upstream/tami

 

 

3️⃣-2) 터미널 창을 2개 연다

A에서 upstream/tami 머지된거 이후 (개발진전) 된 git commit들을 pick해 step4에 순서대로 commit 할 것입니다.

A B
step3의 git log step4 터미널 
upstream/tami 머지된거 이후 (개발진전) 된 git commit들 확인  git commit들을 pick해 step4에 순서대로 commit 

 

A

 

3️⃣-3) B에서 cherry pick 으로 commit 시작 

 

// git cherry-pick {commit 번호1} {commit 번호2} ...띄어쓰기로 여러개 가능

git cherry-pick 9fa5d133518e915eba413b9d1a910544daaffa80

 

 

 

⚠️주의사항

 

 

- merge commit 은 제외한다

연속으로 여러 commit을 한번에 가져올 수 있지만

중간에 merger가 껴있으면 거기까지 해주고 다시 가져와야 함 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

- 간혹 예외사항이 있음 

- 좌측과 같은 경우는 merge임에도 수정사항이 있어 pick을 해줘야 함

 

예외사항을 구분하는 법은 아직 못찾음 ...

 

필자는 아래와 같이 오류가 나서 알게 되었다. 

 

➜  fe-w4-martian git:(step4) ✗ git cherry-pick df0718c2159ce883d961a34947efafc4a50b5818
error: Cherry-picking is not possible because you have unmerged files.
hint: Fix them up in the work tree, and then use 'git add/rm <file>'
hint: as appropriate to mark resolution and make a commit.
fatal: cherry-pick failed

 

 

 

⚠️예외사항 처리 

일단 픽 하던걸 일시정지 하고 

git cherry-pick --abort 

-m을 붙여서 다시 실행하면 성공! 

git cherry-pick -m df0718c2159ce883d961a34947efafc4a50b5818

 

git log

//commit 을 잘 가져왔는디 A와 비교하며 확인해주고



git stash list

//내가 가져온 commit(개발진전)들이 임시로 list에 저장되어 있음을 뜻함 



git stash pop 

//내가가져온 commit(개발진전)들 적용!

 

이제 여기서부터 다시 열심히 구현 시작

 

 

이렇게 해서  step3에 남아있던 개발진전의  code들을 step4로 가져와주면 

다음 PR도 충돌없이 진행할 수 있다. 

 

 

 

 

 

 

 

 

정 안되면 PR 올린거 가져오지 않는건 어떨까요? ^.^

그리고 이글은  새벽내내 지도해주신 Neis 깃 박사님께 바칩니다.

댓글