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

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

# 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동시에 다른 작업을 수행하는 편리한 명령입니다. 기본적으로 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가 가리키는 모든 것으로 직접 재설정하려고합니다. (이러지 마세요.)


답변

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.


답변