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