it-swarm-ko.tech

'git pull'과 'git fetch'의 차이점은 무엇입니까?

진행자 주 : 이 질문에 이미67 개의 답변이 게시되어 있다면 (일부는 삭제됨), 당신이아무것도 기여하지 않았는지 생각해보십시오 새로운다른 하나를 게시하기 전에.

git pullgit fetch의 차이점은 무엇입니까?

11038
pupeno

가장 간단한 용어로 git pullgit fetch 다음에 git merge를 수행합니다.

언제든지 git fetch를 수행하여 refs/remotes/<remote>/에서 원격 추적 분기를 업데이트 할 수 있습니다.

이 작업은 refs/heads에서 자신의 로컬 브랜치를 변경하지 않으며 작업 복사본을 변경하지 않아도 안전합니다. 나는 백그라운드에서 cron 작업으로 git fetch를 주기적으로 실행하는 사람들에 대해서도 들어 봤다.

git pull는 로컬 버전을 원격 버전으로 최신 버전으로 가져오고 다른 원격 추적 분기를 업데이트하는 것입니다.

문서보기 : git pull

8962
Greg Hewgill
  • pull을 사용하면 Git이 자동으로 작업을 시도합니다. 문맥에 따라 다름이므로, Git은 현재 작업중인 브랜치에 끌어온 커밋을 병합합니다. pull커밋을 자동으로 병합하지 않고 먼저 검토하게합니다. 지점을 면밀히 관리하지 않으면 자주 충돌 할 수 있습니다.

  • fetch 일 때, Git은 현재 브랜치에 존재하지 않는 타겟 브랜치와 커밋을 자신의 로컬 저장소에 저장 _합니다. 그러나 현재 분기와 병합하지 않습니다. 이 기능은 저장소를 최신 상태로 유지해야하지만 파일을 업데이트하면 손상 될 수있는 작업을 수행 할 때 특히 유용합니다. 커밋을 마스터 브랜치에 통합하려면 merge을 사용합니다.

1969
Mouna Cheikhna

Git의 디자인 철학과 SVN과 같은 전통적인 소스 제어 도구의 철학을 대비하는 것이 중요합니다.

Subversion은 클라이언트/서버 모델로 설계되고 구축되었습니다. 서버 인 단일 리포지토리가 있으며 여러 클라이언트가 서버에서 코드를 가져 와서 작업하고 서버로 다시 커밋 할 수 있습니다. 클라이언트는 작업을 수행해야 할 때 항상 서버에 연결할 수 있다고 가정합니다.

Git은 중앙 저장소가 필요없는보다 분산 된 모델을 지원하도록 설계되었습니다 (원한다면 확실히 사용할 수 있지만). 또한 git는 클라이언트와 "서버"가 동시에 온라인 상태 일 필요가 없도록 설계되었습니다. Git은 신뢰할 수없는 링크를 사용하는 사람들이 이메일을 통해 코드를 교환 할 수 있도록 설계되었습니다. git을 통해 코드를 완전히 교환하고 CD를 구울 수 있습니다.

이 모델을 지원하기 위해 git은 코드와 함께 로컬 리포지토리와 원격 리포지토리의 상태를 반영하는 추가 로컬 리포지토리를 유지 관리합니다. 원격 저장소의 복사본을 로컬에 보관하면 git은 원격 저장소에 연결할 수없는 경우에도 필요한 변경 사항을 파악할 수 있습니다. 나중에 다른 사람에게 변경 사항을 전송해야하는 경우 git은 변경 사항을 원격 저장소에 알려진 시점부터 변경 사항 집합으로 전송할 수 있습니다.

  • git fetch은 "원격 저장소의 로컬 사본을 최신으로 가져 오십시오"라는 명령입니다. 

  • git pull은 (는) "원격 저장소의 변경 사항을 내가 작성한 코드로 가져 오십시오."라고 말합니다.

일반적으로 git pullgit fetch을 수행하여 원격 저장소의 로컬 복사본을 최신 상태로 만든 다음 변경 내용을 자신의 코드 저장소와 가능하면 작업 복사본으로 병합합니다.

취할 수있는 일은 워크 스테이션에 최소한 3 개} 개의 프로젝트가 있음을 명심하십시오. 하나의 복사본은 자신 만의 커밋 히스토리가있는 저장소입니다. 두 번째 복사본은 편집 및 제작중인 작업 복사본입니다. 세 번째 사본은 원격 저장소의 로컬 "캐시 된"사본입니다.

1104
MikeD

다음은 Oliver Steele의 모든 이미지가 모두 어울리는 이미지 :

enter image description here

충분한 관심이 있다면 나는 이미지를 업데이트하여 git clonegit merge ...를 추가 할 수 있다고 생각합니다. 

744
Contango

git fetch의 한 가지 유스 케이스는 다음과 같이 마지막 분기 이후 원격 브랜치의 변경 사항을 알려주므로 현재 분기를 수행하기 전에 확인할 수 있으므로 현재 분기 및 작업 복사본의 파일을 변경할 수 있습니다.

git fetch
git diff ...Origin
446
mepster

그 차이점을 이해하는 데 약간의 비용이 들었지 만, 이것은 간단한 설명입니다. 로컬 호스트의 master은 지점입니다.

저장소를 복제 할 때 전체 저장소를 로컬 호스트로 가져옵니다. 이것은 그 시점에 HEAD에 대한 Origin/Master 포인터와 동일한 HEAD을 가리키는 master가 있음을 의미합니다.

작업을 시작하고 커밋을하면 마스터 포인터를 커밋 된 HEAD + 커밋합니다. 그러나 원본/마스터 포인터는 여전히 복제했을 때의 포인터를 가리 킵니다.

차이점은 다음과 같습니다.

  • git fetch를 수행하면 원격 저장소 ( GitHub )의 모든 변경 사항을 가져오고 원본/마스터 포인터를 HEAD으로 옮깁니다. 그러는 동안 지회 주임은 계속해서 그 지부를 지적 할 것입니다.
  • git pull를하면 기본적으로 fetch (앞에서 설명한대로)를 수행하고 새로운 변경 사항을 master 분기에 병합하고 포인터를 HEAD으로 이동합니다.
351
Gerardo

때때로 시각적 표현이 도움이됩니다.

 enter image description here

195
thedarkpassenger

간단히

git fetchpull과 유사하지만 병합하지 않습니다. 즉 원격 업데이트 (refsobjects)를 가져 오지만 로컬은 동일하게 유지됩니다 (즉 Origin/master는 업데이트되지만 master은 동일하게 유지됩니다).

git pull는 원격에서 풀다가 즉시 병합합니다.

기타

git clone는 repo를 복제합니다.

git rebase는 현재 브랜치의 업스트림 브랜치에없는 항목을 임시 영역에 저장합니다. 변경 사항을 시작하기 전과 분기가 동일합니다. 따라서 git pull -rebase는 원격 변경 사항을 끌어 내고 로컬 브랜치를 되감고 최신 브랜치까지 현재 브랜치 맨 위로 하나씩 변경 사항을 재생합니다.

또한 git branch -a는 로컬 및 원격의 모든 지점에서 진행중인 작업을 정확히 보여줍니다.

이 블로그 게시물은 유용했습니다.

git pull, git fetch 및 git clone (그리고 git rebase)의 차이점 - Mike Pearce

git pull, git fetch, git clonegit rebase를 다룹니다.

====

최신 정보

나는 이것이 실제로 어떻게 실제로 사용되는지 보여주기 위해 이것을 업데이트 할 것이라고 생각했습니다. 

  1. 리모컨에서 로컬 저장소를 업데이트합니다 (병합하지 마십시오).

    git fetch 
    
  2. 업데이트를 다운로드 한 후 다음과 같은 차이점을 확인하십시오.

    git diff master Origin/master 
    
  3. 해당 업데이트가 만족 스럽다면 병합 :

    git pull
    

노트:

2 단계 : 로컬과 원격 간의 diff에 대한 자세한 내용은 다음을 참조하십시오. 로컬 git 브랜치와 원격 브랜치를 비교하는 방법?

3 단계 : 여기서 git rebase Origin을 수행하는 것이 더 정확합니다 (예 : 빠르게 변경되는 repo). 다른 답변에서 @Justin Ohms comment 를 참조하십시오.

또한보십시오 : http://longair.net/blog/2009/04/16/git-fetch-and-merge/

189
Snowcrash
 git-pull - 다른 저장소 또는 로컬 지사에서 가져오고 병합합니다. 
 개요 
 
 git pull ... 
 설명 
 
 주어진 매개 변수로 git-fetch를 실행하고 git-merge를 호출하여 
 검색된 헤드를 현재 분기로 병합합니다. --rebase를 사용하면 git-merge 대신 git-rebase 
를 호출합니다. 
 
 사용할 수 있습니다. (현재 디렉토리)를 <repository>로 가져 와서 로컬 저장소에서 
을 가져옵니다. 이것은 로컬 브랜치 
를 현재 브랜치에 병합 할 때 유용합니다. 
 
 그 옵션은 git-pull을위한 것이고 밑에있는 git-merge 
는 git-fetch를위한 옵션 앞에 주어져야합니다. 

역사가 합쳐지기를 원한다면 끌어낼 것입니다. 누군가가 여기에 몇 가지 기사를 태그로 추가 한 것처럼 'codez'를 원한다면 가져올 수 있습니다.

164
Vinko Vrsalovic

원격 저장소에서 가져 와서 차이를 확인한 다음 가져 오거나 병합 할 수 있습니다.

다음은 Origin이라는 원격 저장소와 원격 지점 Origin/master를 추적하는 master이라는 분기의 예입니다.

git checkout master                                                  
git fetch                                        
git diff Origin/master
git rebase Origin master
151
Antonio Bardazzi

간단하고 쉬운 대답은 git pull은 단순히 git fetch이고 git merge입니다.

git pull원하는지 여부에 상관없이 자동으로 병합입니다. 물론 이로 인해 병합 충돌이 발생할 수 있습니다. 리모컨이 Origin이고 분기가 master이라고 가정 해 봅시다. 가져 오기 전에 git diff Origin/master 인 경우 잠재적 인 병합 충돌에 대한 아이디어가 있어야하며 이에 따라 로컬 브랜치를 준비 할 수 있습니다.

일부 작업 흐름 은 이와 같은 git rebase와 관련이 있습니다.

git pull Origin master
git checkout foo-branch
git rebase master
git Push Origin foo-branch

그러한 상황에 처하게되면 git pull --rebase에 유혹을받을 수 있습니다. 당신이 정말로, 당신이 무엇을하고 있는지 정말로 알고 있지 않다면, 나는 그것에 반대 할 것을 권합니다. 이 경고는 git-pull, 버전 2.3.5man 페이지에서 제공됩니다.

이것은 잠재적으로 위험한 작동 모드입니다. 기록을 다시 작성하므로 기록을 이미 게시했을 때 제대로 표시되지 않습니다. git-rebase (1)을주의 깊게 읽지 않으면이 옵션을 사용하지 마십시오.

151
jfmercer

OK, 여기에 git pullgit fetch에 대한 정보가 있으므로 실제 차이를 이해할 수 있습니다. 몇 가지 간단한 단어로 fetch가 최신 데이터를 가져 오지만 코드가 변경되지 않고 진행되지는 않습니다. 현재 로컬 브랜치 코드를 엉망으로 만들고, pull 코드 변경을 가져 와서 로컬 브랜치를 병합하면, 각각에 대한 자세한 정보를 얻으시기 바랍니다.

자식 페치

refsobjects와 모든 새로운 브랜치들을 로컬 저장소에 다운로드 할 것입니다.

하나 또는 그 이상의 다른 리포지토리에서 자신의 히스토리를 완성하는 데 필요한 객체와 함께 브랜치 및/또는 태그 (집합 적으로 "refs")를 가져옵니다. 원격 추적 분기가 업데이트됩니다 (이 동작을 제어하는 ​​방법은 아래 의 설명 참조).

기본적으로 가져 오는 기록을 가리키는 모든 태그는 가져온 입니다. 이 효과는 관심있는 가지를 가리키는 태그를 가져 오는 것입니다.이 기본 동작은 - tag 또는 --no-tags 옵션을 사용하거나 []를 구성하여 변경할 수 있습니다. ____.] remote..tagOpt. 태그를 명시 적으로 가져 오는 refspec을 사용하면 당신은 관심있는 가지를 가리 키지 않는 태그를 가져올 수 있습니다. .

git fetch는 하나의 이름 붙여진 저장소 나 URL에서 가져올 수도 있고, 주어진 저장소와 원격 저장소가있는 경우 여러 저장소에서 한 번에 가져올 수도 있습니다. 구성 파일의 항목. (git-config 1 를 보라).

원격이 지정되지 않은 경우 현재 분기에 대해 업스트림 브랜치가 구성되어 있지 않으면 기본적으로 Origin 리모컨이 사용됩니다.

가져온 참조의 이름은 가리키는 객체 이름 과 함께 .git/FETCH_HEAD에 기록됩니다. 이 정보는 스크립트 또는 git-pull과 같은 다른 git 명령에 의해 사용되는 수 있습니다.


힘내라.

remote에서 현재 브랜치로 로컬 변경 사항을 적용합니다 ...

원격 저장소의 변경 사항을 현재 분기로 통합합니다. 기본 모드에서 git pull은 git fetch와 git merge FETCH_HEAD의 줄임말입니다.

보다 정확하게, git pull은 주어진 매개 변수로 git fetch를 실행하고 는 git merge를 호출하여 검색된 분기 헤드를 현재 분기로 병합합니다. --rebase를 사용하면 git merge 대신 git rebase를 실행합니다.

git-fetch 1 에 전달 된 원격 저장소의 이름이어야합니다. 임의의 원격 참조 (예 : 태그 이름) 또는 해당 원격 추적 분기 (예 : refs/heads/: refs)/remotes/Origin /), 일반적으로 원격 저장소의 분기 이름입니다.

와에 대한 기본값은 git-branch --track에 의해 설정된 현재 브랜치의 "원격"및 "병합"구성에서 읽습니다.


나는 아래의 visual을 만들어서 어떻게 함께 git fetchgit pull를하는지 보여줍니다 ...

 git pull and git fetch

126
Alireza

enter image description here

이 대화식 그래픽 표현은 매우 유용한 도움이됩니다. http://ndpsoftware.com/git-cheatsheet.html

git fetch는 변경 사항을 원격지에서 로컬 저장소로 "다운로드"합니다. git pull는 변경 사항을 다운로드하여 현재 분기에 병합합니다. "기본 모드에서 git pullgit fetchgit merge FETCH_HEAD를 줄여서 표시합니다."

121
th3sly

보너스:

위의 답변을 가져 오거나 가져 오는 것에 관해 이야기하면서 흥미로운 트릭을 공유하고 싶습니다.

git pull --rebase

위의 명령은 많은 시간을 절약 할 수있는 가장 유용한 명령입니다.

새로운 커밋을 서버에 푸시하기 전에이 명령을 시도하면 최신 서버 변경 사항 (패치 + 병합)이 자동으로 동기화되고 git 로그 맨 위에 커밋을 배치합니다. 수동 끌어 오기/병합에 대해 걱정할 필요가 없습니다.

다음에서 세부 정보 찾기 : http://gitolite.com/git-pull--rebase

119
Sazzad Hissain Khan

나는 이런 것들을 이해하기 위해 상황을 시각적으로 표현하고 싶다. 어쩌면 다른 개발자들도 그것을보고 싶어 할 것입니다. 그래서 여기에 제가 추가되었습니다. 나는 그것이 모두 정확하다는 것을 완전히 확신하지는 못합니다, 그래서 당신이 어떤 실수를 발견하면 언급하십시오.

                                         LOCAL SYSTEM
                  . =====================================================    
================= . =================  ===================  =============
REMOTE REPOSITORY . REMOTE REPOSITORY  LOCAL REPOSITORY     WORKING COPY
(Origin)          . (CACHED)           
for example,      . mirror of the      
a github repo.    . remote repo
Can also be       .
multiple repo's   .
                  .
                  .
FETCH  *------------------>*
Your local cache of the remote is updated with the Origin (or multiple
external sources, that is git's distributed nature)
                  .
PULL   *-------------------------------------------------------->*
changes are merged directly into your local copy. when conflicts occur, 
you are asked for decisions.
                  .
COMMIT            .                             *<---------------*
When coming from, for example, Subversion, you might think that a commit
will update the Origin. In git, a commit is only done to your local repo.
                  .
Push   *<---------------------------------------*
Synchronizes your changes back into the Origin.

가져온 리모컨의 미러를 사용하는 경우의 주요 이점은 다음과 같습니다.

  • 성능 (네트워크를 통해 압축하지 않고 모든 커밋과 메시지를 스크롤)
  • Feedback 로컬 Repo의 상태에 대한 정보 (예 : Atlassian의 SourceTree를 사용하면 Origin에 비해 앞뒤로 커밋 여부를 나타내는 전구가 표시됩니다.이 정보는 GIT FETCH로 업데이트 할 수 있습니다 ).
109
Justus Romijn

나는 이것으로 또한 고투했다. 사실 나는 정확히 같은 질문에 대한 Google 검색을 통해 여기에 있습니다. 이 모든 대답을 읽고 마침내 내 머리 속에 그림을 그렸습니다. 그리고이 버전을 보면서 2 개의 리포지토리와 1 개의 샌드 박스 및 동작을 시간 경과에 따라 살펴 보려고했습니다. 그래서 여기에 내가 생각해 낸 것이 있습니다. 내가 어디서든 엉망이되면 나를 바로 잡으세요.

가져 오기가있는 세 개의 저장소 :

---------------------     -----------------------     -----------------------
- Remote Repo       -     - Remote Repo         -     - Remote Repo         -
-                   -     - gets pushed         -     -                     -
- @ R01             -     - @ R02               -     - @ R02               -
---------------------     -----------------------     -----------------------

---------------------     -----------------------     -----------------------
- Local Repo        -     - Local Repo          -     - Local Repo          -
- pull              -     -                     -     - fetch               -
- @ R01             -     - @ R01               -     - @ R02               -
---------------------     -----------------------     -----------------------

---------------------     -----------------------     -----------------------
- Local Sandbox     -     - Local Sandbox       -     - Local Sandbox       -
- Checkout          -     - new work done       -     -                     -
- @ R01             -     - @ R01+              -     - @R01+               -
---------------------     -----------------------     -----------------------

당기고있는 3 개의 repos

---------------------     -----------------------     -----------------------
- Remote Repo       -     - Remote Repo         -     - Remote Repo         -
-                   -     - gets pushed         -     -                     -
- @ R01             -     - @ R02               -     - @ R02               -
---------------------     -----------------------     -----------------------

---------------------     -----------------------     -----------------------
- Local Repo        -     - Local Repo          -     - Local Repo          -
- pull              -     -                     -     - pull                -
- @ R01             -     - @ R01               -     - @ R02               -
---------------------     -----------------------     -----------------------

---------------------     -----------------------     -----------------------
- Local Sandbox     -     - Local Sandbox       -     - Local Sandbox       -
- Checkout          -     - new work done       -     - merged with R02     -
- @ R01             -     - @ R01+              -     - @R02+               -
---------------------     -----------------------     -----------------------

이로 인해 왜 가져 오기가 중요한지 이해할 수있었습니다.

99
pn1 dude

GIT FetchGIT Pull 사이의 차이점은 다음과 같은 시나리오로 설명 할 수 있습니다 : (그림이 단어보다 크게 소리내는 것을 명심하십시오!, 그림으로 표현했습니다)

팀 구성원과 함께 프로젝트를 진행하고 있다는 예를 들어 봅시다. 따라서 프로젝트의 주요 지점이 될 것이며 모든 참여자는 자신의 로컬 저장소로 이동 한 다음이 로컬 지점에서 모듈을 수정/추가 한 다음 주 분기로 다시 푸시해야합니다.

그래서, 로컬 저장소에서 메인 프로젝트를 포크했을 때 두 브랜치의 Initial State는 다음과 같을 것입니다. (A, BC은 프로젝트에서 이미 완료된 모듈입니다)

 enter image description here

이제 새 모듈 (D 가정) 작업을 시작했고 D 모듈을 완료하면 메인 브랜치에 밀어 넣기를 원합니다.하지만 팀 구성원 중 하나가 새로운 Module E, F을 개발했습니다. 수정 된 C.
이제는 어떤 일이 발생 했습니까? 귀하의 지역 저장소가 프로젝트의 원래 진행 상황 뒤에 있지 않고 메인 브랜치에 대한 변경 사항을 밀어 넣으면 충돌이 발생할 수 있으며 모듈 D이 오작동 할 수 있습니다.

 enter image description here

이러한 문제를 피하고 프로젝트의 원래 진행 상황과 병행하려면 두 가지 방법이 있습니다.

1. Git Fetch- 이것은 로컬 브랜치에없는 Origin/main 브랜치 프로젝트에 대한 모든 변경 사항을 다운로드합니다. Git Merge 명령이 가져온 변경 사항을 저장소 또는 분기에 적용 할 때까지 기다립니다.

 enter image description here

이제 저장소에 파일을 병합하기 전에 신중하게 파일을 모니터링 할 수 있습니다. 수정 된 D 때문에 필요한 경우 C을 수정할 수도 있습니다.

 enter image description here

2. Git Pull- 이것은 로컬 브랜치를 Origin/main 브랜치로 업데이트 할 것입니다. 실제로 Git Fetch와 Git의 조합이 차례로 병합됩니다. 하지만 이로 인해 충돌이 발생하므로 Git Pull을 깨끗한 사본과 함께 사용하는 것이 좋습니다. _

 enter image description here

89
Aman Tiwari

우리는 간단히 말합니다 :

git pull == git fetch + git merge

git pull를 실행하면 데이터를 로컬로 병합 할 필요가 없습니다. git fetch를 실행하면 로컬 시스템에 최신 코드를 가져 오기 위해 git merge를 실행해야 함을 의미합니다. 그렇지 않으면 병합없이 로컬 컴퓨터 코드가 변경되지 않습니다. 

Git Gui에서 가져올 때 데이터를 병합해야합니다. 가져 오기 자체가 현지에서 코드를 변경하지는 않습니다. 한 번 가져 와서 [] 코드를 가져 와서 코드를 업데이트하면 확인할 수 있습니다. 코드는 변경되지 않습니다. 그런 다음 병합 ... 변경된 코드가 표시됩니다.

82
Selvamani

git fetch는 원격 서버의 코드를 로컬 저장소의 추적 분기로 가져옵니다. 리모컨의 이름이 Origin기본값) 인 경우이 분기는 Origin/ 내에 있습니다 (예 : Origin/master, Origin/mybranch-123 등). 이들은 현재 분기가 아니며 서버의 해당 분기의 local 복사본입니다.

git pullgit fetch를 수행하지만 그 다음에 _ (또한추적 브랜치의 코드를 현재 브랜치의 로컬 버전으로 병합합니다. 아직 변경 준비가되지 않았다면 먼저 git fetch를 사용하십시오.

80
Michael Durrant

git fetch는 원격 분기를 검색하므로 현재 분기로 git diff 또는 git merge 할 수 있습니다. git pull는 현재 브랜치가 추적 한 원격 brach에서 fetch를 실행 한 다음 결과를 병합합니다. git fetch를 사용하여 로컬 브랜치와 병합 할 필요없이 원격 브랜치에 대한 업데이트가 있는지 확인할 수 있습니다.

75
ntanase

힘내 가져 오기

가져 오기를 통해 Origin에서 변경 사항을 로컬 브랜치로 다운로드합니다. 가져 오기는 다른 사람들이 만든 모든 커밋에 대해 원격 저장소에 요청하지만 로컬 저장소에는 없습니다. 가져 오기는 이러한 커밋을 다운로드하여 로컬 저장소에 추가합니다.

힘내 합병

병합 명령을 사용하여 fetch를 통해 다운로드 한 변경 사항을 적용 할 수 있습니다. Merge는 가져 오기에서 가져온 커밋을 취해 로컬 브랜치에 추가하려고 시도합니다. 병합은 로컬 변경의 커밋 내역을 유지하므로 브랜치를 푸시와 공유 할 때 다른 사람들이 변경 사항을 병합하는 방법을 알 수 있습니다.

힘내 당겨

페치 및 병합을 자주 실행하면 두 개를 결합한 명령 인 pull이 작성됩니다. 당겨서 가져 오기를 수행 한 다음 병합하여 다운로드 된 커밋을 로컬 지사에 추가합니다.

71
Pinkesh Sharma

git pullgit fetch의 유일한 차이점은 다음과 같습니다.

git pull는 원격 지점에서 가져와 병합합니다.

git fetch는 원격 브랜치에서만 가져 오지만 병합하지는 않습니다.

즉 git pull = git fetch + git merge ...

50

Git은 새로운 커밋 후에 연대순으로 오래된 커밋을 적용 할 수있게 해준다. 이로 인해 리포지토리간에 커밋을 옮기는 행위는 두 단계로 나뉜다.

  1. 새로운 복사본을 원격 저장소에서 로컬 저장소의 원격 저장소 복사본으로 복사합니다. 

    (repo 작업 repo) [email protected] >> remote/Origin/[email protected]

  2. 지사에 새로운 커밋 통합

    (내부 repo 작업) remote/Origin/[email protected] >> [email protected]

2 단계는 두 가지 방법으로 수행 할 수 있습니다.

  1. 마지막 공통 조상 후 로컬 분기를 포크하고 로컬 저장소에 고유 한 커밋과 병행하여 새로운 커밋을 추가하고 병합을 병합하여 마무리하고 포크를 닫습니다. 
  2. 마지막 공통 조상 (ancestor) 다음에 새로운 커밋을 삽입하고 로컬 저장소에 고유 한 커밋을 다시 적용합니다.

git 용어에서 1 단계는 git fetch, 2 단계는 git merge 또는 git rebase입니다.

git pullgit fetchgit merge입니다.

44
Pawel Furmaniak

git pullgit fetch의 차이점은 무엇입니까?

이것을 이해하기 위해서는 우선 로컬 git이 로컬 저장소뿐만 아니라 원격 저장소의 로컬 복사본을 유지한다는 것을 이해해야합니다.

git fetch는 원격 저장소의 로컬 복사본을 최신 상태로 만듭니다. 예를 들어, 원격 저장소가 GitHub 인 경우 - 원격 저장소의 변경 사항을 원격 저장소의 로컬 사본으로 가져올 수 있습니다. 이렇게하면 비교 또는 병합과 같은 작업을 수행 할 수 있습니다.

반면에 git pull는 원격 저장소의 변경 사항을 자신의 코드를 유지하는 곳으로 가져옵니다. 일반적으로 git pullgit fetch를 먼저 수행하여 원격 저장소의 로컬 복사본을 최신 상태로 만든 다음 변경 내용을 자신의 코드 저장소와 작업 복사본으로 병합합니다. 

36
Donal

Git은 다음 두 명령을 사용하여 원격에서 최신 버전의 지점을 얻습니다. 

  1. git fetch : Git은 원격에서 로컬로 최신 버전을 가져 오지만 자동으로 병합하지는 않습니다. git fetch Origin mastergit log -p master..Origin/mastergit merge Origin/master

     위의 명령은 원격에서 Origin 마스터 브랜치로 Origin에서 메인 브랜치의 최신 버전을 다운로드하는 것을 의미합니다. 그런 다음 로컬 마스터 분기와 원본 마스터 분기를 비교합니다. 마지막으로 병합합니다. 

  2. git pull : Git은 원격지에서 최신 버전을 가져 와서 로컬로 병합 할 것이다.

    git pull Origin master

     위의 명령은 git fetchgit merge와 같습니다. 실제로 git fetch는 병합 전에 변경 사항을 확인하고 병합할지 여부를 결정할 수 있기 때문에 더 안전 할 수 있습니다.

35
Marcus Thornton

git pull == (git fetch + git merge) 

git fetch는 로컬 브랜치로 바뀌지 않습니다.

원하는 프로젝트에 대한 원격 설정이있는 로컬 저장소가 이미있는 경우 git fetch를 사용하여 기존 원격에 대한 모든 분기와 태그를 가져올 수 있습니다. ... 가져 오기는 로컬 분기를 변경하지 않으므로 원격 분기를 쌍으로 연결된 로컬 분기와 병합하여 새로 변경 사항을 가져와야합니다. github에서

33
Iggy

실제로 Git은 자신의 코드 사본과 원격 저장소를 관리합니다.

git fetch 명령은 원격 저장소에서 데이터를 가져 와서 로컬 복사본을 최신으로 만듭니다. 우리가 필요로하는 이유는 누군가 다른 사람이 코드를 수정했을 수도 있고 자신을 계속 업데이트하려고하기 때문입니다. 

git pull 명령은 원격 저장소의 변경 사항을 자신의 코드를 유지하는 곳으로 가져옵니다. 일반적으로 git pull는 원격 리포지토리의 로컬 사본을 최신 상태로 가져 오기 위해 '자식 가져 오기'를 먼저 수행 한 다음 변경 사항을 자신의 코드 저장소와 가능하면 작업 복사본으로 병합합니다.

32
Pokemon

명확하고 단순하게하려고 노력합니다.

git pull 명령은 실제로 구성에 따라 git fetch 에 이어 git merge 또는 git rebase 명령에 대한 shortcut입니다. Git 저장소를 설정하여 git pull 가 페치이고 rebase가 뒤따라 오도록 할 수있다.

31
montells

초보자를위한 간단한 그래픽 표현,

 enter image description here

이리,

git pull  

저장소에서 코드를 가져오고 로컬로 rebase합니다 ... git pull에서 새로운 커밋이 생성 될 가능성이 있습니다.

하지만, 

자식 페치 

저장소에서 코드를 가져오고 git rebase를 사용하여 수동으로 리베이스해야합니다.

예 : 서버 마스터에서 가져오고 내 로컬 마스터에서 리베이스합니다.

1) git pull (rebase가 자동으로 수행됩니다) :

git pull Origin master

여기 근원 는 당신의 원격 repo master 귀하의 지점입니다

2) 자식 가져 오기 (수동 rebase 필요) :

git fetch Origin master

origin에서 서버 변경 사항을 가져옵니다. 그리고 당신이 당신 자신의 것으로 그것을 rebase 할 때까지 당신의 지역에있을 것입니다. 코드를 검사하여 충돌을 수동으로 수정해야합니다.

git rebase Origin/master

그러면 코드가 로컬로 리베이스됩니다. 그 전에 당신이 올바른 지점에 있는지 확인하십시오.

30
git pull = git fetch + git merge 
29
Saqib R.

Pro Git § 2.5 Git Basics - 리모컨 작업 : 리모컨 가져 오기 및 가져 오기 :

fetch 명령은 데이터를 로컬 저장소로 가져옵니다. 는 현재 작업과 병합하거나 현재 작업하고있는 수정합니다. 준비가되면 수동으로 작업 에 병합해야합니다.

원격 지점을 추적하도록 지점을 설정 한 경우 git pull 명령을 사용하여 원격 지점 지점을 자동으로 가져 와서 현재 지점에 병합 할 수 있습니다. 이것은 더 쉽거나 더 많은 편안한 워크 플로우 일 수 있습니다. 기본적으로 git clone 명령 은 로컬 마스터 브랜치를 자동으로 설정하여 복제 한 서버의 원격 마스터 브랜치를 추적합니다 (원격에 마스터 브랜치가 있음) . git pull를 실행하면 일반적으로 원래 복제 한 서버의 데이터를 가져오고 현재 작업중인 코드에 병합을 자동으로 시도합니다.

28
Zhenxiao Hao

git pull  

단일 명령을 사용하여 두 가지 기능을 수행합니다.

원격 분기에 대한 모든 변경 사항을 가져온 다음 해당 변경 사항을 로컬 분기에 병합합니다. --rebase를 전달하여 pull 동작을 수정할 수도 있습니다. 병합과 rebase의 차이점은 here - 여기서 읽을 수 있습니다.

git fetch

힘내 가져 오기 작업은 자식 작업의 절반 만 수행합니다. 원격 변경 사항을 로컬 repo로 가져 오지만 지점에 적용하지 않습니다. 명시 적으로 변경 사항을 적용해야합니다. 이 작업은 다음과 같이 수행 할 수 있습니다.

git fetch
git rebase Origin/master
22
Animesh Sharma

하나는 자식의 특성을 명심해야합니다. 리모트와 로컬 브랜치 (반드시 같을 필요는 없음)가 있습니다. 다른 소스 제어 시스템과 비교하면 약간 혼란 스러울 수 있습니다. 

일반적으로 체크 아웃 할 때 리모컨은 로컬 복사본을 만들어 원격을 추적합니다. 

git fetch는 원격 브랜치와 함께 작동하고 정보를 업데이트 할 것입니다. 

다른 SWE가 같은 지점에서 일하고있는 경우는 드물지만, 하나의 작은 지점에서 프로젝트 시나리오가있는 경우는 드뭅니다.

로컬 지사에서의 작업은 여전히 ​​그대로입니다. 로컬 브랜치에 변경 사항을 적용하려면 원격 브랜치의 변경 사항을 병합/리베이스해야합니다.

git pull은 정확히이 두 단계를 수행합니다 (예 : --rebase to merge 대신 rebase).

로컬 히스토리와 원격 히스토리에 충돌이 있으면 git Push 중에 변경 사항을 게시하도록 병합해야합니다.

따라서 실제로는 작업 환경의 특성에 따라 다르며 사용 방법을 경험할 수 있습니다.

22
g24l

git 치트 시트

git fetch <remote> // Download all changes from <remote>, but don't integrate into HEAD
git pull <remote> <branch> // Download changes and directly merge/integrate into HEAD
20
Nan Xiao

간단히 말해서, 인터넷에 연결하지 않고 비행기를 타려고한다면 ... 출발하기 전에 git fetch Origin <master>을 수행하면됩니다. 모든 변경 사항을 컴퓨터로 가져 오지만 로컬 개발/작업 공간과 별도로 유지하십시오.

비행기에서 로컬 작업 공간을 변경 한 다음 가져온 작업 공간과 병합하고 인터넷에 연결하지 않고도 잠재적 인 병합 충돌을 해결할 수 있습니다. 그리고 누군가가 원격 저장소에 new 충돌하는 변경 사항을 작성하지 않으면 목적지에 도착하면 git Push Origin <branch>을 수행하고 커피를 마시 게됩니다.


이 멋진 Attlassian tutorial :

git fetch 명령은 커밋, 파일 및 참조를 원격 저장소에서 로컬 저장소로 다운로드합니다.

가져 오기는 모든 else 가 작업 한 내용을보고 싶을 때 수행하는 작업입니다. 중앙 기록이 어떻게 진행되었는지 볼 수 있다는 점에서 SVN 업데이트와 비슷하지만 실제로 변경 사항을 저장소에 병합하지는 않습니다. 힘내 가져온 컨텐츠를 기존 로컬 컨텐츠에서 분리 함, 그것은 절대적으로 로컬 개발 작업에 영향을 미치지 않습니다. 페치 된 컨텐츠는 git checkout 명령을 사용하여 명시 적으로 체크 아웃해야합니다. 이를 통해 커밋을 커밋하여 로컬 리포지토리와 커밋하기 전에 커밋을 검토 할 수 있습니다.

원격 저장소에서 컨텐츠를 다운로드 할 때 git pullgit fetch 명령을 사용하여 작업을 수행 할 수 있습니다. git fetch를 두 명령의 '안전한'버전으로 간주 할 수 있습니다. 원격 컨텐츠를 다운로드하지만 로컬 저장소의 작업 상태를 업데이트하지 않고 현재 작업을 그대로 유지합니다. git pull가 더 적극적인 대안입니다. 활성 로컬 브랜치에 대한 원격 컨텐츠를 다운로드하고 즉시 git merge를 실행하여 새 원격 컨텐츠에 대한 병합 커밋을 만듭니다. 진행중인 변경 사항이 있으면 충돌이 발생하고 병합 충돌 해결 과정이 시작됩니다.


git pull 사용시 :

  • 격리되지 않습니다.
  • 지역 개발에 영향을 미칩니다.
  • 명시 적으로 체크 아웃 할 필요는 없습니다. 암시 적으로 git merge를 수행하기 때문입니다.
  • 기본적으로 안전하지 않습니다. 공격적입니다.
  • git fetch에만 영향을 미치는 .git/refs/remotes와 달리, git pull은 .git/refs/remotesand.git/refs/heads/ 모두에 영향을 미칩니다.

흠 ... 그래서 작업 사본을 git fetch로 업데이트하지 않으면 어디에서 변경합니까? Git 페치는 새로운 커밋을 어디에 저장합니까?

좋은 질문입니다. 작업 복사본과 분리되어 있습니다. 그러나 다시 어디? 알아 보자.

프로젝트 디렉토리 (예 : git 명령을 수행하는 위치)에서 다음을 수행하십시오.

  1. ls. 파일 및 디렉토리가 표시됩니다. 시원하지 않습니다.

  2. 이제 ls -a을 (를) 수행하십시오. 그러면 dot files , 즉 .로 시작하는 파일이 표시됩니다. .git라는 디렉토리를 볼 수 있습니다.

  3. cd .git을 (를) 수행하십시오. 이것은 분명히 디렉토리를 변경합니다.
  4. 이제 재미있는 부분이 온다. ls을 수행하십시오. 디렉토리 목록이 나타납니다. refs을 찾고 있습니다. cd refs을 (를) 수행하십시오.
  5. 모든 디렉토리 안에 무엇이 있는지 살펴 보는 것이 흥미롭지 만 두 디렉토리에 중점을 두자. headsremotes. cd을 사용하여 내부를 확인하십시오.
  6. git fetch을 수행하면 /.git/refs/remotes 디렉토리의 항목이 업데이트됩니다. /.git/refs/heads 디렉토리의 내용은 업데이트되지 않습니다.
  7. Any git pull는 먼저 git fetch를 수행하고 /.git/refs/remotes 디렉토리의 항목을 업데이트 한 다음 로컬과 병합 한 다음 헤드를 변경합니다. /.git/refs/heads 디렉토리.

'git fetch'는 어디에 위치합니까?에서도 매우 좋은 관련 답변을 찾을 수 있습니다.

또한 Git branch naming conventions post에서 "슬래시 표기법"을 찾으십시오. Git이 다른 디렉토리에 물건을 배치하는 방법을 더 잘 이해하는 데 도움이됩니다.

18
Honey

내가 이해 한 것에서, 

Git pull - 지정된 리모트 (사용자에 의해 지정됨)에서 내려 와서 우리가 현재있는 브랜치에 즉시 병합합니다. 기본적으로 가져 오기 및 병합 명령이 혼합되어 있습니다.

Git Fetch - Pull과 같지만 병합은하지 않습니다. 따라서 파일을 병합하기 전에 조심스럽게 파일을 모니터 할 수 있습니다. 

이 URL은 이해를 돕기 위해 도움이되어야합니다. git pull, git fetch 및 git clone (및 git rebase)의 차이점.

17
Pragyaditya Das

짧고 간단한 용어로 :

git fetch : 새로운 것들이 있는지보십시오.

git pull : 새로운 것을 가져다가 물건 위에 올려 놓으십시오. 

8
miva2

나는 대답의 대부분이 그 차이를 아주 잘 대답했다고 믿는다. 대신 언제 사용할지 강조하고 싶습니다.

 Enter image description here

가져 오기는 다른 개발자의 업데이트를 받아야하지만 작업을 방해받지 않으려 고 할 때 유용 할 수 있습니다. 오프라인 상태로 전환하고 작업하기를 원하는 사람들은 fetch을 사용하여 온라인 상태가 될 때까지 최신 업데이트를 얻습니다. 나중에 그녀가 변경 사항에 익숙해지면 지사의 것들을 자신의 작업 공간으로 병합합니다.

온라인으로 일하고 변화를 확신하며 최신 코드와 merge을 바로 사용하려는 사람들은 pull을 사용합니다. 나는 fetch을 거의 사용하지 않습니다. GitHub 웹 사이트를 통해 확인한 최신 업데이트를 확인하고 항상 오프라인으로 작업하기 때문입니다. 위에서 언급 한 것처럼 위의 시나리오에서 사용할 수 있습니다.

5
ishandutta2007

힘내 가져 오기

git repository에서 최신 업데이트를 알 수 있도록 도와줍니다. 팀이 여러 GitFlow (기능)을 작업하는 branches을 사용하는 팀에서 일한다고 가정 해 보겠습니다. git fetch --allcommand을 사용하면 branches 내의 모든 새 repository에 대해 알 수 있습니다.

대부분 git fetchgit reset와 함께 사용됩니다. 예를 들어 모든 로컬 변경 사항을 현재 저장소 상태로 되돌리려는 경우입니다.

git fetch --all // get known about latest updates
git reset --hard Origin/[branch] // revert to current branch state

Git pull

이 명령은 현재 branchrepository 상태로 branch을 업데이트합니다. GitFlow을 계속하겠습니다. 여러 기능 branchesmerged ~ develop 분기 였고 프로젝트의 새 기능을 개발하려면 branch을 개발하고 git pull를 수행하여 developbranch의 현재 상태를 가져와야합니다

GitFlow에 대한 문서 https://Gist.github.com/peterdeweese/4251497

3
Andrei Todorut

Git fetch는 원격 저장소의 카탈로그를 로컬에 동기화합니다. 원격지에서 로컬 브랜치로 파일/코드 변경 사항을 병합하지 않습니다.

Git 풀은 현재 로컬 브랜치와 관련된 변경 사항을 다운로드하고 병합합니다.

1
Arnel Lenteria

대답대로 git-pull은 git-fetch + merge입니다. 나는 그것을 지적하고 싶다 :

병합하기 전에 확인하려면 git-fetch 뒤에 git-pull을 사용해야합니다.

cronjob에서 아래 스크립트에 표시된 것처럼 유용합니다.

#!/bin/sh

git fetch upstream
if [ `git rev-list HEAD...upstream/master --count` -eq 0 ]
then
    echo "all the same, do nothing"
else
    echo "update exist, let's pull"
    git pull upstream master
    git Push Origin master
fi
0
Chetabahana