간단히 말해, 인터넷에 연결되지 않은 채 비행기를 타려고한다면 출발하기 전에 할 수 있습니다 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
이에 대한 자세한 내용은 여기 를 참조 하십시오