[git] rebase시에 conflict가 났을 때

Walter Mitty·2024년 7월 10일
0
정답은 아닐 수 있으나 이 방법으로 수 많은 conflict를 해결해 왔습니다.
어디까지나 주니어의 입장이라 부족할 수는 있겠지만.. 한번...보시죠!

상황

저는 push 전엔 습관적으로 진행하는 routine이 있는데요.
먼저, 제가 작업하던 브랜치를 feature/velog-notice-api 라고 하겠습니다.

  1. 작업 브랜치에서 unstaged 파일 staged 상태 만들기
git add . 

  1. 커밋 하기
git commit -m "Refactor: message"

  1. dev 브랜치로 이동 후 pull
git switch dev
git pull origin {dev} // dev는 생략 가능!

  1. 원래 작업하던 브랜치로 이동 후 dev 브랜치 기준 rebase를 해줍니다
    이렇게 해주는 이유는 제가 작업하는 동안 제가 작업하고 있던 파일을 동료도 작업해서 이미 dev에 그 소스가 들어갔다면 최신화를 해주는게 충돌을 줄이는 방법이기 때문입니다. 배포 실패하는 것보단 낫죠.
git switch feature/velog-notice-api
git rebase dev

  1. 이때 충돌 파일이 존재한다면 아래와 같이 메시지가 뜹니다.
Auto-merging app-core/src/main/java/com/...A.java
Auto-merging framework-jpa-querydsl/src/main/java/com/...B.java
Auto-merging framework-jpa-querydsl/src/main/java/com/...C.java
Auto-merging framework-jpa-querydsl/src/main/java/com/...D.java
CONFLICT (content): Merge conflict in framework-jpa-querydsl/src/main/java/...E.java
error: could not apply 커밋아이디... Refactor: message
hint: Resolve all conflicts manually, mark them as resolved with
hint: "git add/rm <conflicted_files>", then run "git rebase --continue".
hint: You can instead skip this commit: run "git rebase --skip".
hint: To abort and get back to the state before "git rebase", run "git rebase --abort".
Could not apply 커밋아이디... Refactor: message

  1. 이때 당황하지 말고 hint를 뚫어져라 쳐다 봅니다. 저는 일단 git rebase 전이지만 commit 은 완료된 상태, 즉
    To abort and get back to the state before "git rebase"로 돌아가고 싶습니다.
    그럼 hint 대로 abort를 진행해 보겠습니다.
git rebase --abort

  1. 진행 후 abort 완료 메시지는 따로 뜨지 않습니다. 따라서 이전 파일들이 잘 commit이 된 상태인가 확인을 하고 싶다면 status를 확인해줍니다
git status

  1. 확인해보면 아래와 같이 뜹니다. 만약 commit 된게 사라진게 아닌가? 하는 의심이 든다면 commit 식별 번호로 commit 되어있는지 확인하면 됩니다.
On branch feature/velog-notice-api
nothing to commit, working tree clean // 음! 다 commit된 상태로 잘 있네요 : )

  1. 자 그럼 add . , commit 까지 된 상태 (rebase 하기전, push 전)로 돌아왔다면 이번엔 rebase가 아니라 dev를 pull 땡겨와 줍니다.
git pull origin dev

  1. 그러면 아까와 똑같이 conflict가 납니다! 보니까 자동으로 머지는 실패했고, 충돌을 고치고 나서 커밋 하라고 하네요.
Auto-merging app-core/src/main/java/com/...A.java
Auto-merging framework-jpa-querydsl/src/main/java/com/...B.java
Auto-merging framework-jpa-querydsl/src/main/java/com/...C.java
Auto-merging framework-jpa-querydsl/src/main/java/com/...D.java
CONFLICT (content): Merge conflict in framework-jpa-querydsl/src/main/java/...E.java
Automatic merge failed; fix conflicts and then commit the result.

  1. CONFLICT 를 보면 충돌난 파일을 확인할 수 있습니다. 저는 E.java 파일이네요. IDE에서 해당 파일에 가보면 충돌난 부분을 확인할 수 있습니다.
    충돌난 코드를 동료가 짠 코드, 내가 짠 코드에 영향이 안가도록 잘 보고 지운뒤 다시 add부터 진행해줍니다.
git add .
git commit -m "Resolve: Conflict 해결"
git push origin feature/velog-notice-api

그리고 나면 코드가 내 작업 브랜치에 잘 push 된 걸 확인 할 수 수 있습니다! 모두 행복 git 하시길 바라며...🧚💫

0개의 댓글