Поведение по умолчанию "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]
будет нажимать только эту ветвь на удаленный.
Ответы
Ответ 1
Вы можете управлять поведением по умолчанию, установив push.default в конфигурацию git. Из документация 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
Ответ 2
git push origin
будет вытолкнуть все изменения в локальных ветвях, имеющих соответствующие удаленные ветки, в origin
Как для git push
Работает как git push <remote>
, где <remote>
- текущий удаленный филиал (или источник, если для текущей ветки не настроен пульт).
В разделе "Примеры" справочной страницы git-push
Ответ 3
Вы можете настроить поведение по умолчанию для 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 в соответствии с слухами
Ответ 4
Я просто передал свой код ветке и нажал ее на 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
Ответ 5
Вот очень удобная и полезная информация о Git Push:
Git Push: Только подсказка
Наиболее частое использование push git заключается в том, чтобы выталкивать локальные изменения в общедоступный репозиторий upstream. Предполагая, что восходящий поток является удаленным с именем "origin" (удаленное имя по умолчанию, если ваш репозиторий является клоном), а ветвь, которая должна быть обновлена до/из, называется "master" (имя ветки по умолчанию), это делается с помощью: git push origin master
git push origin
будет вытеснять изменения из всех локальных ветвей в соответствующие ветки удаленного источника.
git push origin master
будет вытеснять изменения из локальной ведущей ветки в удаленную ведущую ветвь.
git push origin master:staging
будет вытеснять изменения из локальной ветки мастера в удаленную промежуточную ветку, если она существует.
Ответ 6
(март 2012 г.)
Остерегайтесь: по умолчанию политика "matching
" может скоро измениться
(иногда после git1.7.10 +):
См. " Пожалуйста, обсудите: что" git push "должен делать, когда вы не говорите, что нажать?"
В текущей настройке (т.е. push.default=matching
) git push
без аргумента будет удалять все ветки, которые существуют локально и удаленно с тем же именем.
Обычно это подходит, когда разработчик подталкивает свой собственный публичный репозиторий, но может быть запутан, если не опасен при использовании общего хранилища.
Предложение изменить значение по умолчанию на "upstream
" , т.е. нажать только текущую ветку и направить ее на ветвь git pull pull from.
Другой кандидат: current
'; это подталкивает только текущую ветку к удаленной ветки с тем же именем.
То, что обсуждалось до сих пор, можно увидеть в этом потоке:
http://thread.gmane.org/gmane.comp.version-control.git/192547/focus=192694
Предыдущие соответствующие обсуждения включают:
Чтобы присоединиться к обсуждению, отправьте свои сообщения на адрес: git @vger.kernel.org
Ответ 7
Я просто поместил это в мою секцию псевдонимов .gitconfig и люблю, как это работает:
pub = "!f() { git push -u ${1:-origin} `git symbolic-ref HEAD`; }; f"
Нажимая текущую ветвь на начало координат с помощью git pub
или другого репо с git pub repo-name
. Вкусно.
Ответ 8
A 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" будет толкать только мою ветку "в настоящее время".
Ответ 9
Вы можете нажать текущую ветвь с командой
git push origin HEAD
(взято из здесь)
Ответ 10
Вы можете изменить это поведение по умолчанию в .gitconfig
, например:
[push]
default = current
Чтобы проверить текущие настройки, запустите:
git config --global --get push.default
Ответ 11
Вместо использования псевдонимов я предпочитаю создавать сценарии git -XXX, чтобы я мог легче управлять им (наши разработчики имеют определенный источник управляемых источников на своем пути для этого типа вещей).
Этот script (называемый 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
Очевидно, что он может быть адаптирован также для проверки, но мне нравится сценарий сделать одно и сделать это хорошо
Ответ 12
В мой файл .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
}