협업을 할 때 여러 branch들이 push할 때 충돌이 빈번하게 일어난다는거 아시나요?? 쉽게 말하자면 원격 리포지토리(github)와 로컬 리포지토리(vscode)의 상태가 다르면 충돌이 일어납니다.😅
💡 해결 방안!
# pull 방법
git pull "원격 저장소 주소" 혹은 git pull 원격 저장소 이름(보통 origin) 가져올 branch명
소소한 팁💡
전 게시물에서 말했듯이 처음 git push할 때 git push -u origin main (-u는 리포지토리 주소를 기억해라라는 뜻입니다.)을 해준다면 git push만으로도 push가 되고 git pull도 주소 입력없이 바로 git pull만 적어도 된답니다!
pull로 변경된 파일을 내 로컬 리포지토리에 가져오고 push를 한다면 충돌없이 일어난답니다.
하지만,, non-fast-forward라는 오류가 나오면서 push가 실패했다 뜨네요..?
해결 방안!
1. push하려는 branch앞에 +를 붙입니다.
git push origin +브랜치명
그럼 오류가 해결됩니다..! 하지만 이 방법은 그 전 내용이 사라지고 내가 올리는 파일만 깃허브에 남아 위험합니다.
2. 커밋하기
git commit -m '커밋이름(대충 지어도 됩니다.)'
git push
이렇게 해주면 pull로 가져온 파일들이 커밋상태로 되면서 오류가 해결됩니다.
깃허브에 들어가보면 커밋이름은 pull하기 전 push를 한 커밋이름으로 들어가고 새로 지은 커밋이름은 사라집니다.(pull로 가져온 파일도 바뀌지않아요)
사실 제일 좋은 방법은 push하기 전에 깃허브에 들어가 변경사항이 있는지 확인해서 미리 pull로 가져온 후 파일을 commit해서 push해주는 것입니다.
또 다른 오류 ❌
fatal: Need to specify how to reconcile divergent branches라는 문구가 뜨면서 안된다.
변경된 파일을 pull로 가져오려할 때 빈번하게 이런 오류가 나타나는데요.
git pull을 별도 옵션없이 하게될 때 뜨는 오류입니다.
git pull을 어떻게 할지 전략이 세가지가 있으니 선택해서 명시해달라는 내용입니다.
💡 해결 방안 1: Merge Strategy (추천합니다.)
로컬 브랜치에 없는 원격 변경 사항이 있는 경우 해결해야 합니다. 기본 Git 동작은 병합이며 이러한 변경 사항을 해결하는 새 commit을 로컬 분기에 생성합니다.
fast-forward가 아니면 그냥 merge commit 만들면서 병합하고, fast-forward이면 merge commit 없이 병합한답니다.
#rebase 전략을 사용하는 대신 아래 명령을 사용하여 기본 병합 전략으로 다시 전환 할 수 있습니다 .
git config pull.rebase false
💡 해결 방안 2: Rebase Strategy
가져올 대상 브랜치의 commit들을 병합의 목적지인 브랜치로 복사했으니까 새로운 merge commit이 생기지 않습니다.(merge가 아니라 커밋 자체를 복사해옵니다.) 이력을 남기지 않아 history가 깔끔합니다.
하지만, 작업 branch마다 충돌이 빈번하게 일어날 수 있어 번거롭습니다.
git config pull.rebase true
💡 해결 방안 3: fast-forward Strategy
git에서는 원하지 않는 merge commit 현상을 막기 위한 옵션이 존재합니다. --ff-only라는 옵션을 사용하게 되면 pull 작업 시 fast-forwarded 가 새로운 merge commit을 생성하지 않고 실행됩니다.
하지만, fast-forward하지 않은 상태에서는 refuse를 하고, fast-forward한 상태에서만 merge commit 없이 병합합니다.
git config pull.ff only
# 안된다면 git congig --global pull.ff only를 사용합시다.
새로운 오류! - 병합 때문에 추적하지 않는 다음 작업 폴더의 파일을 덮어씁니다
error: 병합 때문에 추적하지 않는 다음 작업 폴더의 파일을 덮어씁니다:
~~
병합하기 전에 이 파일을 옮기거나 제거하십시오.
새로 pull을 받은 팀원들은 문제가 없다.
- 그럼, 내 local에서 충돌이 난 것.
- 메세지에서 시키는대로 파일을 옮기거나 제거하면 main브랜치가 오염된다. (나 혼자쓰는 저장소가 아니다!)
해결 방법
git fetch --all
git reset --hard origin/master
git fetch --all
원격 저장소의 최신 이력을 확인, 이때 가져온 최신 커밋 이력은 이름없는 브랜치로 로컬에 다운로드함.(가져옴)
fetch는 아무것도 merge 또는 rebase하지 않음.
git reset --hard origin/master
origin/master branch 와 일치 시킴
- reset: master브랜치를 가져온 항목으로 재설정
- --hard: 작업 트리의 모든 파일을 origin/master의 파일과 일치하도록 함.
pull을 받아도 원격 저장소와 내 컴퓨터 소스 코드가 일치되지 않는다.
pull은 fetch + merge이며, 기존 로컬에 있는 코드와 원격 코드가 merge되어 합쳐지는 과정이다
fatal: refusing to merge unrelated histories 문제 해결
git pull origin main --allow-unrelated-histories
다른 브랜치의 원하는 커밋 가져오기
git cherry-pick (다른 브랜치 해시)
'협업 > Git' 카테고리의 다른 글
git - 커밋 메세지, gitflow (0) | 2024.01.17 |
---|---|
Git - 협업 시작하는 법 (1) | 2022.10.08 |
Git - 서로 다른 branch에서 같은 파일 수정 시 충돌 오류 해결 방안 (0) | 2022.09.14 |
Git - Revert, Reset에 대해서 알아보자 (0) | 2022.09.13 |
Git - 시작하기 (2) | 2022.09.12 |
댓글