Soy's Devlog
pull 오류 - 병합 때문에 추적하지 않는 다음 파일을 덮어씁니다. 본문
작업한 것을 원격에 업로드 하기 위해 pull을 받고 진행하려 했는데 경고 메세지가 보여졌다.
pull 은 완료되었다 하여 일단 commit 후 push 를 하였더니 역시나 아래와 같이 거부되었다. push 하려니 pull 을 먼저 수행하라 하고 pull 하려니 에러가 나는 상황...😅
다시 commit reset해 보고 pull시도를 하니 이전에 push한 원격의 파일을 덮어쓴다는 경고가 떴다. 파일을 옮기거나 삭제한 후 다시 병합하면 되겠지만 너무 비효율적이고 여러사람이 함께 사용하는 레파지토리라면 위험한 액션이다.
시도한 것들
You have divergent branches and need to specify how to reconcile them.
You can do so by running one of the following commands sometime before
your next pull.
.
.
.
You can replace "git config" with "git config --global" to set a default
preference for all repositories. You can also pass --rebase, --no-rebase,or --ff-only on the command line to override the configured default per invocation.
우선 처음의 pull 로그 내용을 해석해 보면, 브랜치를 조정할 필요가 있다며 시도해 볼 수 있는 명령을 안내해 준다.
또한 git config 에 global 옵션을 주어 전역으로 기본설정을 해 주거나, --rebase와 --ff-only 옵션으로 호출된 구성 당 기본값을 재정의 해 줄수도 있다고 알려준다.
1. 이전 commit 삭제
- git reset HEAD^ : 이전 한 개의 커밋 삭제
- git reset HEAD~n : n개의 이전 커밋 삭제
2. 연관없는 병합 허용
git은 원격저장소와 로컬저장소 간에 연관이 없을 때 병합을 시도하면 non-fast-forward 관련 경고가 뜨는데 아래와 같이 허용해 주는 옵션을 주었지만 소용없었다.
git pull origin main --allow-unrelated-histories
3. fast-forward 관계 재정의
--rebase와 --ff-only 옵션을 사용하면 fast-forward 관계를 재정의 해주고, 그 과정에서 관련없는 commit이 발생하지 않도록 조정할 수 있다. 이렇게 rebase없이 pull 해보았지만 이것 또한 실패.. 로컬과 원격이 fast-forward 관계가 아니어서 발생한 것 같다.
참고로, rebase를 사용하면 history내역을 재정의 할 수 있지만 관계를 제대로 파악하지 않은 채 사용하면 history가 원치 않는 방향으로 별도의 알림없이 변경되어 버릴 수 있어서 주의해서 사용해야 한다!
해결
나의 경우..레파지토리안에 여러 파일을 관리중이었는데 로컬프로젝트 경로도 달랐고, 브랜치 명은 같지만 remote이름도 다르게 사용중이었다. 이 상황에서 아무 생각없이 전체 pull을 받아버리니 로컬에서 충돌이 난 것 같다.
- pull : fetch + merge 를 한번에 수행한다.
- fetch : 원격 저장소의 최신 이력을 확인 할 수 있다. 로컬저장소는 최근 커밋 이력의 위치를 가리키고, 원격저장소는 가져온 커밋 이력 중 최근 위치를 가리킨다.
직접 fetch한 후 원하는 원격 내지는 브랜치를 지정해 merge해 주면 된다.
git fetch --all
git fetch remotename
최신 이력을 확인한 후 모두 branch 명 없는 상태로 가져오기만! 한다.
git reset --hard origin/main
reset은 되돌리기, 재설정의 역할을 한다. 여기에 --hard 옵션을 주면 뒤에 적은 원격명과 브랜치 명에 해당하는 이력을 fetch로 가져온 이력으로 모두 재설정 해주고 초기화 되는 것이다. 여기까지 하면 pull이 모두 된 것이다! 이 후 다시 원하는 작업을 진행해 주면 된다.
reset 옵션
- --hard : reset하고자 하는 이력을 모두 초기화 하고 재설정해준다.
- --soft : 이력만 되돌릴 뿐 해당이력의 내용이나 인덱스는 지워지지 않고 그대로 있다. 언제라도 다시 커밋할 수 있는 상태.
- --mixed : 이력이 되돌려지고 해당 내용도 남아있지만, 인덱스는 지워진 상태
참고
https://docs.github.com/en/get-started/using-git/getting-changes-from-a-remote-repository
Getting changes from a remote repository - GitHub Docs
Options for getting changes These commands are very useful when interacting with a remote repository. clone and fetch download remote code from a repository's remote URL to your local computer, merge is used to merge different people's work together with y
docs.github.com
'Git' 카테고리의 다른 글
특정 작업 취소하기 - reset, revert (0) | 2022.02.04 |
---|---|
non-fast-forward 에러 원인과 해결 (0) | 2022.01.27 |
[git 명령어 정리] git clone - normal, bare, mirror (0) | 2022.01.24 |
Personal Access Token 발급 후 적용 (0) | 2022.01.23 |
homebrew-core is a shallow clone 에러 해결 (0) | 2022.01.22 |