스스로 Git 문제 만들고 해결한 이야기 (rebase, merge, push 취소…) 🐈‍⬛

이수정·2024년 1월 19일
post-thumbnail

IoT Gateway 프로젝트를 진행하며, 생겼던 Git 문제에 대해 적어보고자 한다.

(+) 필자는 Issue 번호를 이용해 Branch를 생성했다. #Issue번호로 Branch를 생성하면

위와 같이 Issue와 Pull request가 연결된다.

문제 발생


위 사진은 develop 브랜치에 #1을 merge 시킨 후의 상태이다.

merge된 내용을 rebase를 통해 #2로 가져오면서 pom.xml에 대한 conflict가 발생했다.

해결 과정

  1. 방법 1 - conflict 해결하기!



    결과 : conflict는 해결 했으나 origin에 올라간 commit으로 인해 같은 내용의 commit이 중복생성된다.

위 사실을 알아채지 못하고 push해 해당 push 취소 작업이 필요해졌다!

  1. push 취소 작업
  • 사용한 주요 명령어
    • git reflog : reference log를 의미하며, 로컬 저장소에서 HEAD가 가리키고 있었던 참조 기록을 확인할 수 있는 명령어다. .git/logs/refs/heads/. 혹은 .git/logs/HEAD 에 기록된다.
      • 사용 예시

        예를 위한 사진으로 push 기록은 없습니다.
        • 이 명령어를 통해 필자가 되돌리고 싶은 시점을 알 수 있다.
    • git reset : HEAD의 포인터를 특정 시점으로 변경해주는 명령어다. (--hard : 파일의 내용을 완전 삭제시키는 옵션)

git reflog로 얻어낸 참조 기록을 통해 필자가 원하는 시점을 얻어내 reset 시킬 수 있었다.
git reset --hard HEAD@{num}

예시를 위한 사진으로 git reflog와 기록이 상이할 수 있습니다.

reset 후, git push -f origin branch 로 필자의 push를 취소해 초기 문제발생의 시점으로 돌려낼 수 있었다. (-f: force 옵션은 사용을 자제해야 한다…)

필자는 위처럼 해결했으나, 사실 잘했다가 아닌 문제 수습이다… 이런 일을 막기 위해 push 전에 반드시 잘 확인하고, 어떤 방법으로 문제를 해결해야 할지 더 고민해봐야 할 것이다.

  1. 방법 2 - merge로 합하기!
    필자가 rebase로 먼저 했던 이유 이러한 문제가 생기기 전까지 rebase를 잘 사용해왔기 때문이다. 하지만, 이 방법이 최선은 아니라는 생각에 git merge를 사용해보기로 했다. (--no fast forward로 merge 커밋만 남겼다.)

    드디어 필자가 의도한대로 그려졌다! 만약 다음에도 충돌되는 내용이 origin에 올라와 있는 내용이라면 (안건드는게 최고지만!) 이제는 merge를 먼저 사용할 것 같다.

반성

git에 많이 익숙해졌다고 생각했으나 아니었던 것 같다. 내가 쓰고 있는 명령어가 어떤 의미인지, 어떻게 작동하게 되는지 다시 보게 되었고, 몰랐던 명령어가 아직도 남아있음을 한 번 더 느낄 수 있었다.

profile
쌓다 보면 탑이 될 거야 🗼

0개의 댓글