체크 아웃하지 않고 힘내 풀?


133

나는 작업중 인 브랜치 내에서 git pull 및 기타 명령을 실행하는 데 익숙합니다. 하지만 여러 사람이 작업하는 개발 서버를 설정 했으므로 작업 할 때 분기를 전환 할 필요가 없습니다. 우리 모두가 사용하는 github 저장소에서 dev 서버의 기존 브랜치를 업데이트하려는 경우 올바른 방법은 무엇입니까? 'git pull github branchname'명령을 실행하면 분기를 현재 분기로 끌어 올 수 있습니까?

내가 찾을 수있는 모든 git 예제는 먼저 'checkout branchname'을 실행 한 다음 풀을 수행한다는 것을 나타내는 것 같습니다. 나는 그것을 피하려고 노력하고 있습니다. 내가 말했듯이 이것은 기존 브랜치이며 최신 버전으로 업데이트하고 싶습니다.


6
git fetch당신이 원하는 것을해야합니다.
Brad

11
git fetch특정 원격 분기를 추적하도록 설정된 경우에도 로컬 분기가 아닌 원격 분기의 로컬 복사본을 업데이트합니다. 원하는 것일 수도 있고 아닐 수도 있습니다. (편집 : 기본적으로, 어쨌든. 다르게 동작하도록 인수를 사용하여 호출 할 수 있지만이 경우 인수는 실제로 지적되어야합니다.)

2
이해가 안 돼요 ... 모두가 개발 서버에서 동일한 로컬 저장소를 사용하고 있습니까? 그래서 지점을 바꾸고 싶지 않습니까? 모든 사람이 작업 할 수있는 개인용 복제본을 만드는 것은 어떻습니까? git : update a local branch without check out? 도 참조 하세요. .

답변:


221

나는 똑같은 것을 찾고 있었고 마침내 다른 stackoverflow 게시물에서 나를 위해 일한 답을 찾았습니다 : 체크 아웃을 사용하지 않고 Git 브랜치를 병합, 업데이트 및 가져 오기

원래:

git fetch <remote> <srcBranch>:<destBranch>


소스 브랜치를 지정하는 대신 업스트림 브랜치를 사용하는 방법이 있습니까?
cambunctious

슬프게도,에 없는 pull매개 변수가 있습니다 fetch: -s <strategy>, -Xsubtree=...이것은 나에게 중요했기 때문에 동등한 대체물이 아닙니다. 여기에 설명 된 문제가 있습니다 : congruityservice.com/blog/… 하지만 제 경우에는 체크 아웃을 전혀 원하지 않았습니다.
Andry 2019

2
풀에 관한 질문을 고려할 때 답은 git pull <remote> <srcBranch>:<destBranch>.
J Woodchuck

커밋이 이미 로컬 저장소에있는 경우 :git fetch . origin/master:master
Evan

74

나는 현재 기능 변경 사항을 커밋하거나 숨기고, 마스터 브랜치를 체크 아웃하고 , pull명령을 수행하여 원격에서 로컬 master작업 공간으로 모든 것을 가져온 다음 기능 브랜치로 다시 전환하고 a rebase를 수행하여 최신 상태로 유지해야한다는 매우 동일한 문제가 발생 했습니다. 석사.

이 모든 작업을 수행하려면 작업 영역을 기능 분기에 유지하고 모든 전환을 피하십시오.

git fetch origin master:master

git rebase master

그리고 그것은 트릭을 훌륭하게 수행합니다.


19
당신이 있다면 답변 아래는, 당이 좋은 조언을하지만 묻히는 lede이다 feature로컬 업데이트되고 싶지 및 ALL master, 원산지와 일치 할 건드리지 않고하는 feature단지 할 git fetch origin master:master... 그리고 당신이 한 것처럼입니다 stash-checkout 마스터-풀-체크 아웃 Feature-stashPop!
btown

7
오리진 마스터를 로컬 브랜치에 병합하기 위해 로컬 마스터를 가져올 필요가 없습니다. 사용할 수 있습니다 git merge origin/master
Dan

-1

이후에 지역 지점 팁을 다시 가리 키려면 git fetch몇 가지 추가 단계가 필요합니다.

보다 구체적으로는 github의의 REPO는 가지가 가정 D, B, C,과 master(이 홀수 지사 이름 세트에 대한 이유는 한 순간에 분명 할 것이다). 당신은 호스트에 devhost있고 origingithub 저장소가있는 저장소에 있습니다. 당신은 할 git fetch모든 것을 객체 및 업데이트를 제공하는, origin/D, origin/B, origin/C,와 origin/master. 여태까지는 그런대로 잘됐다. 그러나 지금 당신은 당신이 뭔가에, 일이하고 싶은 말은 devhost에, 지방 지사 D, B, C, 및 / 또는 master?

나는 (어쨌든 나에게) 다음과 같은 명백한 질문이 있습니다.

  1. 모든 지점 의 팁을 업데이트 하려는 이유무엇 입니까?
  2. 일부 분기 (예 B:)에 원격 (github) 저장소에없는 커밋이있는 경우 어떻게됩니까? 병합, 리베이스 또는 ...?
  3. 일부 브랜치 (예 :)에 C있고 작업 디렉토리 및 / 또는 색인이 수정되었지만 커밋되지 않은 경우 어떻게됩니까?
  4. 원격 저장소에 새 분기가 추가 ( A)되거나 분기가 삭제 ( D) 되면 어떻게 됩니까?

(1)에 대한 답이 " devhost실제로 개발을위한 것이 아니기 때문 이 아니라 단순히 로컬에서 사용할 수있는 github 저장소 사본을 보관하는 로컬 미러이므로 실제 개발자가 모두 천천히 읽는 대신 빠르게 읽을 수 있습니다. github "이면"일반 "저장소가 아닌"미러 "가 필요합니다. 작업 디렉토리가 없어야하며 푸시도 허용하지 않아야합니다.이 경우 나머지 질문은 사라집니다.

다른 답이 있으면 (2-4) 문제가됩니다.

어쨌든 다음은 원격 참조를 기반으로 로컬 참조를 업데이트하는 방법 git fetch -p입니다 (예 : 실행 후 ).

for ref in $(git for-each-ref refs/remotes/origin/ --format '%(refname)'); do
    local=${ref#refs/remotes/origin/}
    ... code here ...
done

... code here ...섹션 의 내용은 질문에 대한 답변에 따라 다릅니다 (2-4).


-5

사용하다

git fetch

대신. 리포지토리의 원격 참조 및 개체를 업데이트하지만 로컬 분기, HEAD 및 작업 트리는 그대로 둡니다.


17
그러나 그것은 그의 개발 서버의 로컬 브랜치를 업데이트하지 않습니다. 그것은 asker의 github repo에 해당하는 git 폴더의 "origin"브랜치를 새로 고칩니다.
ANeves

1
또는 내 버전의 문제를 원할 경우 : "origin / master of ssh : // bla bla bla"가 아닌 "master"로 작업 분기를 병합하고 싶습니다. 가져 오기를 수행하면 원본 / 마스터가 업데이트되지만 마스터는 업데이트되지 않습니다.
ANeves

-6

편집 : 'git pull'사용 그것은 저장소에서 모든 분기를 가져오고 분기가 현재 분기에 대해서만 로컬 시스템에서 종료되는 경우 최신으로 업데이트합니다. 참고 : git pull은 모든 분기를 가져 오지만 현재 분기 만 병합하는 fetch + merge와 동일합니다.


6
더 좋은 말 : pull가져 오기 (예, 원격에서 모든 것을 가져옴)를 수행 한 다음 현재 분기 만 병합합니다 .
torek

내 반대표로 의도 된 공격은없고, 당신이 말하는 것이 정확하고 사실적이라는 것을 알고 있으며, OP는 실제로 풀이하는 일에 대한 확인을 요청했지만 (당신은 그에게 그 설명을 제공했습니다) 그가 추구했던 것의 핵심 : 먼저 브랜치를 체크 아웃하지 않고도 로컬 브랜치 중 하나를 관련 원격 브랜치의 최신 커밋으로 업데이트 할 수있는 방법이 있습니까?
Gurce
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.