Как вы получаете Git, чтобы всегда тянуть из определенной ветви?

Я не мастер Git, но я работаю с ним в течение некоторого времени, с несколькими различными проектами. В каждом проекте я всегда 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 снова. В настоящее время 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 ответов

Решение

Под [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

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

  $ 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
git branch --set-upstream master origin/master

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

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

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

    rebase = true

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

git pull origin master
git push -u origin master

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

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

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

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

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

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

git config branch.autosetupmerge true

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

git config --global branch.autosetupmerge true

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

Когда у тебя есть 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

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

$ git pull origin master

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

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

Просто хотел добавить некоторую информацию, мы можем проверить эту информацию, git pull автоматически ссылается на любую ветку или нет.

Если вы запустите команду, git remote show origin, (предполагая происхождение как краткое имя для удаленного), git показывает эту информацию, существует ли какая-либо ссылка по умолчанию для git pull или не.

Ниже приведен пример вывода.(Из документации git).

$ 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, уже были объяснены другими ответами.

Другие вопросы по тегам