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


485

Я не мастер 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.


Как выглядит ваш .git / config? Что ты делал после того, как проверил этот коммит?
Райан Грэм

Вы делали коммиты поверх 4f82a29?
Пэт Нотц

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

2
Райан, я обновился, чтобы включить .git / config. После оформления заказа я ничего не делал. Этот компьютер является сервером, а не для разработки.
Дэвид Смит

Ответы:


731

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

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

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

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

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

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

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

2
Это сработало и для меня, я проверил проект из GitHub. Я использую OS X 10.4
Сэм Барнум

Спасибо очень много - это случилось со мной на одном проекте разработчиков с одним «сервером» хранилища и двух компьютеров (которые я использовал , чтобы толкать / тянуть часто без каких - либо вопросов , стоящих перед сбоем), не знаю почему, но затруднительное работал отлично!
chesterbr

1
Что вы подразумеваете под Под [филиал "мастер"]
Ianj

3
@ianj: в конфигурационном файле Git (из корня репозитория .git/config).
Мипади

1
@ianj: из командной строки вы всегда можете сделать это $ git config branch.master.remote origin ; git config branch.master.merge refs/heads/master.
Мипади

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
+1 за знание волшебного слова "refs /глав / мастер". У меня не было никаких проблем выяснить , как установить переменную, но не было абсолютно никакого понятия , что , чтобы установить его на , и человек страниц не очень поможет. В конце концов я нашел правильное место в документах после того, как нашел этот ответ. Для любопытных: волшебное слово относится к пути к файлу, .gitв котором, как представляется, git хранит хеш-код masterтекущего коммита.
Мок

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

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

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

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

    rebase = true

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

2
Я только что попробовал это, и я получаю сообщение об ошибке, fatal: Not a valid object name: 'origin/master'.несмотря на то, что он originявляется действительным удаленным и masterсуществует, как обычно, в обоих репозиториях.
Кен Уильямс

2
Кен, сначала нужно сделать «git fetch origin», чтобы получить имена удаленных веток.
Эрик Ли

14
Более новый мерзавец хочет, чтобы вы использовали git branch --set-upstream-to=origin/master master.
orbeckst

52

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

git pull origin master
git push -u origin master

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


1
Согласен. Это должен быть лучший простой ответ.
linbianxiaocao

2
Ваш ответ должен включать, почему это работает, и обратиться к разделу в документации, который объясняет, почему.
vfclists

24

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

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

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


Вы даете мне отличное образование здесь, и я это ценю, но, возможно, я не очень хорошо описываю свою ситуацию, так что это не совсем соответствует моему рабочему процессу. Я, вероятно, отправлю еще один вопрос для решения этой проблемы. Спасибо, Пол! +1 вам, сэр.
Дэвид Смит,

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

12

Существует также способ настройки 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

10

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

$ git pull origin master

13
Смысл состоял в том, чтобы сделать это автоматически, а не указав это.
Эрик

4

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

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

Разве это не должно быть "refs /глав / мастер"? Согласно git-pull (1), это имя ветви на удаленном сайте, которое объединено по умолчанию.
Адам Монсен

Да вы правы Репозиторий, из которого я взял мой пример, является особым случаем. Исправлено.
Райан Грэм

0

Просто хотел добавить некоторую информацию, мы можем проверить эту информацию, независимо от того, 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, уже были объяснены другими ответами.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.