Поведение по умолчанию "git push" без указанной ветви
я использую следующую команду, чтобы нажать на мою удаленную ветку:
git push origin sandbox
если я говорю
git push origin
это также подталкивает изменения в других моих ветвях или только обновляет мою текущую ветвь? У меня есть три ветви: master,production и sandbox.
The git push документация не очень ясна об этом, поэтому я хотел бы прояснить это навсегда.
какие ветви и пульты ДУ делают следующее git push обновление команды точно?
git push
git push origin
origin выше находится пульт дистанционного управления.
Я понимаю, что git push [remote] [branch] будет нажимать только эту ветку на пульт дистанционного управления.
12 ответов:
вы можете управлять поведением по умолчанию пуш.по умолчанию в вашей конфигурации git. От документация git-config(1):
push.defaultопределяет действие, которое git push должен предпринять, если в командной строке не указан refspec, не настроен refspec в удаленном устройстве и не подразумевается ни один из параметров, указанных в командной строке. Возможные значения:
nothing: не давить все что угодно
matching: нажмите все соответствующие ветвивсе ветви, имеющие одинаковое имя на обоих концах, считаются совпадающими.
это по умолчанию в Git 1.x.
upstream: передвиньте текущую ветвь к ее восходящей ветви (trackingявляется устаревшим синонимом для upstream)
current: нажмите текущую ветвь на ветвь того же самого имя
simple: (новый в Git 1.7.11) как вверх по течению, но отказывается нажимать, если имя восходящей ветви отличается от локальногоэто самый безопасный вариант и хорошо подходит для начинающих.
это станет по умолчанию в Git 2.0.
простые, текущие и восходящие режимы предназначены для тех, кто хочет выталкивать одну ветвь после окончания работы, даже когда другие ветви еще не готов к вытеснению
примеры командной строки:
для просмотра текущей конфигурации:
git config --global push.defaultустановить новую конфигурацию:
git config --global push.default current
git push originбудет нажимать все изменения на локальных ветвях, которые имеют соответствующие удаленные ветви вoriginпо состоянию наgit pushработы как
git push <remote>, где<remote>является удаленным текущим филиалом (или источником, если для текущего филиала не настроен ни один удаленный).из раздела примеры
git-pushна странице
вы можете настроить поведение по умолчанию для вашего git с помощью push.по умолчанию
git config push.default currentили если у вас есть много репозиториев и хотите то же самое для всех, то
git config --global push.default currentThe настоящее в Данная настройка означает, что по умолчанию вы будете только нажмите на текущую ветку когда вы git push
другие варианты:
- ничего : не нажимайте ничего
- соответствие: нажмите все соответствующие ветви (по умолчанию)
- отслеживание: нажмите текущую ветвь на то, что она отслеживает
- current: нажмите на текущую ветку
ОБНОВЛЕНИЕ-НОВЫЙ СПОСОБ СДЕЛАТЬ ЭТО
начиная с Git 1.7.11 выполните следующие действия:
git config --global push.default simpleЭто новый параметр введен, который работает так же, как текущий, и будет сделан по умолчанию для git от v 2.0 По слухам
Я просто передал свой код в ветку и нажал его на github, вот так:
git branch SimonLowMemoryExperiments git checkout SimonLowMemoryExperiments git add . git commit -a -m "Lots of experimentation with identifying the memory problems" git push origin SimonLowMemoryExperiments
здесь очень удобная и полезная информация о Git Push: git Push: только кончик
наиболее распространенным использованием git push является передача локальных изменений в общедоступный репозиторий восходящего потока. Предполагая, что восходящий поток является удаленным именем " origin "(удаленное имя по умолчанию, если ваш репозиторий является клоном), а ветвь, подлежащая обновлению,называется "master" (имя ветви по умолчанию), это делается с помощью:
git push origin master
git push originбудет толкать изменяется от всех локальных ветвей к соответствующим ветвям удаленного источника.
git push origin masterбудет передавать изменения из локальной ветки master в удаленную ветку master.
git push origin master:stagingпереместит изменения из локальной главной ветви в удаленную промежуточную ветвь, если она существует.
(март 2012 года)
осторожно: это по умолчанию"matching" политика может измениться в ближайшее время
(иногда после git1. 7. 10+):в разделе "пожалуйста, обсудите: что "git push" должен делать, когда вы не говорите, что нажимать?"
в сложившейся обстановке (т. е.
push.default=matching),git pushбез аргумента будет толкать все ветви, которые существуют локально и удаленно с тем же именем.
Это обычно подходит, когда разработчик нажимает на свой собственный публичный репозиторий, но может быть запутанным, если не опасным при использовании общего репозитория.предложение измените значение по умолчанию на'
upstream', т. е. нажмите только текущую ветвь и нажмите ее на ветвь, из которой будет тянуть git.
Еще один кандидат -'current'; это толкает только текущую ветвь к удаленной ветви с тем же именем.что обсуждалось до сих пор может можно увидеть в этой теме:
http://thread.gmane.org/gmane.comp.version-control.git/192547/focus=192694
предыдущие соответствующие обсуждения включают в себя:
- http://thread.gmane.org/gmane.comp.version-control.git/123350/focus=123541
- http://thread.gmane.org/gmane.comp.version-control.git/166743
присоединиться к обсуждение, отправляйте свои сообщения по адресу: [email protected]
Я просто положил это в моем .gitconfig псевдонимы раздел и любовь, как это работает:
pub = "!f() { git push -u ${1:-origin} `git symbolic-ref HEAD`; }; f"будет толкать текущую ветвь в начало координат с
git pubили другое РЕПО сgit pub repo-name. Вкусный.
git push попытается нажать все локальные ветви на удаленный сервер, это, вероятно, то, что вы не хотите. У меня есть несколько настроек удобства, чтобы справиться с этим:
псевдоним "gpull " и" gpush " соответственно:
в моем ~/.файл
get_git_branch() { echo `git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)//'` } alias gpull='git pull origin `get_git_branch`' alias gpush='git push origin `get_git_branch`'таким образом, выполнение "gpush" или "gpull" будет нажимать только мою ветку "в настоящее время".
вы можете нажать текущую ветку с помощью команды
git push origin HEAD(взял из здесь)
вы можете изменить это поведение по умолчанию в папке
.gitconfig, например:[push] default = currentчтобы проверить текущие настройки, запустите:
git config --global --get push.default
вместо того, чтобы использовать псевдонимы, я предпочитаю создавать сценарии git-XXX, чтобы я мог управлять ими более легко (у всех наших разработчиков есть определенный управляемый источник dir на их пути для этого типа вещей).
этот скрипт (так называемый
git-setpush) установит значение конфигурации дляremote.origin.pushзначение для чего - то, что будет только толкать текущую ветку:#!/bin/bash -eu CURRENT_BRANCH=$(git branch | grep '^\*' | cut -d" " -f2) NEW_PUSH_REF=HEAD:refs/for/$CURRENT_BRANCH echo "setting remote.origin.push to $NEW_PUSH_REF" git config remote.origin.push $NEW_PUSH_REFобратите внимание, как мы используем
Gerritустанавливает целиrefs/for/XXXнажать в ветку обзора. Это также предполагается, что origin-это ваше удаленное имя.вызовите его после проверки ветви с
git checkout your-branch git setpushон, очевидно, может быть адаптирован также для проверки, но мне нравятся скрипты делай одно и делай это хорошо
Я добавил следующие функции в моем .файл bashrc для автоматизации этих задач. Он делает git push / git pull + имя текущей ветви.
function gpush() { if [[ "x" == "x-h" ]]; then cat <<EOF Usage: gpush git: for current branch: push changes to remote branch; EOF else set -x local bname=`git rev-parse --abbrev-ref --symbolic-full-name @{u} | sed -e "s#/# #"` git push ${bname} set +x fi } function gpull() { if [[ "x" == "x-h" ]]; then cat <<EOF Usage: gpull git: for current branch: pull changes from EOF else set -x local bname=`git rev-parse --abbrev-ref --symbolic-full-name @{u} | sed -e "s#/# #"` git pull ${bname} set +x fi }
Comments