git이 항상 특정 브랜치에서 어떻게 끌어 오도록합니까?


485

나는 git master는 아니지만 몇 가지 다른 프로젝트로 한동안 작업 해 왔습니다. 물론 프로젝트마다 눈에 띄는 변화가없는 한 항상 git clone [repository]그리고 그 시점부터 항상 할 수 있습니다 git pull.

최근에 나는 이전 지점으로 되돌아 가야했고, 그렇게했습니다 git checkout 4f82a29. 다시 뽑을 준비가되었으므로 지점을 다시 마스터로 설정해야한다는 것을 알았습니다. 이제 직선을 사용하여 당길 수는 git pull없지만 대신을 지정해야합니다 git pull origin master. 이는 성가신 일이며 진행 상황을 완전히 이해하지 못했음을 나타냅니다.

git pull오리진 마스터를 지정하지 않고 직접 할 수없는 변경 사항은 무엇 이며 어떻게 다시 변경할 수 있습니까?

최신 정보:

-bash-3.1$ cat config
[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
[branch "master"]
[remote "origin"]
    url = git@github.com:user/project.git
    fetch = refs/heads/*:refs/remotes/origin/*

업데이트 2 : 분명히, 나는 원래의 방법이 잘못되었을 수도 있음을 이해하지만, 단순히 git pull다시 사용할 수 있도록이 repo를 수정해야 합니다. 현재 git pull 결과는 다음과 같습니다.

-bash-3.1$ git pull
You asked me to pull without telling me which branch you
want to merge with, and 'branch.master.merge' in
your configuration file does not tell me either.  Please
name which branch you want to merge on the command line and
try again (e.g. 'git pull  ').
See git-pull(1) for details on the refspec.

If you often merge with the same branch, you may want to
configure the following variables in your configuration
file:

    branch.master.remote = 
    branch.master.merge = 
    remote..url = 
    remote..fetch = 

See git-config(1) for details.

git pull어떤 분기를 병합할지 알 수 있으며 올바르게 작동하지만 git pull원래의 이전처럼 작동하지 않습니다 git checkout.


.git / config는 어떻게 생겼습니까? 커밋을 확인한 후 무엇을 했습니까?
Ryan Graham

4f82a29 위에서 커밋을 했습니까?
Pat Notz

팻, 나는 그 위에 어떤 커밋도하지 않았다. 이것은 서버에 있으며, 우리가 만든 버그를 숨기려면 안정적인 버전으로 롤백해야했습니다. 이 시스템은 개발 용이 아니므로 간단히 롤백하고 버그를 수정하는 동안 기다렸다가 헤드 버전으로 다시 가져 오기를 원했습니다.
David Smith

2
Ryan, .git / config를 포함하도록 업데이트했습니다. 결제 후 나는 아무 것도하지 않았다. 이 컴퓨터는 개발 용이 아닌 서버입니다.
David Smith

답변:


730

에서 [branch "master"]저장소의 Git 구성 파일 ( .git/config)에 다음을 추가하십시오 .

[branch "master"]
    remote = origin
    merge = refs/heads/master

이것은 Git 2에게 다음을 알려줍니다.

  1. 마스터 브랜치에있을 때 기본 리모컨은 원점입니다.
  2. 사용하는 경우 git pull어떤 원격 및 지점 지정과 함께, 마스터 분기에, 리모트 마스터 브랜치의 변경에 기본 원격 (원점)과 병합을 사용합니다.

그래도이 설정이 구성에서 제거 된 이유를 잘 모르겠습니다. 다른 사람들도 게시 한 제안을 따라야 할 수도 있지만 이것이 효과가있을 수도 있습니다 (적어도 도움이 됨).

구성 파일을 직접 편집하지 않으려면 대신 명령 행 도구를 사용할 수 있습니다.

$ git config branch.master.remote origin
$ git config branch.master.merge refs/heads/master

2
이것은 저에게도 효과적이었습니다 .github에서 프로젝트를 체크 아웃했습니다. OS X 10.4
Sam Barnum이

주셔서 감사합니다 매우 이 하나의 "서버"저장소와 (나 글리치 전에 문제없이 자주 / 풀을 밀어하는 데 사용) 두 컴퓨터에 하나의 개발 프로젝트에 내게 일어난 이유를 모르겠지만, 수정은 일 - 많은 좋아!
chesterbr

1
Under [branch "master"]
ianj

3
@ianj : Git 설정 파일에서 (repo root에서 .git/config)
mipadi

1
@ianj : 명령 행에서 항상 $ git config branch.master.remote origin ; git config branch.master.merge refs/heads/master대신 할 수 있습니다 .
mipadi

139

원하는 경우 다음과 같이 구성 파일을 편집하는 대신 명령 줄을 통해 이러한 옵션을 설정할 수 있습니다.

  $ git config branch.master.remote origin
  $ git config branch.master.merge refs/heads/master

또는 나와 같은 사람이며 향후 작업 할 수있는 프로젝트를 포함하여 모든 프로젝트에서 이것이 기본값이되도록하려면 전역 구성 설정으로 추가하십시오.

  $ git config --global branch.master.remote origin
  $ git config --global branch.master.merge refs/heads/master

12
마법의 단어 "refs / heads / master"를 아는 +1 나는 변수를 설정하는 방법을 알아내는 데 어떤 문제도 없었다, 그러나 그것을 설정하는 무엇인지 전혀 단서 없었다 에를 하고, 매뉴얼 페이지에 큰 도움이되지 있었다. 나는이 대답을 찾은 후에 문서에서 올바른 장소를 찾았습니다. 궁금한 점은 : 매직 단어는 현재 커밋 .git의 해시 코드를 유지하기 위해 git이 나타나는 파일 경로를 나타 master냅니다.
mokus

84
git branch --set-upstream master origin/master

config파일에 다음 정보가 추가 됩니다.

[branch "master"]
    remote = origin
    merge = refs/heads/master

그렇다면 branch.autosetuprebase = always다음을 추가하십시오.

    rebase = true

1
git이 요청한 것처럼 동작하게하는 가장 쉬운 방법을 발견했습니다. 특히 원격지뿐만 아니라 더 많은 분기가있는 경우 (모든 분기마다이 작업을 수행해야하는 경우에도
분기당

2
방금 시도한이 유효한 원격 fatal: Not a valid object name: 'origin/master'.이지만 오류가 발생 하며 평소와 같이 두 repos에 존재합니다. originmaster
Ken Williams

2
켄, 원격 브랜치 이름을 얻으려면 먼저 "git fetch origin"을 수행해야합니다.
Eric Lee

14
최신 자식은 당신이 사용하기를 원합니다 git branch --set-upstream-to=origin/master master.
orbeckst

52

mipadi와 Casey의 답변에서와 같이 정확한 git config또는 git branch인수 를 기억하기 가 어려우므로 다음 두 명령을 사용하여 업스트림 참조를 추가하십시오.

git pull origin master
git push -u origin master

이것은 동일한 정보를 .git / config에 추가하지만 기억하기 쉽다는 것을 알았습니다.


1
동의한다. 이것이 가장 간단한 대답이어야합니다.
linbianxiaocao

2
답에는 왜 효과가 있는지 설명하고 그 이유를 설명하는 문서의 섹션을 참조하십시오.
vfclists 2016 년

24

Git pull 은 추적 된 브랜치의 원격 저장소에서 새로운 커밋을 가져온 다음 현재 브랜치 로 병합하는 두 가지 동작을 결합합니다.

특정 커밋을 체크 아웃 할 때 현재 분기가 없으며 마지막 커밋을 가리키는 HEAD 만 있습니다. 따라서 git pull모든 매개 변수가 지정되지 않았습니다. 그것이 작동하지 않는 이유입니다.

업데이트 된 정보를 기반으로 원격 리포지토리를 되돌리려 고합니다. 버그를 도입 한 커밋을 알고 있다면이를 처리하는 가장 쉬운 방법 git revert은 지정된 버그 커밋을 취소하는 새로운 커밋을 기록하는 것입니다.

$ git checkout master
$ git reflog            #to find the SHA1 of buggy commit, say  b12345
$ git revert b12345
$ git pull
$ git push

변경하려는 서버이기 때문에 버그가있는 커밋을 숨기기 위해 기록을 다시 작성할 필요가 없다고 가정합니다.

병합 커밋에 버그가 도입 된 경우이 절차가 작동하지 않습니다. 결함 복구 병합 방법을 참조하십시오 .


여기에 훌륭한 교육을 제공하고 있습니다. 감사하지만 내 상황을 잘 설명하지 못할 수도 있으므로 워크 플로와 정확히 일치하지 않습니다. 아마 그 문제를 해결하기 위해 다른 질문을 게시 할 것입니다. 고마워, 폴! 당신에게 +1합니다.
David Smith

난 단지 당신의 상황을 잘못 읽었습니다. 필요한 답변을 얻게되어 기쁩니다.
Paul

12

Git을 구성하는 방법도 있으므로 항상 동일한 원격 브랜치를 가져와 현재 작업 사본에 체크 아웃 된 브랜치로 푸시합니다. git ready 는 기본적으로 설정을 권장 하는 추적 분기라고합니다 .

현재 작업 디렉토리 위의 다음 저장소의 경우 :

git config branch.autosetupmerge true

모든 Git 리포지토리에 대해 다르게 구성되지 않은 경우 :

git config --global branch.autosetupmerge true

IMHO의 종류이지만 특정 분기항상 현재 분기 인 경우 도움이 될 수 있습니다 .

당신이 한 경우 branch.autosetupmerge로 설정 true하고 처음으로 분기를 체크 아웃, 힘내 해당 원격 브랜치를 추적에 대해 당신을 말할 것이다 :

(master)$ git checkout gh-pages
Branch gh-pages set up to track remote branch gh-pages from origin.
Switched to a new branch 'gh-pages'

Git은 자동으로 해당 지점으로 푸시됩니다.

(gh-pages)$ git push
Counting objects: 8, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (6/6), done.
Writing objects: 100% (6/6), 1003 bytes, done.
Total 6 (delta 2), reused 0 (delta 0)
To git@github.com:bigben87/webbit.git
   1bf578c..268fb60  gh-pages -> gh-pages

10

내 자식 구성 파일을 편집하고 싶지 않아 @mipadi의 게시물에있는 정보를 따라 다음을 사용했습니다.

$ git pull origin master

13
요점은 이것을 지정하는 대신 자동으로 수행하는 것이 었습니다.
에릭

4

그것을 마스터로 만드는 방법에 대한 즉각적인 질문은 당신이 말하는 것을해야합니다. 분기 구성에서 가져올 참조 스펙을 지정하십시오.

[branch "master"]
    merge = refs/heads/master

"refs / heads / master"가 아니어야합니까? git-pull (1)에 따르면 이것은 기본적으로 병합되는 원격 사이트의 분기 이름입니다.
Adam Monsen

네 맞습니다. 내가 예로 든 레포는 특별한 경우입니다. 수정했습니다.
Ryan Graham

0

정보를 추가하고 싶었습니다. git pull자동으로 분기를 참조 하는지 여부를이 정보를 확인할 수 있습니다 .

git remote show origin원점을 remote의 짧은 이름으로 가정 하여, 명령을 실행하면 git은 기본 참조가 있는지 여부에 관계없이이 정보를 표시합니다 git pull.

아래는 샘플 출력입니다 (git documentation에서 가져옴).

$ git remote show origin
* remote origin
  Fetch URL: https://github.com/schacon/ticgit
  Push  URL: https://github.com/schacon/ticgit
  HEAD branch: master
  Remote branches:
    master                               tracked
    dev-branch                           tracked
  Local branch configured for 'git pull':
    master merges with remote master
  Local ref configured for 'git push':
    master pushes to master (up to date)

git pull에 대해 구성된 로컬 브랜치가 표시된 부분을 참고하십시오.

이 경우 git pull참조git pull origin master

처음에 git clone을 사용하여 리포지토리를 복제 한 경우 이러한 것들이 자동으로 처리됩니다. 그러나 git remote add를 사용하여 수동으로 원격을 추가 한 경우 git 구성에서 누락됩니다. 이 경우 " 'git pull'에 대해 구성된 로컬 분기 :"가 표시되는 부분은git remote show origin .

에 대한 구성이없는 경우 따라야 할 다음 단계 git pull는 다른 답변에서 이미 설명한 것입니다.

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