현재 브랜치가 아닌 브랜치로 'git pull'하는 방법은 무엇입니까?


126

당신이 실행하면 git pullmaster지점, 그것은 일반적으로 가져옵니다 origin/master. 라는 다른 분기 newbranch에 있지만 git pullfrom origin/masterinto 를 수행하는 명령을 실행해야 master하지만 git checkout끌어 오기가 완료 될 때까지 선택한 분기를 변경하기 위해 실행할 수 없습니다 . 이를 수행하는 방법이 있습니까?

배경 지식을 제공하기 위해 저장소는 웹 사이트를 저장합니다. newbranch웹 사이트를로 전환하여 일부를 변경 하고 배포했습니다 newbranch. 이제 이러한 변경 사항이 업스트림 master지점 에 병합되었으므로 웹 사이트도 master지점으로 다시 전환하려고합니다 . 이 시점에서 newbranchorigin/master동일하지만 master뒤쳐져 origin/master과 요구를 업데이트 할 수 있습니다. 문제는 제가 전통적인 방식으로하면 다음과 같습니다.

$ git checkout master
   # Uh oh, production website has now reverted back to old version in master
$ git pull
   # Website is now up to date again

위의 ( git checkout master && git pull) 와 동일 하지만 프로세스 중에 작업 디렉토리를 이전 버전으로 변경하지 않고 달성해야합니다 .


@phi : 내가 안에 newbranch있고 숨길 것이 없기 때문에 작동하지 않을 것이라고 생각합니다 !
Malvineous

나는 새로운 디렉토리로 복제하고, newbranch를 master에 병합하고, master를 다시 newbranch에 병합하고, git pull from where you are. Master와 newbranch는 동일합니다.
aet

@aet 그는 git fetch; git merge origin/master내부에서 수행함으로써 현재 디렉토리에서 그렇게 할 수 있습니다 newbranch. 저장소의 두 번째 사본 전체를 복제해도 아무런 이점이 없습니다.
meagar


답변:


5

만지고 싶지 않은 작업 트리가 있으므로 다른 작업 트리를 사용하십시오. 클론은 저렴하며이를 위해 구축되었습니다.

git fetch origin master       # nice linear tree
git clone . ../wip -b master  # wip's `origin/master` is my `master`
cd ../wip                     # .
git pull origin origin/master # merge origin's origin/master
git push origin master        # job's done, turn it in.
cd ../main
rm -rf ../wip                 # wip was pushed here, wip's done

git checkout master           # payload

여기에있는 다른 모든 답변의 문제는 실제로 당기지 않는다는 것입니다. 풀을 설정 한 병합 또는 리베이스가 필요한 경우 다른 워크 트리와 위의 절차가 필요합니다. 그렇지 않으면 그냥 git fetch; git checkout -B master origin/master할 것입니다.


2
실행할 때 원본 / 마스터와 동기화하기 위해 폴더 에서 작업을 수행하지 않았기 때문에 git checkout master이전 master분기를 체크 아웃 하게됩니다 . 이것이 내가 피하려는 것입니다. git pullmain
Malvineous

클론에 의해 수행 된 체크 아웃은 이전 마스터의 것이지만 해당 체크 아웃은 웹 서버가 보지 않는 디렉토리에 있습니다. 마지막에있는 마스터 체크 아웃은 wip에서 다시 푸시 된 완전히 병합 된 마스터입니다.
jthill 2013 년

6 행에서 병합 된 (업데이트 된) 파일을로 master다시 푸시 origin하지만 최종 결제가이 업데이트 된 것 같지 않습니다 master. 디렉토리 git pull에서 master브랜치 를 업데이트 할 필요 가 없습니다 main. 그래서 제가 뭔가 빠뜨리지 않는 한 여러분의 명령은 그저 git checkout master스스로 실행 하고 오래된 master트리를 얻는 것과 다르지 않습니다 . 자세히 살펴보면 main업스트림과 통신 하는 디렉토리 에서 명령을 실행하고 있지 않습니다 (업스트림
리포지토리를

글쎄, 테스트 저장소에서 시도하거나 푸시 문서를 확인할 수 있습니다.
jthill 2013 년

1
@jwg는 무엇에 비해 제발? 모든 OP의 명시된 요구 사항을 해결해야합니다.
jthill

163

간단 함 : 원격 지점에서 현재 체크 아웃되지 않은 지점 마스터로 업데이트 :

git fetch origin master:master

어디에서 기원은 원격이고 당신은 현재 몇 가지 예에서 체크 아웃 된 DEV .

한 번에 지정된 분기 외에 현재 분기를 업데이트하려면 다음을 수행하십시오.

git pull origin master:master

4
흠, 항상 작동하지 않는 것 같습니다. 내 WIP 지점과 병합하라는 메시지가 표시되었습니다.
underscore_d

@underscore_d 나도 마찬가지입니다.
Greg

1
이 병합하라는 메시지를 표시하면 다음 당신이 기원하기 위해 최선을 다하고되지 갱신 것을 지사에 변화가있는 상상 ... 나를 위해 일한
탈지

2
어떻게 작동해야하나요? 그것은 나를 위해 작동하지 않습니다, 단지 원점 / 마스터를 현재 체크 아웃 된 브랜치에 병합하려고합니다.
mhogerheijde

3
이것은 마스터를 현재 브랜치로 끌어옵니다. 이것은 분명히 요구되는 것이 아닙니다. 풀을 가져 오기로 변경하면 정확히 요청되는 것입니다.
Jeff Wolski

90

여기에 대한 답변 : 체크 아웃을 사용하지 않고 Git 브랜치를 병합, 업데이트 및 가져 오기

# Merge local branch foo into local branch master,
# without having to checkout master first.
# Here `.` means to use the local repository as the "remote":
git fetch . foo:master

# Merge remote branch origin/foo into local branch foo,
# without having to checkout foo first:
git fetch origin foo:foo

2
커밋되지 않은 로컬 변경과 함께 작동하므로 이것이 가장 좋습니다.
Tomasz Gandor

2
최신 변경 사항을 따라 잡으려면 git fetch origin master:master. git fetch그 자체로는 다른 분기가 아닌 현재 분기를 업데이트하려는 것으로 가정합니다.
John Leidegren

2
이것은 가장 간단하고 직접적인 대답입니다. 이것은 받아 들여진 대답 IMO 여야합니다.
Keego

@JohnLeidegren-항상 의도 한대로 작동하지는 않습니다. stackoverflow.com/a/42902058/274579 답변에 대한 의견을 참조하십시오 .
ysap

22

결과적으로 대답은 믿을 수 없을 정도로 간단합니다.

$ git fetch                           # Update without changing any files
$ git branch -d master                # Remove out-of-date 'master' branch
$ git checkout --track origin/master  # Create and check out up-to-date 'master' branch

이렇게하면 업데이트 할 수 있습니다 master때까지로 전환하지 않고 분기 이후 가 업데이트되었습니다.


11
이것은 당신이 요청한 것을 수행하지 않습니다.
jthill 2013 년

위의 의견에서 말했듯이, 당신이 묻는 질문은 실제로 대답 한 질문이 아닙니다. 질문을 체크 아웃하지 않고 브랜치로 병합하는 것이 덜 구체적이고 이전 버전을 먼저 체크 아웃하지 않고 원격에서 사용 가능한 최신 버전의 브랜치로 직접 이동하도록 질문을 업데이트해야합니다.
meagar

1
절대적으로 내가 여기에서 찾고있는 답입니다. :)
Sophistifunk

1
OP가 원하는 것이 아니라 솔직히 말해서 나를 도왔습니다.
Marcel Bro

1
@anoniim, OP가 원했던 것이 아닙니까? 이 질문에 방금 답변 한 OP를 의미합니까?
smac89

12

Git 작업은 원 자성이 아니기 때문에 수정할 수없는 문제에 대해 걱정하고 있습니다. 먼저 마스터로 전환하지 않고 마스터를 업데이트하더라도 작업 디렉토리가 분기 사이의 중간에 항상 구멍이 있습니다 . 이것이 Git이 배포 도구가 아닌 이유 입니다.

프로덕션 환경에서 실제로 코드를 커밋하지 않기 때문에 (희망) 실제로 브랜치를 체크 아웃 할 필요 가 없습니다 . 간단히 a git fetch를 수행 하여 원격 참조 를 업데이트 한 다음 git checkout origin/master작업 디렉토리 를 현재에서 가리키는 커밋으로 직접 이동할 수 origin/master있습니다. 이렇게하면 분리 된 헤드 상태가되지만 코드를 커밋하지 않기 때문에 문제가되지 않습니다.

이것은 여러분이 얻을 수있는 가장 작은 구멍이지만 제가 말했듯이 구멍은 여전히 ​​존재합니다. checkout원자가 아닙니다.


배포를 위해 git을 사용하는 것의 한계를 이해합니다. 문제는이 경우 구멍이 1 초 미만이 아닌 몇 분이 될 것이라는 것입니다. origin/master그래도 체크 아웃에 대한 좋은 아이디어 는 트릭을 할 수 있습니다.
Malvineous 2013-09-25

구멍이 "분"긴 이유는 무엇입니까? 네트워크를 통해 데이터를 가져 오나요? git fetch다른 작업을 수행하기 전에 a 를 수행하고 실제 데이터 전송을 방해하십시오.
meagar

(현재) 추적되지 않은 파일은 이전 커밋으로 덮어 쓰여지기 때문에 몇 분 정도 걸립니다. 그래서 파일을 복사하고 git 작업을 한 다음 다시 넣어야합니다. '분 길이'는 내 타이핑 속도에서 비롯됩니다. (그래, 난 할 수 스크립트 그것을하지만 그 자체가 빠르게 모든 것을 자식 갖는 지점을 만들기 위해 단지이다.)
Malvineous

3

이를 위해 update-ref를 사용할 수 있습니다.

git fetch
git update-ref refs/heads/master origin/master
git checkout master

이렇게하면 마스터 브랜치의 모든 로컬 커밋이 삭제됩니다. 귀하의 경우에는 아무것도 없을 것이므로 괜찮습니다. 로컬 커밋이있는 곳에서이를 수행하려는 다른 사람들에게는 병합이 현재 브랜치에서만 실행될 수 있기 때문에 가능하지 않다고 생각합니다.


이것은 다음과 같 git branch --force master origin/master습니까? 이 힘 로컬 머리 master의 머리에 점 originmaster
Keego

2

Malvineous의 솔루션이 나를 위해 작동합니다.

$ git fetch                           # Update without changing any files
$ git branch -d master                # Remove out-of-date 'master' branch
$ git checkout --track origin/master  # Create and check out up-to-date 'master' branch

그냥 오류를 줘


warning: not deleting branch 'master' that is not yet merged to
         'refs/remotes/origin/master', even though it is merged to HEAD.
error: The branch 'master' is not fully merged.
If you are sure you want to delete it, run 'git branch -D master'.

그래서 나는 -D 옵션으로 실행합니다.

감사


0

git fetch origin master:master

  • "Pulls"(실제로 가져 오기) master.
  • master아직 푸시되지 않은 변경 사항이있는 경우 origin/master마스터에 병합됩니다.
  • 병합 충돌이있는 경우 먼저 해결해야합니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.