간단히 말해, 인터넷에 연결되지 않은 채 비행기를 타려고한다면 출발하기 전에 할 수 있습니다 git fetch origin <master>. 모든 변경 사항을 컴퓨터로 가져 오지만 로컬 개발 / 작업 공간과 별도로 유지하십시오.
비행기에서 로컬 작업 공간을 변경 한 다음 가져온 작업 공간과 병합하고 인터넷에 연결하지 않고도 잠재적 인 병합 충돌을 해결할 수 있습니다. 그리고 누군가 원격 저장소에 새로 충돌하는 변경을 하지 않았다면 목적지에 도착하면 git push origin <branch>커피를 마시 게됩니다.
이 멋진 Atlassian 튜토리얼에서 :
이 git fetch명령은 커밋, 파일 및 참조를 원격 저장소에서 로컬 저장소로 다운로드합니다.
가져 오기는 다른 모든 사람 이 작업 한 내용을보고 싶을 때 수행 하는 작업입니다. 중앙 기록이 어떻게 진행되었는지 볼 수 있다는 점에서 SVN 업데이트와 비슷하지만 실제로 변경 사항을 저장소에 병합하지는 않습니다. 힘내 A는 로컬 콘텐츠를 기존의에서로 가져온 내용을 분리 , 그것은 절대적으로 없습니다
해당 지역의 개발 작업에 영향을 . 가져온 컨텐츠는 git checkout명령을 사용하여 명시 적으로 체크 아웃해야합니다 . 이를 통해 커밋을 커밋하여 로컬 리포지토리와 커밋하기 전에 커밋을 검토 할 수 있습니다.
원격 저장소에서 콘텐츠를 다운로드, 때 git pull와 git fetch명령은 작업을 수행 할 수 있습니다. git fetch두 명령의 '안전한'버전을 고려할 수 있습니다
. 원격 컨텐츠를 다운로드하지만 로컬 저장소의 작업 상태를 업데이트하지 않고 현재 작업을 그대로 유지합니다. git pull보다 적극적인 대안으로 활성 로컬 분기에 대한 원격 컨텐츠를 다운로드하고 즉시 실행 git merge하여 새 원격 컨텐츠에 대한 병합 커밋을 작성합니다. 진행중인 변경 사항이 있으면 충돌이 발생하고 병합 충돌 해결 과정이 시작됩니다.
로 git pull:
- 격리되지 않습니다.
- 지역 개발에 영향을 미칩니다.
- 명시 적으로 체크 아웃 할 필요는 없습니다. 암시 적으로을 수행하기 때문
git merge입니다.
- 기본적으로 안전하지 않습니다. 공격적입니다.
git fetch그것이 오직 당신에게 영향을 미치는 곳 과 달리 .git/refs/remotes, git pull은 당신 .git/refs/remotes 과 .git/refs/heads/
흠 ... 그래서 작업 사본을 업데이트하지 않으면 git fetch어디에서 변경합니까? Git 페치는 새로운 커밋을 어디에 저장합니까?
좋은 질문입니다. 작업 복사본과 분리되어 있습니다. 그러나 다시 어디? 알아 보자.
프로젝트 디렉토리에서 (즉, git명령 을 수행하는 위치) 다음을 수행하십시오 .
ls. 파일 및 디렉토리가 표시됩니다. 시원하지 않습니다.
이제하세요 ls -a. 그러면 dot files 가 표시됩니다 . 즉, .You로 시작하는 파일 은 다음 디렉토리를 볼 수 있습니다 : .git.
- 마십시오
cd .git. 이것은 분명히 디렉토리를 변경합니다.
- 이제 재미있는 부분이 온다. 할
ls. 디렉토리 목록이 나타납니다. 찾고 있습니다 refs. 마십시오 cd refs.
- 모든 디렉토리 안에 무엇이 있는지 살펴 보는 것이 흥미롭지 만 두 디렉토리에 중점을 두자.
heads그리고 remotes. 사용 cd도 그들 내부에서 확인 할 수 있습니다.
- 모든
git fetch 당신이 항목 업데이트합니다 할 것을 /.git/refs/remotes디렉토리를. /.git/refs/heads디렉토리 에서 아무것도 업데이트하지 않습니다 .
- 누구나
git pull 먼저 디렉토리 git fetch에서 항목을 업데이트 /.git/refs/remotes한 다음 로컬과 병합 한 다음 /.git/refs/heads디렉토리 내부의 헤드를 변경합니다 .
'git fetch' 는 어디에 위치합니까? 에서 매우 좋은 관련 답변을 찾을 수 있습니다 . .
또한 Git 브랜치 명명 규칙 게시물 에서 "슬래시 표기법"을 찾으십시오 . Git이 다른 디렉토리에 물건을 배치하는 방법을 더 잘 이해하는 데 도움이됩니다.
실제 차이를 보려면
그냥 해:
git fetch origin master
git checkout master
원격 마스터가 업데이트 된 경우 다음과 같은 메시지가 나타납니다.
Your branch is behind 'origin/master' by 2 commits, and can be fast-forwarded.
(use "git pull" to update your local branch)
당신이하지 않고 fetch방금 git checkout master했다면 로컬 자식은 2 개의 커밋이 추가되었음을 알지 못합니다. 그리고 그것은 단지 말할 것입니다 :
Already on 'master'
Your branch is up to date with 'origin/master'.
그러나 그것은 구식이며 잘못되었습니다. git이 알고있는 것에 기초하여 피드백을 제공하기 때문입니다. 아직 풀리지 않은 새로운 커밋은 분명하지 않습니다 ...
지점에서 로컬로 작업하는 동안 원격에서 새로 변경된 내용을 볼 수있는 방법이 있습니까?
일부 IDE (예 : Xcode)는 매우 현명하며 a의 결과를 사용하며 git fetch현재 작업중인 지점의 원격 지점에서 변경된 코드 줄에 주석을 달 수 있습니다. 해당 회선이 로컬 변경 사항과 원격 지점 모두에 의해 변경된 경우 해당 회선에 빨간색 주석이 표시됩니다. 이것은 병합 충돌이 아닙니다. 그것은 A의 잠재적 인 병합 충돌합니다. git pull원격 지점에서 수행하기 전에 향후 병합 충돌을 해결하는 데 사용할 수있는 헤드 업입니다 .

재미있는 팁 :
원격 브랜치를 가져온 경우 예를 들어 다음과 같습니다.
git fetch origin feature/123
그런 다음 이것은 remotes 디렉토리로 이동합니다. 여전히 로컬 디렉토리에서 사용할 수 없습니다. 그러나 DWIM을 사용하여 해당 원격 지점에 대한 체크 아웃을 단순화합니다 (내가 의미하는 바를 수행).
git checkout feature/123
더 이상 할 필요가 없습니다.
git checkout -b feature/123 origin/feature/123
이에 대한 자세한 내용은 여기 를 참조 하십시오