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


4308

Я хочу иметь возможность сделать следующее:

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

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

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

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



73
просто чтобы указать --set-upstream is -u
Baiyan Huang

@BaiyanHuang спасибо за указание на это. Сначала я подумал, что -u имел в виду неисследованный, что не имеет смысла для меня
Дмитрий

Ответы:


6616

В Git 1.7.0 и более поздних версиях вы можете оформить новую ветку:

git checkout -b <branch>

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

git push -u origin <branch>

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


81
Также стоит отметить, что если у вас уже есть ветвь отслеживания в ветви, которую вы нажимаете, и push.defaultона настроена на upstream, это не будет делать то, что, как вы думаете, будет. Он попытается вытолкнуть существующую ветку отслеживания. Используйте: git push -u origin mynewfeature:mynewfeatureили сделайте git branch --unset-upstreamпервым.
void.pointer

13
Для людей, использующих Git из Visual Studio: На самом деле это то, что делает «Опубликовать ветку» в Visual Studio. После выполнения git push с параметром -u я наконец могу увидеть свою ветку, опубликованную в VS UI.
Puterdo Borato

3
Является ли git push -u origin <branch> таким же, как git push -u origin HEAD (при условии, что у вас есть ветвь, которую вы хотите отправить push-
уведомление

13
Нужна ли нам эта -uопция каждый раз, когда мы отправляем ветку на ее удаленный сервер, или она нужна только в первый раз?
Стефан

17
@ Stephane Вам нужно только -uодин раз, чтобы начать отслеживание. После просто использоватьgit push
Тодд

491

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

git push --all -u

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

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


14
и git pull --allтянет все это в другое место? kewl
commonpike

1
Эта команда настраивает отслеживание на правильную ветвь без необходимости что-либо выдвигать. Спасибо.
amey91

45
Git позволяет фиксировать ветку и не выдвигать ее по очень веским причинам. Только использование git push - все равно что отбросить кусочек git архитектуры. Если это работает для вас, это совершенно нормально, отлично, делайте это вечно. Но ПОЖАЛУЙСТА, не рекомендуйте другим избегать изучения git только потому, что это быстрый способ сделать что-то.
Федерико Раззоли

4
Это действительно неправильный ответ и не является хорошим инструментом для рекомендации без реального объяснения того, что он делает и каковы последствия. Пожалуйста, рассмотрите возможность принятия этого ответа.
акроним

3
@Federico @akronymn Где можно найти опасность делать git push --all -u?
user1823664

155

До введения 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

4
иногда это нужноgit push origin -u local_branch:remote_branch
Брюс Ли

127

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

git branch <branch-name>

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

git push -u origin <branch-name>

17
git branch <branch-name>и git checkout -b <branch-name>оба создают ветку, но проверяют переход на новую ветку
Роберт

1
скобка, чувак, просто нужно упомянуть, что вы должны заменить любое имя ветки, которое хотите создать, и нажать.
Пиюшмандовра

это несуществующая ветка на удаленном компьютере, и отклонить с помощьюsrc branch-name does not match any
Adi Prasetyo

@AdiPrasetyo вы можете уточнить, что вы пытаетесь сказать / спросить?
пиюшмандовра

96

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

  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:

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


2
Спасибо :) git push -u origin <branch-name>не работал для меня, но использовал HEADвместо того, чтобы <branch-name>работать отлично :)
Даниэль Тонон

57

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

git push -u origin localBranch:remoteBranchToBeCreated

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

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

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

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

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


1
Это то , что именно я активно искал
Eli

мерзавец бросает, error: src refspec <new branch> does not match any.когда я пытаюсь это.
Codeforester

1
Это должен быть главный ответ.
Адитья Абхас

30

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

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
    

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

ADDED

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

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

1
Сценарий Уильяма, на который я ссылался, делает то же самое с дополнительной опцией удаления удаленных веток и некоторыми
защитными

1
> отправить локальную ветку в удаленное хранилище (опубликовать), но сделать это> отслеживаемым, чтобы git pull и git push работали немедленно. Это то, что GitHub делает автоматически, когда вы помещаете свой код в их репозиторий :-)
VP.

1
Это не отвечает на вопрос, <newbranch> исходного репо не отслеживается (и переименовывается как <master> - это новый репо, клонированный на шаге 3).
Лохрун

1
кажется излишним. делает git remote add originместную ветку отслеживаемой? это ключевая команда здесь?
Рони Янив

3
@ Рони Янив: не git remote add originтолько зарегистрировать новый удаленный репозиторий. Это всего лишь шаг, необходимый перед отправкой ветки в этот удаленный репозиторий (если вы не хотите каждый раз вводить полный адрес)
Lohrun

23

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


Используйте git publish-branchиз разных инструментов Git Уильяма ( gitorious repo and clone ).

ОК, нет Руби, так что - игнорируем гарантии! - взять последние три строки скрипта и создать скрипт 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 обычно является источником (вы можете изменить сценарий так, чтобы он по умолчанию принимал источник и т. Д.)


1
это предполагает, что у меня установлен ruby. нет такой удачи какие-нибудь другие идеи?
Рони Янив

2
скрипт ruby ​​вызывает git pushи git configкомандует. Я использовал код скрипта для редактирования своего ответа. Вы могли бы использовать эту информацию для создания небольшого сценария оболочки, который выполняет ваши задачи.
Лохрун

1
Различные инструменты git Уильяма, кажется, переместились (эта ссылка теперь мертва). Рабочая ссылка: gitorious.org/willgit
Майк Д

1
Связь с "Уильямом" снова разорвалась; новая ссылка, кажется, git-wt-commit.rubyforge.org
ScottJ

22

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

git checkout -b <new_branch>

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

git push -u origin <new_branch>

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


12

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

git checkout -b name_branch

(name_branch, например: master)

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

git push -u origin name_new_branch

(name_new_branch, пример: feature)


9

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


4

Немного опираясь на ответы здесь, я обернул этот процесс в простой сценарий 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

2

Вы можете сделать это за 2 шага:

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

git checkout -b yourBranchName

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

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

git push -u origin yourBanchName

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


0

Для большей гибкости вы можете использовать собственную команду 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)
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.