Поведение "git push" по умолчанию без указания ветки
Я использую следующую команду для отправки в мою удаленную ветку:
git push origin sandbox
Если я говорю
git push origin
это тоже подталкивает изменения в других моих ветках или только обновляет мою текущую ветку? У меня есть три ветви: master
, production
а также sandbox
,
git push
документация не очень ясна по этому поводу, поэтому я хотел бы уточнить это навсегда.
Какие филиалы и пульты делают следующее git push
команды обновлять точно?
git push
git push origin
origin
выше это пульт.
Я это понимаю git push [remote] [branch]
подтолкнет только эту ветку к удаленному.
13 ответов
Вы можете контролировать поведение по умолчанию, установив push.default в вашем git config. Из документации git-config(1):
push.default
Определяет действие, которое должен выполнить git push, если в командной строке не задан refspec, в удаленном не настроен refspec и ни один из параметров, заданных в командной строке, не подразумевает refspec. Возможные значения:
nothing
: ничего не толкайmatching
: нажать на все соответствующие ветвиВсе ветви, имеющие одинаковое имя на обоих концах, считаются совпадающими.
Это значение по умолчанию в Git 1.x.
upstream
: подтолкнуть текущую ветвь к восходящей ветке (tracking
является устаревшим синонимом для апстрима)current
: нажать текущую ветку на ветку с тем же именемsimple
: (новое в Git 1.7.11) как и в апстриме, но отказывается нажимать, если имя ветки в апстриме отличается от локальногоЭто самый безопасный вариант и хорошо подходит для начинающих.
Это станет по умолчанию в Git 2.0.
Простой, текущий и восходящий режимы предназначены для тех, кто хочет вытолкнуть одну ветку после окончания работы, даже когда другие ветви еще не готовы к вытеснению
Примеры командной строки:
Для просмотра текущей конфигурации:
git config --global push.default
Чтобы установить новую конфигурацию:
git config --global push.default current
Вы можете настроить поведение по умолчанию для вашего git с push.default
git config push.default current
или если у вас много репозиториев и вы хотите то же самое для всех, то
git config --global push.default current
Ток в этой настройке означает, что по умолчанию вы будете выдвигать текущую ветвь только когда вы делаете git push
Другие варианты:
- ничего: не толкай ничего
- соответствие: Нажмите все соответствующие ветви (по умолчанию)
- отслеживание: нажмите текущую ветку на то, что она отслеживает
- current: нажать текущую ветку
ОБНОВЛЕНИЕ - НОВЫЙ СПОСОБ СДЕЛАТЬ ЭТО
Начиная с Git 1.7.11, сделайте следующее:
git config --global push.default simple
Это новая введенная настройка, которая работает так же, как и текущая, и по умолчанию будет установлена версия git из v 2.0.
git push origin
будет помещать все изменения в локальные ветви, имеющие соответствующие удаленные ветви, в origin
Что касается git push
Работает как
git push <remote>
, где<remote>
является удаленным из текущей ветви (или источником, если для текущей ветви не настроено ни одного удаленного).
Из раздела "Примеры" git-push
справочная страница
Я просто зафиксировал свой код в ветке и отправил его в 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
перенесет изменения из локальной ветки master в удаленную промежуточную ветку, если она существует.
(Март 2012)
Осторожно: это по умолчанию " matching
"политика может скоро измениться
(иногда после git1.7.10 +):
Смотрите " Пожалуйста, обсудите: что должен делать"git push", когда вы не говорите, что нужно нажимать? "
В текущих настройках (т.е.
push.default=matching
),git push
без аргумента будут выдвигать все ветви, которые существуют локально и удаленно, с одинаковыми именами.
Обычно это уместно, когда разработчик проталкивает свой собственный общедоступный репозиторий, но может сбивать с толку, если не опасно при использовании общего репозитория.Предложение состоит в том, чтобы изменить значение по умолчанию на
upstream
', т. е. нажмите только текущую ветвь, и толкните ее к ветке git pull, которую вытащите
Другой кандидат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
Чтобы присоединиться к обсуждению, отправьте свои сообщения по адресу: git@vger.kernel.org
Я просто помещаю это в мой раздел псевдонимов.gitconfig и люблю, как это работает:
pub = "!f() { git push -u ${1:-origin} `git symbolic-ref HEAD`; }; f"
Переместит текущую ветку в источник с git pub
или другой репо с git pub repo-name
, Вкусные.
Вы можете изменить это поведение по умолчанию в вашем .gitconfig
, например:
[push]
default = current
Чтобы проверить текущие настройки, запустите:
git config --global --get push.default
Git push попытается отправить все локальные ветви на удаленный сервер, это, скорее всего, то, что вам не нужно. У меня есть пара удобных настроек, чтобы справиться с этим:
Псевдонимы "gpull" и "gpush" соответственно:
В моем ~/.bash_profile
get_git_branch() {
echo `git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/'`
}
alias gpull='git pull origin `get_git_branch`'
alias gpush='git push origin `get_git_branch`'
Таким образом, выполнение "gpush" или "gpull" будет толкать только мою "текущую" ветку.
Новый конфиг вgit
2.37.0
Запустите, чтобы установить удаленную автоматическую настройку вместо изменения поведения push по умолчанию.
git config --global --add --bool push.autoSetupRemote true
он хорошо работает с push.defaultsimple
,upstream
Вместо того, чтобы использовать псевдонимы, я предпочитаю создавать сценарии 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
нажать в обзорную ветку. Также предполагается, что происхождение - это ваше удаленное имя.
Вызвать его после проверки ветки с
git checkout your-branch
git setpush
Очевидно, его можно адаптировать и для оформления заказа, но мне нравятся сценарии, которые делают одно и делают это хорошо.
Я добавил следующие функции в мой файл.bashrc для автоматизации этих задач. Это делает git push/git pull + имя текущей ветви.
function gpush()
{
if [[ "x$1" == "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$1" == "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
}