본문 바로가기
Develop/etc

[GitHub] Pull Request 충돌 해결하기

by 연로그 2022. 2. 21.
반응형

❗ 문제 발생

내 작업 상황은 아래와 같다.

  1. 커밋내역들을 PR 요청
  2. PR이 머지됨
  3. 1에 이어서 작업
  4. 3을 PR하려고 하니 충돌

 

충돌이 난 원인 🤔

A, B, C라는 커밋이 Pull Request를 통해 우테코 레포에 반영되었다.

Pull Request는 A, B, C라는 커밋을 하나하나 반영되지 않고 여러 커밋들이 하나의 커밋으로 반영된다.

여기서 원래 작업하던 레포에서 D라는 커밋이 생겼다.

새로운 PR을 올릴 때 D만 요청하는게 아니라 A, B, C, D 모든 커밋 내역을 반영해달라고 요청이 간다.

A, B, C를 반영한 ABC와 A, B, C 커밋이 충돌이 났다.

 

해결 방법 😮

  • 충돌난 파일 직접 수정해서 해결
  • 새로운 브랜치를 생성 후 리팩토링 다시 진행

 

충돌난 파일을 직접 수정하는 경우는 GitHub에서도 가능하고 IntelliJ도 가능하니 생략하겠다.

 

새로운 브랜치 생성하는 방법은 사실상 처음부터 만드는 것과 크게 다르지 않다...

구체적으로 설명해보자면 아래와 같다.

 

Pull Request를 올려 충돌이 났던 레포는 A, 내 GitHub 레포지토리는 B라고 하겠다.

1. git branch를 새로 생성

$ git checkout -b <브랜치명>

 

2. A 레포에 대한 remote추가

  • upstream은 remote명인데 다른 이름으로 설정해도 괜찮다.
$ git remote add upstream <PR 올려야 할 레포지토리 url>

 

3. 2를 fetch받기

$ git fetch upstream <remote의 브랜치명>

 

4. A 레포 PR 올린 브랜치에 rebase하기

  • rebase하면 내가 바라보고 있는 브랜치의 위치가 변경됨
$ git rebase upstream/<remote레포의 브랜치명>

 

5. 작업 진행 (commit or cherry-pick)

  • 이제 브랜치에서 작업 후 commit & push를 진행하면 된다.
  • 만약 upstream의 커밋 내역이 반영이 안되어있다면 cherry-pick으로 가져올 수도 있다.
  • 이미 타 브랜치에서 작업한 내역이 있었기에 이를 가져올 때도 cherry-pick 명령어 사용했다.
$ git cherry-pick <커밋 해시코드>

 

🔻 Fatal: cherry-pick failed

error: 'cherry-pick' is not possible because you have unmerged files.
hint: Fix them up in the work tree,
hint: and then use 'git add/rm <file>' as
hint: appropriate to mark resolution and make a commit,
hint: or use 'git commit -a'. fatal: cherry-pick failed

👉 파일을 add한 뒤, cherry-pick을 재시도할 것

 

🔻 왜 rebase 명령어를 통해 충돌을 해결하지 않았는가?

$ git rebase --continue upstream <브랜치명>

👉 위에서는 A, B, C, D의 커밋 내역을 싹다 없애고 새로운 브랜치를 생성해서 ABC라는 커밋 내역을 받아왔다. 그 다음 D라는 커밋을 새로 추가했다. 하지만 브랜치를 새로 만들 필요 없이 rebase 명령어를 사용해 충돌을 바로 해결하는 방법도 있다. 하지만 이 방법을 사용하면 이전 PR의 커밋 수(A, B, C)와 비례해서 커밋이 추가로 생긴다. 나는 이전 PR에서 커밋한게 약 70개였어서 충돌을 해결하고 보니 약 120개로 늘어났다...


참고

반응형