힘내 GitHub에서 특정 지점을 당겨


631

여러 지점이있는 프로젝트가 있습니다. 나는 그것들을 GitHub 로 밀어 넣었고 , 이제 다른 누군가가 프로젝트를 진행하고 있으므로 GitHub에서 지점을 가져와야합니다. 마스터에서 잘 작동합니다. 그러나 누군가가 지점을 만들었다 고 말하십시오 xyz. xyzGitHub에서 분기 를 가져 와서 분기 xyz에 병합하려면 localhost어떻게해야합니까?

나는 실제로 여기에 내 대답이 있습니다 : 힘내에서 가지를 밀고 당기십시오

그러나 나는 "!

어떤 제안?


3
실행중인 실제 명령은 무엇입니까?
Alex N.

1
'non fast forward'메시지로 실패 할 수있는 페치입니다. 원격 추적 브랜치 (origin / xyz)를 수정 했습니까? 아니면 브랜치가 원격 리포지토리에서 되감기 / 재기록 되었습니까? " git fetch origin --force" 를 사용해야 할 수도 있지만, 사용 하기 전에 설명서를 읽으십시오.
Jakub Narębski

답변:


757

하지만 "! [거부 됨]"이라는 오류와 "빨리 감기가 아닌"문제가 발생합니다

Git이 브랜치의 변경 사항을 현재 마스터로 병합 할 수 없기 때문입니다. branch를 체크 아웃 master하고 원격 branch에 병합하려고 한다고 가정 해 봅시다 other-branch. 이렇게하면 :

$ git pull origin other-branch

힘내는 기본적으로 이것을하고 있습니다 :

$ git fetch origin other-branch && git merge other-branch

즉, a pullfetch뒤에옵니다 merge. 그러나 pull-ing 할 때 Git은 빨리 감기 병합을 수행 할 수있는 경우 에만 병합 other-branch 합니다 . 빨리 감기 병합은에 병합하려고하는 지점의 머리가되는 병합입니다 직접 하위 병합 할 지점의 머리. 예를 들어, 이력 트리가있는 경우 병합 하면 빨리 병합됩니다.other-branch

O-O-O-O-O-O
^         ^
master    other-branch

그러나 이것은 빠른 병합 이 아닙니다 .

    v master
O-O-O
\
 \-O-O-O-O
         ^ other-branch

문제를 해결하려면 먼저 원격 브랜치를 가져 오십시오 .

$ git fetch origin other-branch

그런 다음 현재 분기로 병합하고 (이것으로 가정 함 master) 병합 충돌을 수정하십시오.

$ git merge origin/other-branch
# Fix merge conflicts, if they occur
# Add merge conflict fixes
$ git commit    # And commit the merge!

아니요, 문제는 병합 단계가 아닌 가져 오기에 있습니다.
Jakub Narębski

3
일반적으로 리모트는 페치가 빨리 수행되지 않더라도 페치가 강제되도록 설정되므로 OP가 일반적인 구성으로 무언가를 변경하지 않으면 페치에서 발생하지 않아야합니다. 가져 오기 또는 병합 중에 빨리 감기 문제가 발생할 수 있습니다 . 문제가 확실하게 가져 오기에 있고 병합에 있지 않다고 말하는 이유는 무엇입니까?
mipadi 2009

다음 단계를 따릅니다 (가져 오기, 병합). 힘내는 할 일이 없다고 말합니다. 내가 저 지르려고 할 때, 그것은 앞으로 나아가는 것에 대해 신음 소리를 낸다.
Jean Jordaan

1
@mipadi 나는 Jean과 같은 문제를 겪었지만 언급 한 비 기본 방식으로 리모컨이 설정되어 있다고 말할 수는 없지만 사용하면 git fetch -f문제가 해결 되었다고 말할 수 있습니다 ! 감사!
cregox

1
이것은 원격 브랜치 xzy를 로컬 브랜치 로 병합 master하는데, 이것은 원래의 질문에 의해 암시 된 것이 아닙니다. "GitHub에서 분기 xyz를 가져 와서 로컬 호스트의 분기 xyz로 병합하려면 어떻게해야합니까?"
user5359531

301

원격 지사를 명시 적으로 추적 git pull하면 원하는대로 간단 하게 수행 할 수 있습니다.

git branch -f remote_branch_name origin/remote_branch_name
git checkout remote_branch_name

후자는 로컬 작업입니다.

또는 포크에 대한 GitHub 문서 와 더 잘 맞습니다 .

git branch -f new_local_branch_name upstream/remote_branch_name

39
'유효하지 않은 오브젝트 이름 :'origin / remote_branch_name '이 표시되면 먼저'git fetch origin '을 수행하십시오.
Martin Konicek

130

다음 명령을 사용하여 분기를 분기로 당길 수 있습니다.

git pull {repo} {remotebranchname}:{localbranchname}

git pull origin xyz:xyz

마스터 브랜치에있을 때 먼저 다음과 같은 브랜치를 체크 아웃 할 수 있습니다.

git checkout -b xyz

마스터에서 "xyz"라는 새 브랜치를 만들고 직접 체크 아웃합니다.

그런 다음

git pull origin xyz

새 지점을 로컬 xyz지점으로 가져옵니다 .


1
완전한! 나는 그 구문을 몰랐다 : git pull {repo} {remotebranchname} : {localbranchname}. 질문, 풀이 작동하지 않으면 (다른 사람이 지점을 업데이트하고 병합 충돌이있을 수 있음) 내 옵션은 무엇입니까?
Costa

7
원격 브랜치를 현재 브랜치 (예 : 마스터)에 병합하려고 시도하기 때문에 이것을 하향 조정하고 있습니다. 이것은 대부분의 사람들이 원하는 것이 아니며 OP가 요청한 것이 아닙니다. @mohit의 대답은 올바른 선택입니다.
Phrogz

1
Phrogz-최근 버전의 Git에서이 동작이 변경된 것 같습니다. 나는 이것을 전에 사용했고 완벽하게 잘 작동했습니다.
Pawan

88

가장 좋은 방법은 다음과 같습니다.

git checkout -b <new_branch> <remote repo name>/<new_branch>

1
github에서 새로운 "dev"브랜치를 생성하고 위의 시도를 한 후에 다음과 같은 오류 메시지가 나타납니다. 아래의 Bradley Flood 솔루션에 따라 fetch '한 다음 mohit의 답변을 다시 실행하십시오.
TomEberhard

46

git fetch 최신 분기 목록을 가져옵니다.

지금 당신은 할 수 있습니다 git checkout MyNewBranch

완료 :)


자세한 내용은 문서를 참조하십시오 : git fetch


37

나는 문제를 완전히 이해하고 있는지 확실하지 않지만 기존 분기를 당기는 것은 다음과 같이 수행됩니다 (적어도 나를 위해 작동합니다 :)

git pull origin BRANCH

이는 로컬 지점이 원산지 / 지점에서 생성되었다고 가정 한 것입니다.


15

이것은 다른 지점으로 병합하기 전에 원격 지점을 얻는 데 도움이되었습니다.

git fetch repo xyz:xyz
git checkout xyz

8

간단히 말하면, GitHub에서 분기를 가져 오려면 the_branch_I_want:

git fetch origin
git branch -f the_branch_I_want origin/the_branch_I_want
git checkout the_branch_I_want

3
git pull <gitreponame> <branchname>

일반적으로 코드에 리포지토리 만 할당 된 경우 gitreponame은 origin이됩니다.

하나는 로컬이고 다른 하나는 원격과 같은 두 개의 저장소에서 작업하는 경우 git remote -v 에서 저장소 목록을 확인할 수 있습니다 . 현재 코드에 할당 된 리포지토리 수를 보여줍니다.

BranchName은 해당 gitreponame에 존재해야합니다.

다음 두 명령을 사용하여 repo를 추가하거나 제거 할 수 있습니다

git remote add <gitreponame> <repourl>
git remote remove <gitreponame>

2

당신은 또한 할 수 있습니다

git pull -r origin master

병합 충돌이있는 경우 수정

git rebase --continue

-r은 rebase 용입니다. 이것은 당신에게 분기 구조를 만들 것입니다

        v  master       
o-o-o-o-o
     \o-o-o
          ^ other branch

        v  master       
o-o-o-o-o-o-o-o
              ^ other branch

이것은 더 깨끗한 역사로 이어질 것입니다. 참고 : 이미 다른 지점을 원점 (또는 다른 원격지)으로 밀었을 경우 리베이스 후에 지점을 강제로 밀어야 할 수도 있습니다.

git push -f origin other-branch

1

내가 했어

git branch -f new_local_branch_name origin/remote_branch_name

대신에

git branch -f new_local_branch_name upstream/remote_branch_name

@innaM이 제안한대로. 업스트림 버전을 사용할 때 '치명적 : 유효한 개체 이름이 아닙니다 :'upstream / remote_branch_name '. 나는 git fetch origin제안 된 의견으로 하지 않고 단순히로 대체 upstream했습니다 origin. 나는 그들이 동등한 것 같아요.


0

GitHub에서 분기를 당기기 위해 사용할 수 있습니다

git checkout --track origin/the-branch-name

분기 이름이 정확히 같은지 확인하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.