Как вставить новую локальную ветку в удаленный репозиторий Git и отследить ее тоже? - PullRequest
4014 голосов
/ 04 мая 2010

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

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

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

Как мне это сделать?

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

Ответы [ 13 ]

6242 голосов
/ 04 июня 2011

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

git checkout -b <branch>

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

git push -u origin <branch>

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

471 голосов
/ 20 января 2014

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

git push --all -u

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

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

142 голосов
/ 04 мая 2010

До введения 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
121 голосов
/ 24 апреля 2015

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

git branch <branch-name>

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

git push -u origin <branch-name>
81 голосов
/ 05 июля 2016

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

  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-setupstream. Это добавит ссылку отслеживания восходящего потока для текущей ветви. Вы можете убедиться в этом, посмотрев в свой файл .git / config:

    Enter image description here

35 голосов
/ 20 марта 2017

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

git push -u origin localBranch:remoteBranchToBeCreated

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

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

30 голосов
/ 04 мая 2010

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

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
23 голосов
/ 04 мая 2010

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


Используйте git publish-branch из Разные инструменты Git Уильяма ( Призрачный репо и Клон ).

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

21 голосов
/ 03 июня 2015

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

git checkout -b <new_branch>

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

git push -u origin <new_branch>

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

11 голосов
/ 06 декабря 2016

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

git checkout -b name_branch

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

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

git push -u origin name_new_branch

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

...