Как вы получаете Git, чтобы всегда тянуть из определенной ветви? - PullRequest
477 голосов
/ 18 марта 2009

Я не мастер Git, но я работаю с ним в течение некоторого времени, с несколькими различными проектами. В каждом проекте я всегда git clone [repository] и с этого момента всегда могу git pull, если, конечно, у меня нет выдающихся изменений.

Недавно мне пришлось вернуться к предыдущей ветке, и я сделал это с git checkout 4f82a29. Когда я снова был готов вытащить, я обнаружил, что должен был вернуть свою ветвь обратно в мастер. Теперь я не могу тянуть, используя прямую git pull, но вместо этого мне нужно указать git pull origin master, что раздражает и указывает мне, что я не до конца понимаю, что происходит.

Что изменилось, что не позволяет мне делать стрит git pull без указания мастера происхождения, и как я могу изменить его обратно?

UPDATE:

-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 снова. В настоящее время результаты 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.

Ответы [ 8 ]

726 голосов
/ 18 марта 2009

В [branch "master"] попробуйте добавить следующее в Git config файл репозитория (.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
139 голосов
/ 22 февраля 2010

Если вы предпочитаете, вы можете установить эти опции через командную строку (вместо редактирования файла конфигурации) следующим образом:

  $ 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
82 голосов
/ 11 июня 2011
git branch --set-upstream master origin/master

Это добавит следующую информацию в ваш config файл:

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

Если у вас есть branch.autosetuprebase = always, он также добавит:

    rebase = true
50 голосов
/ 15 октября 2012

Мне трудно вспомнить точные аргументы git config или git branch, как в ответах Мипади и Кейси, поэтому я использую эти 2 команды для добавления ссылки на источник:

git pull origin master
git push -u origin master

Это добавит ту же информацию в ваш .git / config, но мне легче запомнить.

23 голосов
/ 18 марта 2009

Git pull объединяет два действия - извлечение новых коммитов из удаленного репозитория в отслеживаемых ветвях и затем объединение их в вашей текущей ветке .

Когда вы извлекли конкретный коммит, у вас нет текущей ветви, у вас есть только заголовок, указывающий на последний сделанный вами коммит. Так что 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

Поскольку вы хотите изменить свой сервер, я предполагаю, что вам не нужно переписывать историю, чтобы скрыть ошибочный коммит.

Если ошибка была внесена в коммит слияния, то эта процедура не будет работать. См. Как исправить ошибку при слиянии .

10 голосов
/ 03 июля 2009

Не желая редактировать мой конфигурационный файл git, я следовал за информацией в сообщении @ mipadi и использовал:

$ git pull origin master
9 голосов
/ 18 июня 2012

Существует также способ настройки Git, так что он всегда вытягивает и отправляет эквивалентную удаленную ветвь в ветку, извлеченную в настоящий момент в рабочую копию. Он называется ветвью отслеживания, которую git ready рекомендует установить по умолчанию .

Для следующего хранилища выше текущего рабочего каталога:

git config branch.autosetupmerge true

Для всех Git-репозиториев, которые не настроены иначе:

git config --global branch.autosetupmerge true

Вид магии, IMHO, но это может помочь в случаях, когда конкретная ветвь всегда равна текущей ветвью .

Когда у вас branch.autosetupmerge установлено значение true и вы впервые извлекаете ветку, Git сообщит вам об отслеживании соответствующей удаленной ветки:

(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
4 голосов
/ 18 марта 2009

Ваш немедленный вопрос о том, как заставить его тянуть мастера, нужно делать то, что он говорит. Укажите refspec для извлечения из вашей конфигурации филиала.

[branch "master"]
    merge = refs/heads/master
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...