원본에서 가져올 때 "git pull"명령의 차이점은 무엇입니까?


82

이 명령의 차이점은 무엇입니까? :

# 1
git pull
# 2
git pull origin
# 3
git pull origin master
# 4
git pull origin/master
# 5
git pull origin HEAD:master

글쎄, 맨 페이지를 읽은 후에도 정확히 어떤 일이 발생했는지 모든 경우에 분명하지는 않습니다. 예 : git pull구성된 업스트림 이 없는 것은 무엇을 의미 합니까? (맨 페이지에는 구성된 업스트림이 기본값이라고 만 나와 있습니다.)
michas

요컨대 : 1. 현재 분기에 대한 구성 없이는 실패하고 그렇지 않으면 원격 이름이있는 2.와 같습니다. 2. 주어진 원격지에 대해 기본 가져 오기 구성을 사용하고 첫 번째 구성을 병합하는 반면 3.에서는 가져오고 병합 할 항목을 지정합니다. 4. 유효하지 않습니다, imho. 5. (작동한다면) 원격 HEAD를 refs / remotes / origin / master에 넣고 병합합니다.
andi5

2
이 질문은에 대한 검색 결과 중 하나이기 때문에이 질문을 다시 여는 데 투표했습니다 site:stackoverflow.com git Difference "git pull" "git pull origin master".

답변:


81

git pull동시에 다른 작업을 수행하는 편리한 명령입니다. 기본적으로 git fetch원격 저장소에 연결하고 새 커밋을 가져 오는, 및 git merge(또는 git rebase) 새 커밋을 로컬 브랜치에 통합 하는 조합 일뿐 입니다. 관련된 두 개의 다른 명령 때문에의 의미 git pull가 항상 분명하지는 않습니다.

로컬 분기에 대한 업스트림을 구성 할 수 있습니다. 새로 복제 한 후에는 로컬 브랜치 "마스터", 원격 "오리진"및 마스터 브랜치가 업스트림으로 "오리진 / 마스터"를 갖게됩니다. 아래에서이 설정을 가정합니다. ( git branch -vv.git / config를 사용 하거나 보고하여 업스트림 구성을 볼 수 있습니다 .)

이제 귀하의 질문에 대해 :

  1. git pull= git fetch origin+ git merge origin/master(또는 업스트림이 무엇이든)
  2. git pull origin= git pull(오리진이 업스트림 리모컨 인 경우)
  3. git pull origin master= git fetch origin master+git merge FETCH_HEAD
  4. git pull origin/master : "origin / master"라는 원격이 없으면 유효하지 않습니다.
  5. git pull origin HEAD:master: 로컬 마스터를 원점에서 HEAD가 가리키는 모든 것으로 직접 재설정하려고합니다. (이러지 마세요.)

2
git pull origin HEAD:master나쁜 아이디어를 실행 하고 있습니까?
Ryan Edwards

2
오른쪽은 원격 지점이어야합니다. 매뉴얼 페이지의 경고를 참조하십시오. 이것을 사용하는 경우 무엇을하고 있는지 알고 있어야합니다.
michas 2013

내가 someother 지점에 있다면 것이다 git pull해당 분기 또는 마스터 풀
aWebDeveloper

1
@aWebDeveloper : 완전성을 위해 : git pull origin HEAD:master본질적으로 (문자 그대로 스크립트가 Git 2.6에서 C로 다시 작성 될 때까지) HEAD:master부분을에 전달 git fetch하므로 git fetch해당 단계에서 수행되는 작업이 수행됩니다. 그런 다음 git fetch단계에서 얻은 커밋 해시를 사용하여 병합하거나 리베이스합니다 . Refspec은 source : dest 이므로 HEAD번역 할 다른 Git에 제공됩니다. 따라서 다른 Git에 달려 있지만 일반적으로 다른 Git HEADmaster. 혼자가 아니라면 mastermerge-or-rebase는 fetch-updated master( dest )를 사용합니다 ( fetch실패 하지 않는 한 ).
torek

1
주의해야 할 또 다른 사항 : 절대하지 마십시오 git pull origin br1 br2. 이것이되어야하는 것처럼 보이고 느껴지 git checkout br1; git pull origin; git checkout br2; git pull origin지만 그렇지 않습니다! 대신 실제로 git fetch origin && git merge origin/br1 origin/br2두 개의 가져 오기 결과를 현재 브랜치에 병합하는 다음을 수행 합니다. Git은 octopus merge 라고합니다 . 이것은 누구도 원하는 것이 아닙니다. 아마 git pull완전히 명령을 거부해야 (정말 사람 않습니다 처음 가져 실행할 수 있습니다 싶지는 다음 병합).
torek

18

A pull는 기본적으로 fetch(원격 저장소에서 일부 커밋 및 관련 개체를 사용자의 저장소로 가져 오는) 다음 작업 복사본에이를 "적용"하는 작업입니다. 두 번째 단계는 기본적으로 a를 사용하여 수행 merge되지만 pull.rebase변수를로 설정하면 true대신 리베이스됩니다.

pull명령 과 함께 나타나는 두 가지 질문이 있습니다 . 첫 번째는 정확히 무엇을 가져 오는가? 두 번째는 이러한 변경 사항을 작업 복사본에 어떻게 적용합니까? 첫 번째부터 시작하겠습니다. 명령의 전체 형식은 다음과 같습니다.

git pull [options] [repository] [<refspec>...]

options(수 있도록 예를 들어 --rebase 제어 동작 것으로 플래그입니다 pullA와 작업을 fetch+ rebase하더라도 pull.rebase이다 false).

repository 가져올 원격지의 이름 (또는 URL)입니다.

refspecs 가져 오려는 원격 참조와 현재 작업 복사본의 위치를 ​​지정하는 간결한 방법입니다.

먼저 가장 명확한 형식을 취합시다.

 git pull origin branch1:branch2

이것은 기본적으로 branch1호출 된 원격 참조의 변경 사항을 origin가져온 다음 로컬 브랜치로 병합 (또는 리베이스)합니다 branch2. 예를 들어라고 말하면 . 와 동일한 커밋을 가리키는 git pull origin master:dev로컬 분기가 호출 dev됩니다 master. refspec을 지정하는 방법에 대한 자세한 내용은 여기에 있습니다 . a *를 사용하여 여러 refspec을 나타낼 수 있습니다 . 예를 들어 git pull origin refs/heads/*:refs/heads/*는 모든 분기 (아래에 저장 됨 heads)를 로컬 저장소로 가져와 동일한 이름을 가진 로컬 분기로 병합합니다.

이제 기본 작동 방식에 대해 논의하기 위해 인수를 하나씩 제거해 보겠습니다. 먼저 refspec에서 대상을 제거하고 간단히 git pull origin branch1. 이것은 먼저 로컬 저장소로 fetch의 원격 분기 branch1입니다. 라는 임시 참조로 사용할 수 있습니다 FETCH_HEAD. 그 후, git merge FETCH_HEAD이 분기를 현재 활성 분기 (예 :)에 병합하는 실행 됩니다 HEAD. 이것은 로컬 브랜치에 있고 원격에서 해당 브랜치로 변경 사항을 가져 오려고 할 때 종종 수행됩니다.

이제 branch1완전히 삭제하고 git pull origin. 이제 git은 ( origin) 에서 가져올 위치를 알고 있지만 무엇을 가져올 지 모릅니다. 이것에 대한 몇 가지 기본값이 있습니다. 대부분의 시나리오는 구성 파일에 branch.<name>.merge옵션이 merge있는 경우입니다 (예 : 섹션 내에서 호출되는 항목 [branch "master"]). 그렇다면 작업에 대한 참조 사양을 사용합니다.

origin완전히 삭제 하고 간단히 말하면 git pull구성을 확인 branch.<name>.remote하여 가져올 원격을 지정하는 것이 있는지 확인합니다 . 위와 함께 무엇을 당겨야하는지 알려줍니다.

포인트 # 4 및 # 5는 일반적인 사용 사례가 아닙니다. 첫 번째 origin/master는 가능성이 낮은 원격 호출이있는 경우 의미가 있습니다 . origin/master보통 트랙 로컬 참조 master리모콘 분기 origin. 두 번째는 HEAD원격 (일반적으로 기본 브랜치)에서 변경 사항을 가져 와서 master로컬로 병합 하려고합니다 master. 이것은 당신이 정기적으로하고 싶은 일일 수 있지만, 명령은 꽤 비 관습 적이며 자주 사용하는 것을 보지 못했습니다.

몇 가지 세부 사항을 생략했지만 일상 업무에서 안전하고 편안하게 유지하기에 충분할 것입니다. 자세한 내용은에 대한 매뉴얼 페이지를 확인하십시오 git pull.


"예를 들어 git pull origin master : dev라고 말하면 dev라는 로컬 브랜치를 얻게되며 이는 master와 동일한 커밋을 가리 킵니다." 그렇다면 dev라는 새 브랜치를 다운로드하면 master를 가리킬 것입니까?
user33276346

아니요, master원격 에서 분기 를 가져 오지만 dev로컬에서 호출 됩니다.
Noufal Ibrahim

git pull origin refs/heads/*:refs/heads/*나를 위해 일하지 않았고 no matches found: refs/heads/*:refs/heads/*. 나도 시도 git pull origin refs/remotes/origin/*:refs/heads/*했지만 작동하지 않았습니다. 나는 하나의 명령으로 모든 분기를 원격으로 가져 오는 것이 가능하지 않으며 이러한 모든 분기를 후속 로컬 분기로 병합 / 리베이스하는 것도 가능하지 않습니다.
Ben Butterworth
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.