Как мне отправить новую локальную ветку в удаленный репозиторий Git и отследить ее тоже?

Я хочу уметь делать следующее:

  1. Создайте локальную ветку на основе другой (удаленной или локальной) ветки (через git branch или git checkout -b)

  2. Отправьте локальную ветку в удаленный репозиторий (опубликуйте), но сделайте ее отслеживаемой, чтобы git pull и git push работали немедленно.

Как я могу это сделать?

Я знаю о --set-upstream в Git 1.7, но это действие после создания. Я хочу найти способ сделать подобное изменение при отправке ветки в удаленный репозиторий.


person Roni Yaniv    schedule 04.05.2010    source источник
comment
просто чтобы указать --set-upstream is -u   -  person baye    schedule 18.12.2013
comment
множество ответов, содержащих несвязанную информацию (например, как создать ветку), и если ответ применим, то информация об используемых магических параметрах отсутствует.   -  person Frank Puck    schedule 21.08.2020
comment
@VividD добавил иллюстративную картинку - Серьезно? o.O   -  person Andreas    schedule 10.10.2020


Ответы (15)


В Git 1.7.0 и новее вы можете оформить заказ на новую ветку:

git checkout -b <branch>

Редактируйте файлы, добавляйте и фиксируйте. Затем нажмите кнопку -u (сокращение от --set-upstream):

git push -u origin <branch>

Git настроит отслеживающую информацию во время push.

person Daniel Ruoso    schedule 03.06.2011
comment
Также стоит отметить, что если у вас есть существующая ветка отслеживания, уже установленная в ветке, которую вы нажимаете, а для push.default установлено значение upstream, это не будет делать то, что вы думаете. Он попытается протолкнуть существующую ветку отслеживания. Используйте: git push -u origin mynewfeature:mynewfeature или сначала сделайте git branch --unset-upstream. - person void.pointer; 19.05.2014
comment
Мне все еще нужно было «git branch --set-upstream-to origin / remote», чтобы «git status» правильно сообщал о состоянии моей ветки относительно удаленной ветки. - person Paul Whipp; 04.07.2014
comment
Для людей, использующих Git из Visual Studio: на самом деле это делает Publish Branch в Visual Studio. После выполнения git push с параметром -u я наконец могу увидеть свою ветку, опубликованную в VS UI. - person Puterdo Borato; 19.03.2015
comment
Для тех, кто все еще не понимает концепции, мне нравится ДУМАТЬ об этом, что git push -u origin myepicbranchname равно git checkout -b myepicbranchname с точки зрения того, что он делает. Git push делает больше, но с точки зрения простоты это, скорее всего, то, что вы хотите знать о них;) - person SidOfc; 21.07.2015
comment
Несколько досадно, я обнаружил, что git push -u origin branchname не работает, а git push -u --set-upstream origin branchname работает. Это со скриптами PoshGit, поставляемыми с Github для Windows. - person JonTheNiceGuy; 22.12.2016
comment
Помните, что если вы хотите, чтобы ваша удаленная ветка имела другое имя, вам следует сначала изменить имя локально. Например, предположим, что у меня есть ветка с локальным именем a-named-branch, и я хочу отправить ее на удаленный сервер. Если я запускаю git push origin new-named-branch, я получаю сообщение об ошибке error: src refspec new-named-branch does not match any.. Исправление - запустить git branch -m new-named-branch, а затем запустить git push origin new-named-branch. - person Jonathan Morales Vélez; 18.10.2017
comment
Вы также можете использовать git push -u origin HEAD - person amaslenn; 19.12.2017
comment
@Stephane Вам нужен -u только один раз, чтобы начать отслеживание. После просто используйте git push - person Todd; 11.01.2018
comment
@ JonathanMoralesVélez менять местную ветку не нужно. Вы можете отправить локальную ветку на любое имя удаленной ветки, например: git push origin local-branch-name:remote-branch-name. Где origin - это имя удаленного (часто на самом деле origin, local-branch-name - это фактическое имя вашего локального имени ветки, а remote-branch-name - ваше желаемое имя ветки, на которое вы хотите нажать. - person Darren Felton; 04.11.2020

Если вы не делитесь своим репозиторием с другими, полезно отправить все свои ветки на удаленный компьютер и --set-upstream отслеживать правильно для вас:

git push --all -u

(Не совсем то, о чем просил OP, но этот однострочный вариант довольно популярен)

Если вы делитесь своим репо с другими, это не очень хорошая форма, поскольку вы забиваете репо всеми своими хитроумными экспериментальными ветками.

person ErichBSchulz    schedule 20.01.2014
comment
и git pull --all все это тянет обратно в другое место? Kewl - person commonpike; 20.10.2014
comment
Эта команда настраивает отслеживание до правильной ветви без необходимости что-либо нажимать. Спасибо. - person amey91; 22.01.2015
comment
Git позволяет зафиксировать ветку, а не продвигать ее по очень веским причинам. Только использование git push --all похоже на отбрасывание части архитектуры git. Если это работает для вас, это нормально, отлично, делайте это вечно. Но ПОЖАЛУЙСТА, не рекомендуйте другим избегать изучения git только потому, что это быстрый способ сделать что-то. - person Federico Razzoli; 20.07.2016
comment
Это действительно неправильный ответ и не лучший инструмент, чтобы рекомендовать его без реального объяснения того, что он делает и каковы последствия. Пожалуйста, подумайте о том, чтобы записать этот ответ. - person akronymn; 31.01.2017
comment
@Federico @akronymn Где можно найти опасность делать git push --all -u? - person user1823664; 02.08.2017
comment
@akronymn @ Федерико - Я отредактировал его, чтобы разъяснить, какие, на мой взгляд, опасности - это лучше? - person ErichBSchulz; 19.03.2018

До введения git push -u не было возможности git push получить желаемое. Вам пришлось добавить новые операторы конфигурации.

Если вы создаете новую ветку, используя:

$ git checkout -b branchB
$ git push origin branchB:branchB

Вы можете использовать команду git config, чтобы не редактировать файл .git/config напрямую:

$ git config branch.branchB.remote origin
$ git config branch.branchB.merge refs/heads/branchB

Или вы можете вручную отредактировать файл .git/config, чтобы добавить информацию об отслеживании в эту ветку:

[branch "branchB"]
    remote = origin
    merge = refs/heads/branchB
person Lohrun    schedule 04.05.2010
comment
иногда вам это нужно git push origin -u local_branch:remote_branch - person Bruce Lee; 21.08.2018
comment
почему git push origin -u remote_branch_name иногда работает, а иногда нет? - person mss; 27.07.2020

Проще говоря, чтобы создать новую локальную ветку, выполните:

git branch <branch-name>

Чтобы отправить его в удаленный репозиторий, выполните:

git push -u origin <branch-name>
person piyushmandovra    schedule 24.04.2015
comment
git branch <branch-name> и git checkout -b <branch-name> оба создают ветку, но проверка переключается на новую ветку - person Robert; 11.08.2016
comment
Скобка чувака - это просто упоминание, что вы должны заменить любое имя ветки, которое вы хотите создать, и нажать. - person piyushmandovra; 30.05.2018
comment
это несуществующая ветка на удаленном компьютере и отклонить с помощью src branch-name does not match any - person Adi Prasetyo; 06.04.2020
comment
@AdiPrasetyo, можете ли вы уточнить, что вы пытаетесь сказать / спросить? - person piyushmandovra; 08.06.2020

Небольшая вариация уже приведенных здесь решений:

  1. Создайте локальную ветку на основе другой (удаленной или локальной) ветки:

    git checkout -b branchname
    
  2. Отправьте локальную ветку в удаленный репозиторий (опубликуйте), но сделайте ее отслеживаемой, чтобы git pull и git push работали немедленно

    git push -u origin HEAD
    

    Использование HEAD - это «удобный способ переместить текущую ветку с тем же именем на удаленном компьютере». Источник: https://git-scm.com/docs/git-push в Git термины, HEAD (в верхнем регистре) - это ссылка на вершину текущей ветви (дерева).

    Параметр -u - это просто сокращение от --set-upstream. Это добавит ссылку отслеживания восходящего потока для текущей ветки. вы можете проверить это, посмотрев в свой файл .git / config:

    Введите здесь описание изображения

person bg17aw    schedule 05.07.2016
comment
Спасибо :) git push -u origin <branch-name> у меня не работал, но использование HEAD вместо <branch-name> сработало отлично :) - person Daniel Tonon; 07.11.2016

Я просто делаю

git push -u origin localBranch:remoteBranchToBeCreated

над уже клонированным проектом.

Git создает новую ветку с именем remoteBranchToBeCreated под моими коммитами, которые я сделал в localBranch.

Изменить: это изменяет текущую локальную ветку (возможно, с именем localBranch) на origin/remoteBranchToBeCreated. Чтобы исправить это, просто введите:

git branch --set-upstream-to=origin/localBranch

or

git branch -u origin/localBranch

Итак, ваш текущий местный филиал теперь отслеживает origin/localBranch назад.

person Arda    schedule 20.03.2017
comment
Это именно то, что я активно искал - person eli; 14.05.2019
comment
git выдает error: src refspec <new branch> does not match any., когда я пытаюсь это сделать. - person codeforester; 06.07.2019
comment
Это должен быть главный ответ. - person Aditya Abhas; 13.05.2020

Я предполагаю, что вы уже клонировали такой проект, как:

git clone http://github.com/myproject.git
  1. Затем в вашей локальной копии создайте новую ветку и проверьте ее:

    git checkout -b <newbranch>
    
  2. Предположим, что вы создали «git bare --init» на своем сервере и создали myapp.git, вам следует:

    git remote add origin ssh://example.com/var/git/myapp.git
    git push origin master
    
  3. После этого пользователи смогут

    git clone http://example.com/var/git/myapp.git
    

ПРИМЕЧАНИЕ. Я предполагаю, что ваш сервер настроен и работает. Если это не так, это не сработает. Хорошее руководство можно найти здесь.

ДОБАВЛЕН

Добавьте удаленную ветку:

git push origin master:new_feature_name

Проверьте, все ли в порядке (выберите источник и перечислите удаленные ветки):

git fetch origin
git branch -r

Создайте локальную ветку и отслеживайте удаленную ветку:

git checkout -tb new_feature_name origin/new_feature_name

Обновить все:

git pull
person VP.    schedule 04.05.2010
comment
Сценарий Уильяма, с которым я связался, делает примерно то же самое с дополнительной возможностью удаления удаленных веток и некоторыми мерами безопасности. - person Tobias Kienzler; 04.05.2010
comment
›Чтобы отправить локальную ветку в удаленное репо (опубликовать), но сделайте ее› отслеживаемой, чтобы git pull и git push работали немедленно. это то, что github делает автоматически, когда вы отправляете свой код в их репозиторий :-) - person VP.; 04.05.2010
comment
Это не отвечает на вопрос, ‹newbranch› исходного репо не отслеживается (и переименован в ‹master› - это новое репо, которое вы клонируете на шаге 3). - person Lohrun; 04.05.2010
comment
кажется излишним. git remote add origin делает ли местный филиал отслеживаемым? это ключевая команда здесь? - person Roni Yaniv; 04.05.2010
comment
@Roni Yaniv: нет git remote add origin только зарегистрировать новый удаленный репозиторий. Это всего лишь шаг, необходимый перед отправкой вашей ветки в этот удаленный репозиторий (если вы не хотите каждый раз вводить весь адрес) - person Lohrun; 04.05.2010
comment
ну - у нас уже есть удаленное репо (origin). Мне нужен способ добавить новую локальную ветку в это репо, сделав ее отслеживаемой + выталкиваемой + вытягиваемой в процессе. - person Roni Yaniv; 04.05.2010
comment
В команде git push origin master:new_feature_name master - это ветка, над которой вы работаете. Если вы находитесь в другой ветке (назовем ее oldbranch и хотите нажать на newbranch, команда будет похожа на git push origin oldbranch:newbranch. - person Arda; 22.04.2016

edit Устарело, просто используйте git push -u origin $BRANCHNAME


Используйте git publish-branch из различных инструментов Git Уильяма.

Хорошо, без Ruby, так что - игнорируя меры предосторожности! - возьмите последние три строки сценария и создайте сценарий bash, git-publish-branch:

#!/bin/bash
REMOTE=$1 # Rewrite this to make it optional...
BRANCH=$2
# Uncomment the following line to create BRANCH locally first
#git checkout -b ${BRANCH}
git push ${ORIGIN} ${BRANCH}:refs/heads/${BRANCH} &&
git config branch.${BRANCH}.remote ${REMOTE} &&
git config branch.${BRANCH}.merge refs/heads/${BRANCH}

Затем запустите git-publish-branch REMOTENAME BRANCHNAME, где REMOTENAME обычно является источником (вы можете изменить скрипт, чтобы он принимал исходное значение по умолчанию и т. Д.)

person Tobias Kienzler    schedule 04.05.2010
comment
это предполагает, что у меня установлен Ruby. нет такой удачи. любые другие идеи? - person Roni Yaniv; 04.05.2010
comment
сценарий ruby ​​вызывает команды git push и git config. Я использовал код скрипта, чтобы отредактировать свой ответ. Вы могли бы использовать эту информацию для создания небольшого сценария оболочки, который сделает это за вас. - person Lohrun; 04.05.2010
comment
Различные инструменты git Уильяма, похоже, переместились (эта ссылка теперь мертва). Рабочая ссылка: gitorious.org/willgit - person Mike D; 27.10.2014
comment
Связь Уильяма снова оборвалась; новая ссылка выглядит как git-wt-commit.rubyforge.org - person ScottJ; 11.08.2016
comment
Отредактированный ответ, чтобы иметь только одну рабочую ссылку (github.com/DanielVartanov/willgit) - person Devin Rhode; 16.01.2021

Чтобы создать новую ветку путем ответвления от существующей ветки

git checkout -b <new_branch>

а затем отправьте эту новую ветку в репозиторий, используя

git push -u origin <new_branch>

Это создает и отправляет все локальные коммиты во вновь созданную удаленную ветку origin/<new_branch>

person cptjack    schedule 03.06.2015

Для версии GitLab до 1.7 используйте:

git checkout -b name_branch

(название_отрасли, например: master)

Чтобы отправить его в удаленный репозиторий, выполните:

git push -u origin name_new_branch

(название_новое_отрасль, пример: feature)

person Fadid    schedule 06.12.2016

Я сделал псевдоним, чтобы всякий раз, когда я создаю новую ветку, она будет нажимать и отслеживать удаленную ветку соответствующим образом. Я помещаю следующий кусок в .bash_profile файл:

# Create a new branch, push to origin and track that remote branch
publishBranch() {
  git checkout -b $1
  git push -u origin $1
}
alias gcb=publishBranch

Использование: просто введите gcb thuy/do-sth-kool, где thuy/do-sth-kool - это имя моей новой ветки.

person Thuy Trinh    schedule 05.01.2016

Вы можете сделать это в 2 этапа:

1. Используйте checkout для создания локального филиала:

git checkout -b yourBranchName

Работайте со своим Филиалом как хотите.

2. Используйте команду push, чтобы автоматически создать ветку и отправить код в удаленный репозиторий:

git push -u origin yourBanchName

Есть несколько способов сделать это, но я думаю, что это действительно простой способ.

person Javier C.    schedule 02.10.2019

Слегка опираясь на приведенные здесь ответы, я превратил этот процесс в простой сценарий Bash, который, конечно же, можно было бы использовать как псевдоним Git.

Важным дополнением для меня является то, что это побуждает меня запускать модульные тесты перед фиксацией и по умолчанию передает имя текущей ветки.

$ git_push_new_branch.sh

  Have you run your unit tests yet? If so, pass OK or a branch name, and try again

  usage: git_push_new_branch {OK|BRANCH_NAME}

  e.g.

  git_push_new_branch           -> Displays prompt reminding you to run unit tests
  git_push_new_branch OK        -> Pushes the current branch as a new branch to the origin
  git_push_new_branch MYBRANCH  -> Pushes branch MYBRANCH as a new branch to the origin

git_push_new_branch.sh

function show_help()
{
  IT=$(cat <<EOF

  Have you run your unit tests yet? If so, pass OK or a branch name, and try again

  usage: git_push_new_branch {OK|BRANCH_NAME}

  e.g.

  git_push_new_branch.sh           -> Displays prompt reminding you to run unit tests
  git_push_new_branch.sh OK        -> Pushes the current branch as a new branch to the origin
  git_push_new_branch.sh MYBRANCH  -> Pushes branch MYBRANCH as a new branch to the origin

  )
  echo "$IT"
  exit
}

if [ -z "$1" ]
then
  show_help
fi

CURR_BRANCH=$(git rev-parse --abbrev-ref HEAD)
if [ "$1" == "OK" ]
then
  BRANCH=$CURR_BRANCH
else
  BRANCH=${1:-$CURR_BRANCH}
fi

git push -u origin $BRANCH
person Brad Parks    schedule 21.04.2017

Для максимальной гибкости вы можете использовать настраиваемую команду Git. Например, создайте следующий сценарий Python где-нибудь в вашем $PATH под именем git-publish и сделайте его исполняемым:

#!/usr/bin/env python3

import argparse
import subprocess
import sys


def publish(args):
    return subprocess.run(['git', 'push', '--set-upstream', args.remote, args.branch]).returncode


def parse_args():
    parser = argparse.ArgumentParser(description='Push and set upstream for a branch')
    parser.add_argument('-r', '--remote', default='origin',
                        help="The remote name (default is 'origin')")
    parser.add_argument('-b', '--branch', help='The branch name (default is whatever HEAD is pointing to)',
                        default='HEAD')
    return parser.parse_args()


def main():
    args = parse_args()
    return publish(args)


if __name__ == '__main__':
    sys.exit(main())

Затем git publish -h покажет вам информацию об использовании:

usage: git-publish [-h] [-r REMOTE] [-b BRANCH]

Push and set upstream for a branch

optional arguments:
  -h, --help            show this help message and exit
  -r REMOTE, --remote REMOTE
                        The remote name (default is 'origin')
  -b BRANCH, --branch BRANCH
                        The branch name (default is whatever HEAD is pointing to)
person Eugene Yarmash    schedule 31.12.2019

Думаю это простейший псевдоним, добавьте в свой ~/.gitconfig

[alias]
  publish-branch = !git push -u origin $(git rev-parse --abbrev-ref HEAD)

Ты просто бежишь

git publish-branch

и ... издает ветку

person Devin Rhode    schedule 16.01.2021