Поведінка "git push" за замовчуванням без вказаної гілки


1366

Я використовую таку команду для переходу до моєї віддаленої гілки:

git push origin sandbox

Якщо я скажу

git push origin

це також потікає зміни в інших моїх гілках чи це лише оновлення моєї поточної гілки? У мене є три гілки: master, productionі sandbox.

git pushДокументація не надто ясно про це, так що я хотів би уточнити це на благо.

У яких гілках та видаленнях git pushточно оновлюються наведені нижче команди?

git push 
git push origin

origin вище - пульт.

Я розумію, що git push [remote] [branch]натисне лише цю гілку на віддалений.


Що стосується конфігурації дифф інструментова в цілому, і нового сценарію мерзотника difftool, я додав новий відповідь на цій другій SO питанні: stackoverflow.com/questions/255202 / ...
VonC

67
Я робив публікацію в блозі про дивовижну поведінку git push, яке може зацікавити
Марк Лонгейр

1
@Mark: в іншій роботі, просуваючи лише поточну гілку до її відстеженої вгору за течією. Приємно.
VonC


help.github.com/articles/pushing-to-a-remote Надіславши це посилання сюди для негайної допомоги таким послушникам, як я
MycrofD

Відповіді:


1591

Ви можете керувати поведінкою за замовчуванням, встановивши push.default у своєму git config. З документації на git-config (1) :

push.default

Визначає, що натискання дії git повинно відбуватися, якщо в командному рядку не вказано refspec, у віддаленому режимі не налаштовано refspec, і жодна з опцій, вказаних у командному рядку, не має на увазі refspec. Можливі значення:

  • nothing: нічого не штовхати

  • matching: натиснути всі відповідні гілки

    Усі гілки, що мають однакове ім’я в обох кінцях, вважаються збігаються.

    Це було раніше за замовчуванням, але не оскільки Git 2.0 ( simpleце новий за замовчуванням).

  • upstream: натисніть поточну гілку до її гілки вгору ( trackingє застарілим синонімом для upstream)

  • current: натисніть поточну гілку до однойменної гілки

  • simple: (новий у Git 1.7.11), як висхідний, але відмовляється натиснути, якщо назва гілки вище за течією відрізняється від локальної

    Це найбезпечніший варіант і добре підходить для новачків.

    Цей режим став за замовчуванням у Git 2.0.

Прості, поточні та поточні режими призначені для тих, хто хоче висунути одну гілку після закінчення роботи, навіть коли інші гілки ще не готові висуватися

Приклади командного рядка:

Щоб переглянути поточну конфігурацію:

git config --global push.default

Щоб встановити нову конфігурацію:

git config --global push.default current

11
Напевно, варто відзначити, що це нове в версії 1.6.3: kernel.org/pub/software/scm/git/docs/RelNotes-1.6.3.txt
CB Bailey

8
Цей "push.default" - це найбільша річ, яка коли-небудь працювала з кількома репозиціями. Встановіть його на «стеження», і ви все добре. У поєднанні з гілкою - встановити вгору за течією, це робить зручніший поштовх і потяг.
jpswain

13
"відстеження" є застарілим синонімом "upstream": kernel.org/pub/software/scm/git/docs/git-config.html
LuckyMalaka

22
Варто зазначити, що станом на Git 1.7.11 з'явився новий simpleрежим. Цей режим повинен стати за замовчуванням у майбутньому. simpleпрацює як upstream, але як currentвимагає, щоб назви гілок були однаковими з обох кінців.
Кай

9
Варто зазначити, що станом на Git 2.0 simpleповедінка за замовчуванням.
do0g

209

Ви можете налаштувати поведінку за замовчуванням для вашого git за допомогою push.default

git config push.default current

або якщо у вас є багато сховищ і ви хочете однакове для всіх тоді

git config --global push.default current

Струму в цій установці означає , що за замовчуванням буде тільки натиснути поточну гілку , коли ви робите Git поштовх

Інші варіанти:

  • нічого: нічого не штовхати
  • відповідність: натисніть всі відповідні гілки (за замовчуванням)
  • відстеження: натисніть поточну гілку на все, що вона відстежує
  • струм: натисніть поточну гілку

ОНОВЛЕННЯ - Новий спосіб зробити це

Станом на Git 1.7.11 виконайте наступне:

git config --global push.default simple

Це нова установка, яка вводиться так само, як і поточна, і буде зроблено за замовчуванням git від v 2.0 відповідно до чуток


29
Так, я читаю відповідь, на яку ви звертаєтесь, але ця відповідь говорить лише про те, що робити, а не як це зробити. Тому я додав свою відповідь, тому вся інформація, необхідна для її налаштування, знаходиться на одній сторінці.
Крістофер

3
ДОБРЕ; краще запропонувати редагувати згаданий пост, тому що ніхто не побачить вашої відповіді, оскільки це, ймовірно, не
набере

як би йти на потяг до поточної гілки? git pull походження?
Франсуа

200

git push origin буде натискати всі зміни на локальних гілках, які мають відповідні віддалені гілки origin As дляgit push

Діє як git push <remote> , де <remote>віддалений (або вихідний) поточної гілки, якщо для поточної гілки не налаштовано віддалений).

З розділу Приклади git-pushсторінки man


2
Так, це дає зрозуміти. Я, мабуть, запускаю старішу версію git (1.6.1.1 Mac OS X), яка не має цих прикладів на сторінці man.
PlagueHammer

Ймовірно, я бігаю 1.6.3.1. Я знайшов це на сайті, з яким я зв’язав, проте.
бодотака

2
Отже, у моєму випадку, коли всі локальні гілки мають однакове віддалене "походження", "git push" був би точно таким же, як "git push origin", який би витісняв лише локальні гілки, які мають відповідну гілку у віддаленому.
PlagueHammer

@Debajit Прямо! Велике питання до речі. Я завжди вважав, що git push поштовх лише поточну гілку. Мабуть, ні! Дуже добре знати.
бодотака

5
Це питання старе, але для кого-небудь нового, @docgnome є правильним. Якщо просто запустити "git push origin", висунете всі гілки замість лише поточної гілки. Використовуйте "git push -f -v -n походження розвитку", щоб примусити натиснути гілку, названу розробкою. Використовуйте прапор -n, щоб імітувати результат натискання git, щоб ви могли заздалегідь побачити, які гілки будуть впливати. Якщо це добре виглядає, запустіть "git push -f -v походження розвитку". Це може бути корисно stackoverflow.com/questions/3741136/git-push-f-vs
Ділан Валаде

54

Я просто привласнив свій код до гілки та перемістив його до 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

3
Ви можете згубити команду на `git commit -am" ... "`
Джеймс Харрінгтон

17
Чи відповідає ця відповідь на питання ?? :?
Асим КТ

26

Ось дуже зручна та корисна інформація про Git Push : Git Push: Просто порада

Найбільш поширене використання git push - це переміщення локальних змін у ваше загальнодоступне сховище. Якщо припустити, що висхідний потік є віддаленим з назвою "походження" (віддалене ім'я за замовчуванням, якщо ваш сховище є клоном), а гілка, яку потрібно оновити до / з, має ім'я "master" (назва гілки за замовчуванням), це робиться за допомогою:git push origin master

git push origin підштовхне зміни з усіх локальних гілок до відповідних гілок віддаленого походження.

git push origin master підштовхне зміни з локальної гілки ведучої до віддаленої ведучої гілки.

git push origin master:staging буде натискати зміни від локальної гілки головного до віддаленої гілки інсценування, якщо вона існує.


git push origin branch_nameчомусь натисніть не тільки branch_nameгілку, але й інші мої локальні гілки (git версія 1.9.1).
mrgloom

git push origin master:stagingце дивовижний прихований дорогоцінний камінь!
Шейкель

19

(Березень 2012 р.)
Остерігайтеся: ця matchingполітика за умовчанням " " може змінитися незабаром
(іноді після git1.7.10 +)
:

Див. " Будь ласка, обговоріть: що робити" git push ", коли ви не говорите, що натиснути? "

У поточному налаштуванні (тобто push.default=matching) git pushбез аргументів буде натискати всі гілки, які існують локально та віддалено з тим самим ім'ям .
Зазвичай це доцільно, коли розробник натискає на власне загальнодоступне сховище, але може бути заплутаним, якщо не небезпечним при використанні спільного сховища.

Пропозиція полягає в тому, щоб змінити типовий параметр на ' upstream' , тобто натиснути тільки поточну гілку, і натиснути її на потяг гілки, з якої потягнеться
Ще один кандидат -current '; це натискає лише поточну гілку на віддалену гілку з однойменною назвою.

Що було обговорено дотепер, можна побачити у цій темі:

http://thread.gmane.org/gmane.comp.version-control.git/192547/focus=192694

Попередні відповідні дискусії включають:

Щоб приєднатися до дискусії, надсилайте свої повідомлення на адресу: git@vger.kernel.org


18

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

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

Підштовхне поточну гілку до початку git pubабо з іншим репо git pub repo-name. Смачно.


4
Це добре, але, на жаль, передбачається, що філія має таку саму назву в іншому сховищі. Спробуйте git push -u --repo="origin" $1;замість цього. Це працює досить добре, за винятком випадків, коли ви перейдете до іншого сховища, назва гілки буде іменем, яке використовує інше сховище, а не тим, на яке ви натискаєте
Casebash

Гей, дякую! Змушує мене зробити більш повну версію, яка перевіряє стан відстеження перед натисканням. Але я поки що дотримуватимусь свого, оскільки рідко маю різні назви гілок між repos.
Мат Шаффер


8

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" підштовхне мою гілку "в даний час".


3
Якщо ви завжди хочете поведінки gpush, ви також можете встановити remote.origin.push = HEAD (наприклад, "git config remote.origin.push HEAD"), як зазначено у розділі прикладів сторінки git-push man.
Тревор Робінсон

5
Це не обов'язково, якщо ви подивитеся на вищезгаданий пост від "Брайана Л".
jpswain

1
Це так, як немає позашляховика. для pull pull.default
SamGoody

8

Ви можете змінити цю поведінку за замовчуванням у своїх .gitconfig, наприклад:

[push]
  default = current

Щоб перевірити поточні налаштування, запустіть:

git config --global --get push.default

3

Замість того, щоб використовувати псевдоніми, я віддаю перевагу створенню 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

Очевидно, це може бути пристосовано також робити замовлення, але мені подобається, що сценарії роблять одне і роблять це добре


відмінна настройка ідеї remote.origin.push для використання геррі. Усі мої локальні гілки feature/fix_fubarвказують на більш загальні гілки вгору за течією, наприклад, masterабо develop, тож це вказувало б на неправильну верхню течію. Як виглядає ваш місцевий потік для репостів, контрольованих геррітами?
spazm

Якщо у вас є лише одна «цільова» гілка на геррі, спробуйте просто git config remote.origin.push HEAD:refs/for/master.
fracz

2

Я додав наступні функції у свій .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
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.