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