Поведение по умолчанию "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] будет нажимать только эту ветвь на удаленный.

1175
задан PlagueHammer 04 июня '09 в 5:45
источник поделиться

12 ответов

Вы можете управлять поведением по умолчанию, установив 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
1384
ответ дан Brian L 04 июня '09 в 6:02
источник поделиться

git push origin будет вытолкнуть все изменения в локальных ветвях, имеющих соответствующие удаленные ветки, в origin Как для git push

Работает как git push <remote>, где <remote> - текущий удаленный филиал (или источник, если для текущей ветки не настроен пульт).

В разделе "Примеры" справочной страницы git-push

196
ответ дан baudtack 04 июня '09 в 6:16
источник поделиться

Вы можете настроить поведение по умолчанию для 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 в соответствии с слухами

193
ответ дан Christoffer 06 окт. '11 в 13:45
источник поделиться

Я просто передал свой код ветке и нажал ее на 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
55
ответ дан neoneye 06 нояб. '11 в 13:05
источник поделиться

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

22
ответ дан Mukesh Chapagain 09 авг. '12 в 11:02
источник поделиться

(март 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

19
ответ дан VonC 17 марта '12 в 14:13
источник поделиться

Я просто поместил это в мою секцию псевдонимов .gitconfig и люблю, как это работает:

pub = "!f() { git push -u ${1:-origin} `git symbolic-ref HEAD`; }; f"

Нажимая текущую ветвь на начало координат с помощью git pub или другого репо с git pub repo-name. Вкусно.

17
ответ дан Mat Schaffer 15 марта '10 в 3:50
источник поделиться

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" будет толкать только мою ветку "в настоящее время".

8
ответ дан Cody Caughlan 04 июня '09 в 5:49
источник поделиться

Вы можете нажать текущую ветвь с командой

git push origin HEAD

(взято из здесь)

7
ответ дан Andriy F. 23 июня '15 в 10:50
источник поделиться

Вы можете изменить это поведение по умолчанию в .gitconfig, например:

[push]
  default = current

Чтобы проверить текущие настройки, запустите:

git config --global --get push.default
6
ответ дан kenorb 24 окт. '15 в 20:10
источник поделиться

Вместо использования псевдонимов я предпочитаю создавать сценарии 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

Очевидно, что он может быть адаптирован также для проверки, но мне нравится сценарий сделать одно и сделать это хорошо

3
ответ дан Mark Fisher 19 апр. '12 в 18:55
источник поделиться

В мой файл .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
}
2
ответ дан MichaelMoser 22 мая '14 в 10:43
источник поделиться

Другие вопросы по меткам