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

Я не мастер 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 = [email protected]: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.

Ответ 1

В [branch "master"] попробуйте добавить следующее в конфигурационный файл repo Git (.git/config):

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

Это говорит Git 2 вещи:

  • Когда вы находитесь на главной ветке, пул по умолчанию является источником.
  • При использовании git pull в главном ветки, без указания удаленного и ветки, используйте удаленный (исходный) по умолчанию и объедините изменения с удаленной основной ветвью.

Я не уверен, почему эта настройка была удалена из вашей конфигурации. Возможно, вам придется следить за предложениями, которые публикуют и другие люди, но это может сработать (или помочь хотя бы).

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

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

Ответ 2

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

  $ 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

Ответ 3

git branch --set-upstream master origin/master

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

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

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

    rebase = true

Ответ 4

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

git pull origin master
git push -u origin master

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

Ответ 5

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

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

Если ошибка была введена при компиляции слиянием, эта процедура не будет работать. См. How-to-revert-a-faulty-merge.

Ответ 6

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

$ git pull origin master

Ответ 7

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

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

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 [email protected]:bigben87/webbit.git
   1bf578c..268fb60  gh-pages -> gh-pages

Ответ 8

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

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

Ответ 9

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

Если вы запустите команду git remote show origin (при условии, что 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 не существует конфигурации, уже были объяснены другими ответами.