Як я натискаю нову локальну гілку до віддаленого сховища Git і відстежую її?


4303

Я хочу вміти робити наступне:

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

  2. Перемістіть локальну гілку до віддаленого сховища (опублікуйте), але зробіть її відстежуваною git pullта git pushпрацюватиме негайно.

Як це зробити?

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



71
просто для того, щоб зазначити
початковий

@BaiyanHuang дякую, що вказав на це. Спочатку я подумав, що -у мав на увазі, що це не мав сенсу
Дмитро

Відповіді:


6609

У Git 1.7.0 та новіших версіях ви можете оформити нову гілку:

git checkout -b <branch>

Редагуйте файли, додайте та вводите. Потім натисніть на -u(короткий для --set-upstream) варіант:

git push -u origin <branch>

Git налаштує інформацію відстеження під час натискання.


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.
Путердо Борато

3
Чи git push -u походження <branch> те саме, що GIT push -u походження HEAD (якщо припустити, ви маєте гілку, яку ви хочете натиснути?)
gymbrall

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?
користувач1823664

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
Аді Прасетьо

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>працював ідеально :)
Даніель Тонон

56

Я просто роблю

git push -u origin localBranch:remoteBranchToBeCreated

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

Git створює нову гілку, названу remoteBranchToBeCreatedпід моїми зобов'язаннями, які я робив у localBranch.

Редагувати : це змінює (поточну назву localBranch) вашої поточної місцевої філії на поточну origin/remoteBranchToBeCreated. Щоб виправити це, просто введіть:

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

Тож ваша нинішня місцева філія тепер відслідковується origin/localBranch.


1
Це те , що саме я активно шукав
Eli

git кидає, 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
    

ПРИМІТКА. Я припускаю, що у вас працює сервер і працює. Якщо це не так, він не працюватиме. Хороший підказки тут .

ДОБАВЛЕНО

Додати віддалену гілку:

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 і 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 Вільяма ( знаменитий репо і клон ).

Гаразд, ні Рубі, так що - ігнорування гарантій! - візьміть останні три рядки сценарію та створіть скрипт 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
це передбачає, що у мене встановлений рубін. немає такої удачі. будь-які інші ідеї?
Роні Янів

2
сценарій рубіну дзвінки 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

Розглядаючи трохи відповіді тут, я завершив цей процес як простий сценарій Баша, який, звичайно, може бути використаний і як псевдонім 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.