깃허브 레포지토리에서 리드미를 수정하고, 이를 fetch 혹은 pull 하지 않은 상태로,
즉 로컬에서 원격 저장소의 변경 내역을 업데이트하지 않은 상태로 새로운 커밋을 남겼다.
이후 로컬저장소 변경 내역을 원격 저장소로 보내려하니 아래와 같은 에러가 발생했다.
git push origin main
To https://github.com/yongwoo-jeong/community-bulletin-board-MPA
! [rejected] main -> main (fetch first)
error: 레퍼런스를 'https://github.com/yongwoo-jeong/community-bulletin-board-MPA'에 푸시하는데 실패했습니다
힌트: 리모트에 로컬에 없는 사항이 들어 있으므로 업데이트가
힌트: 거부되었습니다. 이 상황은 보통 또 다른 저장소에서 같은
힌트: 저장소로 푸시할 때 발생합니다. 푸시하기 전에
힌트: ('git pull ...' 등 명령으로) 리모트 변경 사항을 먼저
힌트: 포함해야 합니다.
힌트: 자세한 정보는 'git push --help'의 "Note about fast-forwards' 부분을
힌트: 참고하십시오.
위와 같은 상황에서 rebase를 통해 커밋을 선택, 이어붙이는 방식으로도 해결할 수 있겠지만
동일한 코드라인에 대한 변경사항이 없어 충돌하지 않을 것이라는 생각이들어 다른 방법을 찾아보았다.
(원격 저장소에서는 리드미 파일만 추가 되었음)
실제 간단하게 `git fetch origin` 이후 `git merge origin/main` 명령어를 통해 정상적으로 커밋 로그에 병합할 수 있었다.
1. git merge origin/main을 실행하면 Git은 원격 저장소(origin/main) 변경 사항을 로컬 브랜치와 결합하려고 시도한다.
2. 변경 사항이 충돌하지 않으면 Git은 브랜치 히스토리에 따라 fast-forward merge 혹은 새로운 merge(커밋)를 수행한다.
- 공통 조상 식별: Git은 로컬 브랜치와 원격 브랜치 모두에서 공유하는 가장 최근의 공통 조상 커밋을 찾는다 (기준)
- 변경 사항 비교: Git은 공통 조상 커밋 이후의 로컬 브랜치와 원격 브랜치(origin/main)의 변경 사항을 비교한다. 충돌이 없으면 Git은 fast-forward 병합 또는 새로운 병합 커밋을 수행할 수 있다.
- Fast-forward 병합: 로컬 브랜치가 원격 브랜치보다 뒤쳐져 있고(더 오래된 커밋) 공통 조상 이후 로컬 브랜치에 새로운 커밋이 없는 경우 Git은 fast-forward 병합을 수행할 수 있다. 이 경우 Git은 로컬 브랜치 포인터를 원격 브랜치(origin/main)의 최신 커밋으로 이동시킨다.
- 병합 커밋: 로컬 브랜치가 공통 조상 커밋 이후 새로운 커밋이 있는 경우 Git은 두 브랜치의 변경 사항을 결합한 새로운 병합 커밋을 만든다.
- 충돌 해결: 로컬 브랜치와 원격 브랜치의 변경 사항 간에 충돌이 있는 경우 Git은 병합 프로세스를 중단하고 충돌하는 파일을 수동으로 충돌을 해결하고 변경 사항을 커밋하여 병합을 완료해야 한다. ( 나의 경우는 충돌사항이 없었다.)
참고: https://www.atlassian.com/git/tutorials/using-branches/git-merge
'개발' 카테고리의 다른 글
자바 서블릿에서의 session (0) | 2023.03.14 |
---|---|
자바 - checked Exception, unchecked Exception (0) | 2022.12.22 |
[북TIL] 파이썬 알고리즘 인터뷰 7장 배열 (0) | 2022.08.11 |
데이터베이스의 병행제어기법 (0) | 2022.07.16 |
인터페이스 모듈 연계 방식 EAI와 ESB (0) | 2022.07.14 |