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

3689

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

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

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

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

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

Теги:
git-branch
git-push
repository

13 ответов

6114
Лучший ответ

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

git checkout -b <branch>

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

git push -u origin <branch>

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

  • 60
    Стоит также отметить, что если у вас уже установлена ветвь отслеживания в ветви, которую вы push.default , и push.default настроен на upstream push.default , это не будет делать то, что вы думаете, так и будет. Он попытается вытолкнуть существующую ветку отслеживания. Используйте: git push -u origin mynewfeature:mynewfeature или git push -u origin mynewfeature:mynewfeature выполните git branch --unset-upstream .
  • 1
    Мне все еще нужно было «git branch --set-upstream-to origin / remote», чтобы «git status» правильно сообщал о состоянии моей ветки относительно удаленной ветки.
Показать ещё 8 комментариев
427

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

git push --all -u

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

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

  • 14
    и git pull --all все это тянет в другом месте? Kewl
  • 1
    Эта команда настраивает отслеживание на правильную ветвь без необходимости что-либо выдвигать. Спасибо.
Показать ещё 4 комментария
127

До введения 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
  • 1
    иногда вам нужно это git push origin -u local_branch:remote_branch
116

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

git branch <branch-name>

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

git push -u origin <branch-name>
  • 14
    git branch <branch-name> и git checkout -b <branch-name> оба создают ветку, но checkout переключаются на новую ветку
  • 1
    скобка, чувак, просто нужно упомянуть, что вы должны заменить любое имя ветки, которое хотите создать, и нажать.
61

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

  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:

    Изображение 7466

  • 1
    Спасибо :) git push -u origin <branch-name> не работал для меня, но использование HEAD вместо <branch-name> работало отлично :)
28

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

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

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

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

    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 делает автоматически, когда вы помещаете свой код в их хранилище :-)
Показать ещё 5 комментариев
25

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

git push -u origin localBranch:remoteBranchToBeCreated

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

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

19

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


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

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

  • 1
    это предполагает, что у меня установлен ruby. нет такой удачи какие-нибудь другие идеи?
  • 2
    скрипт ruby вызывает команды git push и git config . Я использовал код скрипта для редактирования своего ответа. Вы могли бы использовать эту информацию для создания небольшого сценария оболочки, который выполняет ваши задачи.
Показать ещё 2 комментария
16

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

git checkout -b <new_branch>

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

git push -u origin <new_branch>

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

7

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

6

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

git checkout -b name_branch

(name_branch, ex: master)

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

git push -u origin name_new_branch

(name_new_branch, пример: функция)

1

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

Чтобы загрузить локальную ветвь общедоступного репозитория, вам нужно cd открыть общий репозиторий, а затем использовать следующий код:

git push -u origin branchname
  • 18
    Этот ответ ничего не добавляет к (многочисленным) существующим ответам и даже имеет некоторые недостатки (удаленное репо не должно быть публичным репо).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню