Поведение "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 в удаленную промежуточную ветку, если она существует.

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

git push origin HEAD

(взял отсюда)

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

Предыдущие соответствующие обсуждения включают в себя:

Чтобы присоединиться к обсуждению, отправьте свои сообщения по адресу: 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

Ссылки: ответ tweetdocs commit

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