etc./StackOverFlow

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

청렴결백한 만능 재주꾼 2021. 9. 23. 22:51
반응형

질문자 :pupeno


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



답변자 : Greg Hewgill


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

git fetch 를 수행하여 refs/remotes/<remote>/ 추적 분기를 업데이트할 수 있습니다. refs/heads 아래에 있는 로컬 분기를 변경하지 않으며 작업 복사본을 변경하지 않고도 안전하게 수행할 수 있습니다. 나는 심지어 백그라운드에서 cron 작업에서 주기적으로 git fetch 실행하는 사람들에 대해 들었습니다(비록 권장하지는 않지만).

git pull 은 로컬 브랜치를 원격 버전으로 최신 상태로 유지하는 동시에 다른 원격 추적 브랜치를 업데이트하는 것입니다.

git pull 대한 Git 문서에서 :

기본 모드에서 git pullgit fetch 뒤에 git merge FETCH_HEAD 입니다.



답변자 : Mouna Cheikhna


  • pull 을 사용하면 Git이 자동으로 병합을 시도합니다. 컨텍스트에 민감 하므로 Git은 끌어온 커밋을 현재 작업 중인 분기에 병합합니다. pull 은 커밋을 먼저 검토하지 않고 자동으로 커밋을 병합합니다. 지점을 주의 깊게 관리하지 않으면 자주 충돌할 수 있습니다.

  • fetch 때 Git은 현재 분기에 존재하지 않는 대상 분기에서 모든 커밋을 수집 하여 로컬 저장소에 저장합니다 . 그러나 현재 브랜치와 병합하지 않습니다 . 이것은 리포지토리를 최신 상태로 유지해야 하지만 파일을 업데이트하면 손상될 수 있는 작업을 하는 경우에 특히 유용합니다. 커밋을 현재 브랜치에 통합하려면 나중에 merge



답변자 : MikeD


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

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

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

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

  • git fetch 는 "원격 저장소의 로컬 복사본을 최신 상태로 가져옵니다"라는 명령입니다.

  • git pull 은 "원격 저장소의 변경 사항을 내 코드를 보관하는 곳으로 가져옵니다."라고 말합니다.

일반적으로 git pull git fetch 를 수행한 다음 변경 사항을 자신의 코드 리포지토리와 작업 복사본에 병합하여 이 작업을 수행합니다.

주의할 점은 워크스테이션에 프로젝트 복사본이 3개 이상 있는 경우가 많다는 점입니다. 하나의 사본은 자신의 커밋 기록이 있는 자신의 저장소입니다. 두 번째 사본은 편집 및 구축 중인 작업 사본입니다. 세 번째 복사본은 원격 저장소의 로컬 "캐시된" 복사본입니다.



답변자 : Contango


다음은 모든 것이 어떻게 조화를 이루는지에 대한 Oliver Steele의 이미지입니다 .

여기에 이미지 설명 입력

관심이 충분하다면 이미지를 업데이트하여 git clonegit merge 를 추가할 수 있을 것 같습니다.



답변자 : mepster


git fetch 의 한 가지 사용 사례는 다음이 마지막 pull 이후 원격 브랜치의 모든 변경 사항을 알려주는 것입니다. 따라서 실제 풀을 수행하기 전에 확인할 수 있습니다. 그러면 현재 브랜치와 작업 복사본의 파일이 변경될 수 있습니다.

 git fetch git diff ...origin

참조: https://git-scm.com/docs/git-diff 에서 diff 명령의 이중 및 삼중 점 구문에 관해



답변자 : Gerardo


차이점이 무엇인지 이해하는 데 약간의 비용이 들었지만 이것은 간단한 설명입니다. master 는 분기입니다.

저장소를 복제할 때 전체 저장소를 로컬 호스트로 가져옵니다. HEAD 대한 원점/마스터 포인터가 있고 동일한 HEAD 가리키는 마스터가 있음을 의미합니다.

작업을 시작하고 커밋을 수행하면 마스터 포인터를 HEAD + 커밋으로 이동합니다. 그러나 원점/마스터 포인터는 여전히 복제했을 때의 포인터를 가리키고 있습니다.

따라서 차이점은 다음과 같습니다.

  • git fetch 를 수행 하면 원격 저장소(GitHub )의 모든 변경 사항을 가져오고 원본/마스터 포인터를 HEAD 로 이동합니다. 한편 지역 지점 마스터는 계속해서 그것이 있는 곳을 가리킬 것입니다.
  • git pull 을 수행하면 기본적으로 가져오기(이전에 설명한 대로)를 수행하고 마스터 브랜치에 대한 새로운 변경 사항을 병합하고 포인터를 HEAD 로 이동합니다.


답변자 : Snowcrash


간단히

git fetch pull 과 비슷하지만 병합되지 않습니다. 즉, 원격 업데이트( refsobjects )를 가져오지만 로컬은 동일하게 유지됩니다(즉, origin/master 는 업데이트되지만 master 는 동일하게 유지됨).

git pull 은 원격에서 끌어와 즉시 병합합니다.

git clone 은 저장소를 복제합니다.

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단계: 로컬과 원격의 차이점에 대한 자세한 내용 은 로컬 git 브랜치를 원격 브랜치와 비교하는 방법을 참조하세요.

git rebase origin 을 수행하는 것이 더 정확할 것입니다(예: 빠르게 변화하는 repo에서). 다른 답변에서 @Justin Ohms 의견 을 참조하십시오.

참조: http://longair.net/blog/2009/04/16/git-fetch-and-merge/



답변자 : thedarkpassenger


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

여기에 이미지 설명 입력



답변자 : Vinko Vrsalovic


git-pull - 다른 저장소 또는 로컬 분기에서 가져오고 병합
개요

자식 풀 …
설명

주어진 매개변수로 git-fetch를 실행하고 git-merge를 호출하여 
검색된 헤드를 현재 분기로 가져옵니다. --rebase를 사용하여 git-rebase를 호출합니다. 
git-merge 대신.

를 사용할 수 있으니 참고하세요. (현재 디렉토리)를 가져올 <repository>로 
로컬 저장소에서 — 로컬 브랜치를 병합할 때 유용합니다. 
현재 분기로.

또한 git-pull 자체 및 기본 git-merge를 위한 옵션에 유의하십시오. 
git-fetch를 위한 옵션 앞에 지정해야 합니다.

히스토리를 병합하려면 끌어오고, 여기 주변에 어떤 사람이 일부 기사에 태그를 지정했기 때문에 '코데즈를 원하면' 가져올 것입니다.



답변자 : Antonio Bardazzi


원격 리포지토리에서 가져오고 차이점을 확인한 다음 가져오거나 병합할 수 있습니다.

origin 이라는 원격 저장소와 원격 브랜치인 origin/master master 라는 브랜치에 대한 예입니다.

 git checkout master git fetch git diff origin/master git rebase origin master


답변자 : Alireza


git pullgit fetch 에 대한 몇 가지 정보가 있으므로 실제 차이점을 이해할 수 있습니다... 몇 가지 간단한 단어로 fetch 는 최신 데이터를 가져오지만 코드 변경 사항이 아니며 현재 로컬 분기 코드를 엉망으로 만들지 않습니다. , 그러나 코드 변경 사항을 가져 와서 로컬 브랜치에 병합하고 각각에 대한 자세한 내용을 보려면 계속 읽으십시오.

자식 가져오기

그것은 당신의 로컬 저장소에 모든 심판과 객체와 새로운 가지를 다운로드합니다 ...

하나 이상의 다른 리포지토리에서 분기 및/또는 태그(총칭하여 "refs")와 히스토리를 완료하는 데 필요한 개체를 가져옵니다. 원격 추적 분기가 업데이트되었습니다(이 동작을 제어하는 방법은 아래 설명 참조).

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

git fetch는 단일 명명된 저장소 또는 URL에서 가져오거나 원격이 있는 경우 한 번에 여러 저장소에서 가져올 수 있습니다. 구성 파일의 항목. (git-config 1 참조).

원격이 지정되지 않으면 현재 분기에 대해 구성된 업스트림 분기가 없는 한 기본적으로 원본 원격이 사용됩니다.

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


자식 풀

원격 에서 로컬의 현재 분기 로 변경 사항을 적용합니다 ...

원격 저장소의 변경 사항을 현재 분기로 통합합니다. 기본 모드에서 git pull은 git merge FETCH_HEAD가 뒤따르는 git fetch의 약어입니다.

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

git-fetch 1 에 전달된 원격 저장소의 이름이어야 합니다. 임의의 원격 참조(예: 태그 이름) 또는 해당 원격 추적 분기가 있는 참조 모음(예: refs/heads/ :refs/remotes/origin/ )의 이름을 지정할 수 있지만 일반적으로 이름입니다. 원격 저장소에 있는 분기의

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


또한 git fetchgit pull 함께 작동하는 방법을 보여주기 위해 아래 의 시각적 개체를 만듭니다...

git pull 및 git fetch



답변자 : jfmercer


짧고 쉬운 대답은 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.5 man 페이지에서 가져온 것입니다.

이것은 잠재적으로 위험한 작동 모드입니다. 그것은 당신이 이미 그 역사를 출판했을 때 좋은 징조가 아닌 역사를 다시 씁니다. git-rebase(1)을 주의 깊게 읽은 경우가 아니면 이 옵션을 사용하지 마십시오.



답변자 : th3sly


여기에 이미지 설명 입력

이 대화형 그래픽 표현은 git을 이해하는 데 매우 유용합니다. http://ndpsoftware.com/git-cheatsheet.html

git fetch 는 원격 저장소에서 로컬 저장소로 변경 사항을 "다운로드"합니다. git pull 은 변경 사항을 다운로드하여 현재 브랜치에 병합합니다. "기본 모드에서 git pullgit fetch 뒤에 오는 git merge FETCH_HEAD 입니다."



답변자 : Sazzad Hissain Khan


보너스:

위의 답변에서 pull & fetch에 대해 이야기하면서 흥미로운 트릭을 공유하고 싶습니다.

git pull --rebase

이 위의 명령은 많은 시간을 절약한 내 자식 생활에서 가장 유용한 명령입니다.

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

자세한 내용은 http://gitolite.com/git-pull--rebase 에서 찾으십시오.



답변자 : Justus Romijn


나는 이러한 것들을 파악하기 위해 상황을 시각적으로 표현하는 것을 좋아합니다. 다른 개발자도 보고 싶어할 수 있으므로 여기에 추가합니다. 다 맞는지는 모르겠지만 틀린 부분이 있으면 댓글 부탁드립니다.

 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.

원격 미러를 가져오면 몇 가지 주요 이점은 다음과 같습니다.

  • 성능 (네트워크를 통해 압축하지 않고 모든 커밋 및 메시지 스크롤)
  • 로컬 리포지토리의 상태에 대한 피드백 (예: Atlassian의 SourceTree를 사용하면 원본에 비해 커밋이 앞서 있는지 뒤쳐져 있는지 알려주는 전구를 제공합니다. 이 정보는 GIT FETCH로 업데이트할 수 있습니다.)


답변자 : Aman Tiwari


GIT의 차이점은 가져 오기와 GIT의 풀은 다음과 같은 시나리오를 설명 할 수있다 : (명심 사진은 더 크게 말보다! 내가 제공 한 회화 적 표현을 말하는 것을)

팀원들과 함께 프로젝트를 진행하는 예를 들어 보겠습니다. 따라서 프로젝트의 하나의 주요 분기가 있고 모든 기여자는 이를 자신의 로컬 저장소로 분기한 다음 이 로컬 분기에서 작업하여 모듈을 수정/추가한 다음 다시 기본 분기로 푸시해야 합니다.

따라서 로컬 저장소에서 기본 프로젝트를 분기할 때 두 분기의 초기 상태 A , BC 는 프로젝트에서 이미 완료된 모듈입니다)

여기에 이미지 설명 입력

이제 새 모듈에 대한 작업을 시작했으며( D D 모듈을 완료하면 이를 메인 브랜치로 푸시하려고 합니다. 하지만 그 동안 팀원 중 한 명이 새 모듈 E , F 및 수정된 C .
이제 일어난 일은 프로젝트의 원래 진행 상황에 비해 로컬 저장소가 부족하여 기본 분기에 대한 변경 사항을 푸시하면 충돌이 발생하고 모듈 D 가 오작동할 수 있다는 것입니다.

여기에 이미지 설명 입력

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

1. Git Fetch - 로컬 브랜치에 없는 원본/메인 브랜치 프로젝트에 적용된 모든 변경 사항을 다운로드합니다. 그리고 Git Merge 명령이 리포지토리 또는 브랜치에 가져온 변경 사항을 적용할 때까지 기다립니다.

여기에 이미지 설명 입력

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

여기에 이미지 설명 입력

2. Git 풀 - 이것은 로컬 브랜치를 오리진/메인 브랜치로 업데이트합니다. 즉, 실제로 하는 일은 Git Fetch와 Git 병합의 조합입니다. 하지만 이로 인해 충돌이 발생할 수 있으므로 깨끗한 복사본과 함께 Git Pull을 사용하는 것이 좋습니다.

여기에 이미지 설명 입력



답변자 : pn1 dude


나도 이것 때문에 고생했다. 사실 나는 정확히 같은 질문에 대한 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+ - --------------------- ----------------------- -----------------------

풀이 있는 세 개의 리포지토리

 --------------------- ----------------------- ----------------------- - 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+ - --------------------- ----------------------- -----------------------

이것은 가져오기가 매우 중요한 이유를 이해하는 데 도움이 되었습니다.



답변자 : Selvamani


우리는 단순히 말합니다:

 git pull == git fetch + git merge

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

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



답변자 : Michael Durrant


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

git pull 않는 git fetch 그러나 해당 지점의 현재 로컬 버전으로 추적 지점의 코드를 병합합니다. 아직 변경 사항에 대한 준비가 되지 않았다면 git fetch 하세요.



답변자 : ntanase


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



답변자 : Honey


간단히 말해서, 인터넷 연결 없이 비행기에 오르려고 했다면... 출발하기 전에 git fetch origin <branch> 수행할 수 있습니다. 모든 변경 사항을 컴퓨터로 가져오지만 로컬 개발/작업 공간과 별도로 유지합니다.

비행기에서 로컬 작업 공간을 변경한 다음 이전에 가져온 것과 병합한 다음 인터넷에 연결하지 않고도 잠재적인 병합 충돌을 모두 해결할 수 있습니다. 그리고 누군가가 원격 저장소에 새로운 변경을 가하지 않았다면 일단 목적지에 도착하면 git push origin <branch> 하고 커피를 사러 가십시오.


이 멋진 Atlassian 튜토리얼에서 :

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

가져오기는 다른 사람들이 작업한 것을 보고 싶을 때 하는 것입니다. 중앙 기록이 어떻게 진행되었는지 볼 수 있다는 점에서 SVN 업데이트와 유사하지만 실제로 변경 사항을 저장소에 병합하지 않아도 됩니다. Git은 가져온 콘텐츠를 기존 로컬 콘텐츠에서 분리 하므로 로컬 개발 작업에 전혀 영향을 미치지 않습니다 . git checkout 명령을 사용하여 명시적으로 체크아웃해야 합니다. 이렇게 하면 로컬 저장소와 통합하기 전에 커밋을 검토하는 안전한 방법을 가져옵니다.

원격 리포지토리에서 콘텐츠를 다운로드할 때 git pullgit fetch 명령을 사용하여 작업을 수행할 수 있습니다. git fetch 두 명령의 '안전한' 버전을 고려할 수 있습니다. 원격 콘텐츠를 다운로드하지만 로컬 저장소의 작업 상태를 업데이트하지 않고 현재 작업을 그대로 유지합니다. git pull 은 보다 적극적인 대안이며 활성 로컬 분기에 대한 원격 콘텐츠를 다운로드하고 즉시 git merge 를 실행하여 새 원격 콘텐츠에 대한 병합 커밋을 생성합니다. 진행 중인 변경 사항이 보류 중인 경우 충돌이 발생하고 병합 충돌 해결 흐름이 시작됩니다.


git pull :

  • 당신은 어떤 고립도 얻지 못한다.
  • 명시적으로 체크아웃할 필요는 없습니다. 암시 적으로 git merge 수행하기 때문입니다.
  • 병합 단계는 지역 개발에 영향을 미치고 충돌을 일으킬 수 있습니다.
  • 기본적으로 안전하지 않습니다. 공격적입니다.
  • .git/refs/remotes 에만 영향을 미치는 git fetch 와 달리 .git/refs/remotes .git/refs/heads/ 모두에 영향을 미칩니다.

git fetch 작업 복사본을 업데이트하지 않는다면 어디서 변경을 하고 있습니까? Git fetch는 새 커밋을 어디에 저장합니까?

좋은 질문입니다. 무엇보다도 heads 또는 remotes 은 새 커밋을 저장하지 않습니다. 그들은 단지 커밋에 대한 포인터를 가지고 있습니다. 따라서 git fetch 를 사용하면 최신 git 개체 (blob, tree, commits. 개체를 완전히 이해하려면 git internals에서 이 비디오 시청)를 다운로드하지만 해당 분기의 최신 커밋을 가리키도록 remotes heads 디렉토리에 있는 브랜치의 포인터가 업데이트되지 않았기 때문에 여전히 작업 복사본과 격리되어 있습니다. merge / pull 시에만 업데이트됩니다. 하지만 또 어디? 알아 보자.

git 명령을 수행하는 위치)에서 다음을 수행합니다.

  1. ls . 그러면 파일 및 디렉토리가 표시됩니다. 멋진 건 없어, 나도 알아.

  2. 이제 ls -a . 이것은 점 파일 , 즉 로 시작하는 파일을 표시 . .git 이라는 디렉토리를 볼 수 있습니다.

  3. cd .git 하세요. 이것은 분명히 디렉토리를 변경합니다.

  4. 이제 재미있는 부분이 나옵니다. 할 ls . 디렉토리 목록이 표시됩니다. 우리는 refs 찾고 있습니다. cd refs .

  5. 모든 디렉토리 내부에 무엇이 있는지 보는 것은 흥미롭지만 그 중 두 가지에 집중해 보겠습니다. headsremotes . cd 를 사용하여 내부도 확인하십시오.

  6. 어느 git fetch 당신이의 포인터를 업데이트합니다 할 것을 /.git/refs/remotes 디렉토리. /.git/refs/heads 디렉토리의 아무 것도 업데이트하지 않습니다.

  7. 모든 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 만 수행했다면 로컬 git은 2개의 커밋이 추가되었다는 것을 알지 못할 것입니다. 그리고 그것은 단지 다음과 같이 말할 것입니다:

 Already on 'master' Your branch is up to date with 'origin/master'.

그러나 그것은 시대에 뒤떨어지고 잘못된 것입니다. git은 자신이 알고 있는 정보만을 기반으로 피드백을 제공하기 때문입니다. 아직 풀지 않은 새 커밋을 잊어 버립니다 ...


지점에서 로컬로 작업하는 동안 원격에서 변경된 사항을 볼 수 있는 방법이 있습니까?

일부 IDE(예: Xcode)는 매우 똑똑하고 git fetch 의 결과를 사용하며 현재 작업 분기의 원격 분기에서 변경된 코드 행에 주석을 달 수 있습니다. 해당 라인이 로컬 변경과 원격 브랜치 모두에 의해 변경된 경우 해당 라인은 빨간색으로 주석 처리됩니다. 이것은 병합 충돌이 아닙니다. 잠재적인 병합 충돌입니다. 원격 브랜치에서 git pull 을 수행하기 전에 향후 병합 충돌을 해결하는 데 사용할 수 있는 헤드업입니다.

여기에 이미지 설명 입력


재미있는 팁:

원격 분기를 가져온 경우 예:

 git fetch origin feature/123

그런 다음 이것은 원격 디렉토리로 이동합니다. 로컬 디렉토리에서는 아직 사용할 수 없습니다. 그러나 DWIM(Do what I mean)을 통해 해당 원격 지점에 대한 체크아웃을 단순화합니다.

 git checkout feature/123

더 이상 다음을 수행할 필요가 없습니다.

 git checkout -b feature/123 origin/feature/123

자세한 내용은 여기를 참조하세요.



답변자 : Pinkesh Sharma


힘내 가져오기

가져오기를 통해 원본에서 로컬 분기로 변경 사항을 다운로드합니다. Fetch.AI는 다른 사람이 수행했지만 로컬 저장소에 없는 모든 커밋에 대해 원격 저장소에 요청합니다. Fetch.AI는 이러한 커밋을 다운로드하여 로컬 저장소에 추가합니다.

힘내 병합

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

힘내 풀

가져오기 및 병합은 이 둘을 결합한 명령인 pull이 생성될 만큼 충분히 자주 함께 실행됩니다. pull은 가져오기를 수행한 다음 병합하여 다운로드한 커밋을 로컬 분기에 추가합니다.



답변자 : Rohitashv Singhal


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

git pull 은 원격 브랜치를 가져와서 병합합니다.

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

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



답변자 : Pawel Furmaniak


Git을 사용하면 최신 커밋 후에 시간순으로 오래된 커밋을 적용할 수 있습니다. 이 때문에 리포지토리 간에 커밋을 전송하는 작업은 두 단계로 나뉩니다.

  1. 원격 브랜치에서 로컬 repo 내부의 이 원격 브랜치 복사본으로 새 커밋을 복사합니다.

    (repo에서 repo 작업으로) master@remote >> remote/origin/master@local

  2. 새 커밋을 로컬 브랜치에 통합

    (repo 내부 작업) remote/origin/master@local >> master@local

2단계를 수행하는 두 가지 방법이 있습니다. 다음을 수행할 수 있습니다.

  1. 마지막 공통 조상 이후에 로컬 분기를 분기하고 로컬 저장소에 고유한 커밋에 병렬로 새 커밋을 추가하고 커밋을 병합하고 분기를 닫음으로써 완료됩니다.
  2. 마지막 공통 조상 다음에 새 커밋을 삽입하고 로컬 저장소에 고유한 커밋을 다시 적용합니다.

git 용어로 1단계는 git fetch , 2단계는 git merge 또는 git rebase

git pullgit fetchgit merge



답변자 : Marcus Thornton


Git은 두 가지 명령을 사용하여 원격에서 로컬로 최신 버전의 분기를 가져옵니다.

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

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

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

    git pull origin master

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



답변자 : Donal


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

이것을 이해하려면 먼저 로컬 git이 로컬 저장소뿐만 아니라 원격 저장소의 로컬 복사본도 유지 관리한다는 것을 이해해야 합니다.

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

git pull 은 자신의 코드를 보관하는 원격 저장소의 변경 사항을 가져옵니다. 일반적으로 git pull git fetch 를 수행한 다음 변경 사항을 자신의 코드 리포지토리와 작업 복사본에 병합합니다.



답변자 : Iggy


자식 풀 == ( 자식 가져오기 + 자식 병합)

git fetch는 로컬 브랜치로 변경되지 않습니다.

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



답변자 : Montells


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

git pull 명령은 실제로 구성에 따라 git merge 또는 git rebase 명령이 뒤따르는 git fetch shortcut 입니다. git pull 이 fetch와 rebase가 뒤따르는 방식으로 Git 리포지토리를 구성할 수 있습니다.



답변자 : Mohideen bin Mohammed


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

여기에 이미지 설명 입력

여기,

 git pull

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

하지만 ,

자식 가져오기

git rebase 를 사용하여 수동으로 리베이스해야 합니다.

예: 서버 마스터에서 가져와 내 로컬 마스터에서 리베이스할 것입니다.

1) git pull ( 리베이스가 자동으로 수행됨):

 git pull origin master

여기 origin 은 원격 repo 마스터 가 지점입니다.

2) git fetch(수동으로 리베이스해야 함):

 git fetch origin master

원본에서 서버 변경 사항을 가져옵니다. 직접 리베이스할 때까지 로컬에 있습니다. 코드를 확인하여 수동으로 충돌을 수정해야 합니다.

 git rebase origin/master

이것은 코드를 로컬로 리베이스합니다. 그 전에 올바른 지점에 있는지 확인하십시오.



답변자 : Pokemon


실제로 Git은 자신의 코드와 원격 저장소의 복사본을 유지 관리합니다.

git fetch 명령은 원격 저장소에서 데이터를 가져와 로컬 복사본을 최신 상태로 만듭니다. 이것이 필요한 이유는 다른 사람이 코드를 일부 변경했을 수 있고 사용자가 자신을 최신 상태로 유지하기를 원하기 때문입니다.

git pull 명령은 원격 저장소의 변경 사항을 자신의 코드를 보관하는 위치로 가져옵니다. 일반적으로 git pull 은 원격 저장소의 로컬 복사본을 최신 상태로 유지하기 위해 먼저 'git fetch'를 수행하고 변경 사항을 자신의 코드 저장소와 작업 복사본에 병합합니다.



출처 : Here


출처 : http:www.stackoverflow.com/questions/292357/what-is-the-difference-between-git-pull-and-git-fetch">

반응형