| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 |
- 국비지원취업
- JPA
- 백엔드개발자
- UXUI챌린지
- mysql
- 내일배움카드
- 백준
- 국비지원교육
- 부트캠프
- 백엔드 부트캠프
- 국비지원
- 시스템설계
- API
- 오픈패스
- 오픈챌린지
- KDT
- Spring
- 디자인교육
- 패스트캠퍼스
- 티스토리챌린지
- 환급챌린지
- 오블완
- baekjoon
- OPENPATH
- UXUI기초정복
- 디자인챌린지
- Java
- 디자인강의
- UXUIPrimary
- Be
- Today
- Total
군만두의 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
이 글은 패스트캠퍼스의 백엔드 개발 캠프에서 공부한 내용을 작성한 것입니다.
'개발일지 > 패스트캠퍼스' 카테고리의 다른 글
| 패스트캠퍼스 백엔드 개발 부트캠프 8기 알쓸송잡 - 이력서, 자기소개서, 포트폴리오 꿀팁 정리 (0) | 2024.03.29 |
|---|---|
| [자료구조/알고리즘] LeetCode Two Sum - 완전탐색, 재귀, BFS, DFS로 풀기 (Java) (1) | 2024.03.26 |
| 패스트캠퍼스 백엔드 개발 부트캠프 8기 그룹스터디 - 도서관 시스템 설계 (Java, JDBC, MySQL) (0) | 2024.03.15 |
| [Java] GoF 디자인 패턴 정리 - 팩토리 메소드, 추상 팩토리, 빌더, 프로토타입, 싱글턴 (0) | 2024.03.14 |
| 패스트캠퍼스 백엔드 개발 부트캠프 8기 그룹 스터디 - Git 브랜치 전략과 협업 플로우 실습 (0) | 2024.03.14 |