군만두의 IT 개발 일지

패스트캠퍼스 백엔드 개발 부트캠프 8기 Java 과제 PR 트러블슈팅 - Git 이메일 오류, 브랜치 충돌 해결 본문

개발일지/패스트캠퍼스

패스트캠퍼스 백엔드 개발 부트캠프 8기 Java 과제 PR 트러블슈팅 - Git 이메일 오류, 브랜치 충돌 해결

mandus 2024. 3. 19. 09:36

목차

    ⭐ 요약


    • 패스트캠퍼스 백엔드 개발 부트캠프 8기 Java 객체지향 과제를 제출하는 과정에서 PR이 닫히는 문제가 발생했다.
    • Git 이메일 설정 오류, 강제 푸시로 인한 PR 닫힘, 브랜치 충돌, non-fast-forward 오류까지 여러 문제가 연쇄적으로 발생했다.
    • GPT의 도움을 받아 문제를 단계적으로 해결하고 최종적으로 PR #13을 성공적으로 제출했다.

    ⭐ 과제 내용


    제출 기한은 3월 11일(월) 오후 7시였으며, 3월 10일에 제출을 완료했다. 과제 내용은 Java 객체지향을 주제로 했으며, 깃허브 과제 링크에 안내된 대로 fork 후 PR을 올리는 방식으로 제출한다.

     

    PR #13을 제출하기까지의 과정은 아래와 같다.

    순서 발생한 문제 결과
    1 Git 이메일 설정 오류로 프로필 사진이 표시되지 않음 이메일 수정 후 강제 푸시
    2 강제 푸시로 인해 PR #12가 닫힘 PR #12 Closed 상태로 남음
    3 fork 이후 upstream main이 변경되어 브랜치 충돌 발생 코드 손실 후 로컬 백업
    4 non-fast-forward 오류로 push 불가 rebase 및 .gitignore 처리 후 해결
    5 최종 제출 완료 PR #13 Open 성공

     

    ⭐ 문제 해결 과정


    1. Git 이메일 설정 오류 - 프로필 사진이 보이지 않는 문제

    처음에는 PR #12로 과제를 제출했다. 그런데 커밋에 프로필 이미지가 표시되지 않았다. 검색해보니 Git에 등록된 이메일이 GitHub 계정의 이메일과 일치하지 않아서 발생하는 문제였다.

     

    아래 명령어로 현재 설정된 이메일을 확인했다.

    git config --global user.email

     

    확인해보니 잘못된 이메일로 설정되어 있었다. 아래 명령어로 이메일을 올바르게 수정했다.

    git config --global user.email "your_email@example.com"

     

    이메일을 수정했지만 기존 커밋에는 반영되지 않았다. 이미 올라간 커밋의 author 정보를 모두 바꾸기 위해 아래 스크립트를 사용했다.

    git filter-branch --env-filter '
    OLD_EMAIL="your-old-email@example.com"
    CORRECT_NAME="Your Correct Name"
    CORRECT_EMAIL="your-correct-email@example.com"
    if [ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL" ]
    then
        export GIT_COMMITTER_NAME="$CORRECT_NAME"
        export GIT_COMMITTER_EMAIL="$CORRECT_EMAIL"
    fi
    if [ "$GIT_AUTHOR_EMAIL" = "$OLD_EMAIL" ]
    then
        export GIT_AUTHOR_NAME="$CORRECT_NAME"
        export GIT_AUTHOR_EMAIL="$CORRECT_EMAIL"
    fi
    ' --tag-name-filter cat -- --branches --tags

     

    변경사항을 모든 커밋에 적용하기 위해 강제 푸시를 진행했다.

    git push --force --tags origin 'refs/heads/*'

    2. 강제 푸시로 PR이 닫힘

    강제 푸시를 하자 프로필 사진은 정상적으로 표시되었지만, PR #12가 자동으로 닫혀버렸다. 강제 푸시는 브랜치의 히스토리를 덮어쓰기 때문에 GitHub이 해당 PR을 더 이상 유효하지 않은 것으로 처리한 것이다.

     

    닫힌 PR을 다시 열거나 삭제하는 것이 어렵다고 판단하고, 새로운 PR을 올리는 방향으로 진행했다.

    3. 브랜치 충돌 - upstream main 변경으로 코드 손실

    fork한 레포지토리를 확인하니 아래와 같은 알림이 표시되어 있었다.

    This branch is 15 commits ahead of, 10 commits behind FastCampusKDTBackend/KDT_BE8_Java_Assignment1:main.

     

    fork한 이후에 원본(upstream) main 브랜치에 다른 사람들의 커밋이 쌓여서 내 브랜치와 차이가 벌어진 상황이었다. GPT에게 물어보니 fetch, merge, rebase 명령어를 안내해줬다. merge는 히스토리가 지저분해질 것 같아 rebase 위주로 시도했다.

     

    충돌을 제거하는 과정에서 브랜치가 upstream main과 동일한 초기 상태로 돌아가면서 작성했던 코드가 사라졌다. 다행히 로컬에는 코드가 그대로 남아있어서 즉시 백업을 진행했다.

    4. non-fast-forward 오류로 push 불가

    로컬 코드를 다시 push하려 했지만 아래와 같은 오류가 발생했다.

    ! [rejected] KDT8_yourname -> KDT8_yourname (non-fast-forward)
    error: failed to push some refs to 'https://github.com/username/KDT_BE8_Java_Assignment1.git'
    hint: Updates were rejected because the tip of your current branch is behind
    hint: its remote counterpart.

     

    로컬 브랜치가 원격 브랜치보다 뒤처져 있어서 push가 거부된 것이다. GPT가 안내한 --allow-unrelated-histories 옵션으로 무관한 이력을 병합하는 방식을 시도했다.

    git pull origin KDT8_yourname --allow-unrelated-histories

     

    이후 git status로 현재 상태를 확인하니 rebase가 진행 중인 상태였다.

     

    GPT가 안내한 대로 rebase를 완료하는 과정을 진행했다. 추적되지 않는 파일로 .idea/out/ 폴더가 표시되었고, 이 폴더들은 .gitignore에 추가하여 처리했다.

    git status
    git add .gitignore
    git commit
    git push origin KDT8_yourname

     

    위 과정을 진행하니 push가 성공했다.

    5. PR #13 최종 제출 완료

    새로운 PR #13을 올려 과제를 최종 제출했다. Open 상태로 정상 등록된 것을 확인했다.

     

    닫힌 PR #12를 삭제하고 싶었지만, GitHub에서는 닫힌 PR을 삭제하는 기능을 직접 제공하지 않는다고 한다. 프로젝트의 이력을 유지하기 위한 GitHub의 정책이므로, Closed 상태로 그대로 두어야 한다.

    ⭐ 트러블슈팅 정


    문제 원인 해결 방법
    프로필 사진 미표시 Git 로컬 이메일과 GitHub 계정 이메일 불일치 git config --global user.email로 이메일 수정 후 git filter-branch로 기존 커밋에 반영
    PR이 자동으로 닫힘 git push --force로 인한 브랜치 히스토리 강제 덮어쓰기 새 PR을 다시 올림. 강제 푸시는 신중하게 사용해야 한다.
    브랜치 충돌 및 코드 손실 fork 이후 upstream main에 커밋이 쌓여 브랜치 간 차이 발생 로컬에 백업 후 충돌 해결. fork 직후 .gitignore 세팅이 필요하다.
    non-fast-forward 오류 로컬 브랜치가 원격 브랜치보다 뒤처진 상태 --allow-unrelated-histories로 병합 후 rebase 완료
    .idea, out 폴더 push 문제 .gitignore에 IDE 설정 폴더가 등록되지 않음 .gitignore.idea/, out/ 추가

    ⭐ 후기


    • Git 이메일 설정 하나가 잘못되어 있어서 이를 수정하는 과정에서 PR이 닫히고, 브랜치 충돌이 발생하고, 코드가 사라지는 등 연쇄적인 문제가 발생했다. 처음부터 Git 설정을 꼼꼼하게 확인하는 것이 얼마나 중요한지 몸소 체감했다.
    • 처음 fork할 때 .gitignore.idea/, out/ 등 IDE 설정 폴더를 미리 등록해두는 것이 이후 불필요한 충돌을 막는 데 중요하다는 것을 알게 되었다.
    • 이번 트러블슈팅 과정에서 GPT의 도움을 많이 받았다. GPT가 안내한 명령어를 맹목적으로 따르지 않고, 각 명령어가 어떤 동작을 하는지 이해하면서 진행하는 것이 중요하다는 점도 느꼈다.

    ⭐ 참고자료


    1) backendcode, "[Github] README.md 작성하기 - 마크 다운 문법", https://backendcode.tistory.com/165

    2) jane-aeiou, "Readme 파일 구조 작성 꿀팁!(tree명령어, file-tree-generator)", https://jane-aeiou.tistory.com/80

    3) ye-ji, "[Git] Commit Message / PR 잘 쓰는 방법", https://velog.io/@ye-ji/Git-PR-잘-쓰는-방법

    4) bluayer, "2분 59초 안에 좋은 PR 작성하기", https://bluayer.com/29

     

    이 글은 패스트캠퍼스백엔드 개발 캠프에서 공부한 내용을 작성한 것입니다.

     

    Comments