- 이 글을 읽기 전에 제가 전에 적었던 글을 읽고 오시면 이해하는데 도움이 됩니다!
https://droom-119.tistory.com/entry/GitHub-%EC%99%B8%EB%B6%80%EC%A0%80%EC%9E%A5%EC%86%8C-fork-pull-request-%ED%95%98%EA%B8%B0
[GitHub] 외부저장소 fork, pull request 하기!!
내용을 제가 좀 더 이해하기 쉽게 만들어봤습니다! 참고링크 https://velog.io/@jisubin12/Github-%EC%99%B8%EB%B6%80%EC%A0%80%EC%9E%A5%EC%86%8C-fork-pull-request-%EB%8F%99%EA%B8%B0%ED%99%94-%ED%95%98%EA%B8%B0 Fork 란? Fork는 다른 사
droom-119.tistory.com
이번에 여기서는 무엇을 할 것이냐면 제가 로컬 저장소에서 작업한 것을 원본 저장소에 push한 후, merge가 되었을 때!
다시 원본 저장소에 최신화 된 내용을 로컬 저장소에 가져오는 내려받기를 해볼 것입니다!
1. 원격 저장소 내려받기 (Pull)
- pull이란? 원격 저장소와 로컬 저장소의 상태를 같게 만들기 위해 원격 저장소의 소스를 로컬 저장소로 가져오는 것 입니다.
- git remote -v를 해보면 다음과 같이 연결되어 있는 것을 볼 수 있습니다.
- 여기서 로컬 저장소와 원 저장소가 어떤 것인지 알 수 있겠죠?
- origin이 로컬 저장소이고, upstream이 원격 저장소입니다!
- 글쓴이의 경우 원격 저장소를 fork 해온 로컬 저장소와 원격 저장소를 upstream이라는 이름으로 연결을 했기에 다음과 같이 하였습니다.
- 위에 사진을 보시면 기본적으로 실습할 때는 git pull origin main을 많이 사용하는 것을 보셨을 것입니다.
- 하지만 여기서는 아까 말했듯이 origin은 원격 저장소를 fork해온 로컬 저장소이고, 원격 저장소는 upstream이라는 이름으로 연결을 했습니다.
- 그렇기 때문에 원격 저장소인 upstream에 최신화된 업로드 내용들을 가져오려면 git pull upstream을 사용해야 하는 것입니다.
- 뒤에 develop은 왜 main이 아니고 develop인 이유는?
- 그 이유는 원격 저장소 upstream의 develop 브랜치를 생성하여 develop이라는 브랜치 이름으로 파일들을 업로드하며 작업했기 때문입니다.
- git pull [원격 저장소 이름] [브랜치 명]
- 즉, upstream(원격 저장소)의 내용을 develop 브랜치로 가져온다는 뜻입니다.
2. pull의 주요 위험성
- 불필요한 병합 커밋 생성!
- git pull을 사용하면 자동으로 병합 커밋이 생성될 수 있습니다.
- 이것은 Commit History를 복잡하게 만들고, 추후 문제를 진단하기에 어렵게 할 수 있습니다.
- 로컬 변경 사항과의 충돌!
- git pull을 실행할 때 로컬에서 아직 Commit되지 않은 변경 사항이 있다면, 원격 저장소의 변경 사항과 충돌이 발생할 수 있습니다.
- 이러한 충돌을 해결하는 것은 떄로 복잡하고 시간이 많이 소요될 수 있습니다.
- 잘못된 사용으로 인한 실수!
- 경험이 많은 Git 사용자라도 실수를 할 수 있으며, 일부 실수는 되돌리기 어려울 수 있습니다.
3. pull 대신 fetch 사용하기
- 맨 위에 링크에서 fetch에 대해서 잠시 설명했었습니다. 여기서 fetch에 대해서 좀 더 설명하려고 합니다.
- pull과 fetch는 모두 원격 저장소의 커밋을 로컬 저장소로 가져오는 역할을 합니다.
- pull과 fetch의 차이점
- pull
- pull은 원격 저장소의 커밋을 가져오는 동시에 로컬 저장소에 merge를 합니다.
- 자동으로 fetch + merge 과정을 진행하기에 편리한 방법입니다.
- 하지만 자동으로 병합되기 때문에 충돌이 발생할 수 있습니다.
- fetch
- fetch는 원격 저장소의 커밋들을 로컬 저장소로 가져옵니다.
- 하지만 코드의 merge 과정은 발생하지 않기 때문에 로컬 저장소의 내용이 변경되지 않습니다.
- 그렇기 때문에 fetch가 pull보다 안정성이 높기 때문에 fetch를 추천합니다.
- 그렇다면 pull말고 fetch는 어떻게 사용할 까?
4. Fork한 저장소 동기화하기
$ git fetch upstream
$ git checkout develop
$ git merge upstream/develop
- merge할 브랜치로 변경한 다음, 원격 저장소의 변경사항을 로컬 브랜치에 merge 해줍니다.
$ git push origin develop
- 내 로컬 저장소(fork한 저장소)에 merge한 내용을 반영해줍니다.
5. 결론
- pull은 커밋을 확인하지 않거나, 충돌 문제가 없다고 확신할 때 사용합니다.
- 그럼에도 pull은 예상치 못한 문제를 가져올 수 있기 때문에 습관적으로 pull보다 더욱 안정성 있는 fetch를 사용하는 것을 습관 길들이는 것이 중요합니다!