Как создать удаленную ветку Git?


3131

Я создал локальную ветку, которую я хочу «продвинуть» вверх по течению. Здесь, на Stack Overflow, есть похожий вопрос о том, как отслеживать недавно созданную удаленную ветку.

Тем не менее, мой рабочий процесс немного отличается. Сначала я хочу создать локальную ветвь, и я буду продвигать ее только тогда, когда я удовлетворен и хочу поделиться своей веткой.

  • Как бы я это сделал? (мои поиски в гугле, похоже, ничего не придумали).
  • Как бы я сказал своим коллегам вытащить его из верхнего хранилища?

ОБНОВЛЕНИЕ С Git 2.0 есть более простой ответ, который я написал ниже: https://stackoverflow.com/a/27185855/109305


14
кто-нибудь когда-нибудь отвечал тебе на второй вопрос? >> А как бы я сказал своим коллегам вытащить его из верхнего хранилища?
milkplus

Возможно связанные: Pro Git: 3.5 Git Branching - Удаленные ветки .

1
@milkplus get fetch --allвыбирает новые ветви на удаленной стороне (но только get fetch --pruneлокально удаляет ссылки на удаленные удаленные ветви). Я думаю, либо они должны быть настроены автоматически, либо вы должны говорить с ними устно.
Петер - Восстановить Монику

Ответы:


3732

Сначала вы создаете свою ветку локально:

git checkout -b <branch-name> # Create a new branch and check it out

Удаленная ветвь создается автоматически, когда вы отправляете ее на удаленный сервер. Поэтому, когда вы почувствуете, что готовы к этому, вы можете просто сделать:

git push <remote-name> <branch-name> 

Где <remote-name>обычно origin, имя, которое git дает удаленному, с которого вы клонировали. Тогда ваши коллеги просто потянут эту ветку, и она автоматически будет создана локально.

Обратите внимание, что формально этот формат:

git push <remote-name> <local-branch-name>:<remote-branch-name>

Но когда вы опускаете один, он предполагает, что оба названия ветвей одинаковы. Сказав это, как предостережение , не делайте критическую ошибку, указав только :<remote-branch-name>(с двоеточием), иначе удаленная ветвь будет удалена!

Чтобы последующий git pullзнал, что делать, вы можете вместо этого использовать:

git push --set-upstream <remote-name> <local-branch-name> 

Как описано ниже, --set-upstreamопция устанавливает восходящую ветвь:

Для каждой ветки, которая обновлена ​​или успешно отправлена, добавьте ссылку вверх по течению (отслеживание), используемую git-pull (1) без аргументов и другими командами.


85
Обратите внимание, что поведение git по умолчанию заключается в отправке соответствующих ссылок, поэтому git push <remote>не будет выдвигать ветвь, если она отсутствует <remote>.
Якуб Наребски

222
Возможно, вы захотите использовать git push -u <remote-name> <branch-name>вместо этого, чтобы последующий git pullзнал, что делать.
Барт Шуллер

87
Вместо того, чтобы явно указывать имя сервера, вы можете просто использовать origin, что означает «сервер, с которого я получил остаток этого репо»: таким образом git push origin <branch-name>.
lambshaanxy

68
Если вы забыли использовать эту -uопцию, вы можете просто напечатать git push -uпотом в ветке, тогда git pullбудет работать.
Янв

90
Собрать все это вместе git push -u origin <local-branch-name>- вот что сработало для меня.
Само

881

Во-первых, вы должны создать свою ветку локально

git checkout -b your_branch

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

git push -u origin your_branch

Товарищи по команде могут добраться до вашего филиала, выполнив:

git fetch
git checkout origin/your_branch

Вы можете продолжить работу в ветке и push в любое время, не передавая аргументы git push (git push без аргументов будет переводить мастер на удаленный мастер, your_branch локальный на удаленный your_branch и т. Д ...)

git push

Товарищи по команде могут нажать на вашу ветку, делая коммиты, а затем толкать явно

... work ...
git commit
... work ...
git commit
git push origin HEAD:refs/heads/your_branch

Или отслеживание ветки, чтобы избежать аргументов для git push

git checkout --track -b your_branch origin/your_branch
... work ...
git commit
... work ...
git commit
git push

Есть ли способ создать удаленную ветку без создания локальной ветки с тем же именем?
Ариэль Габизон

330

Простое решение Git 2.0+:

Начиная с Git 2.0, поведение стало проще :

Вы можете настроить git, push.default = currentчтобы сделать жизнь проще:

Я добавил это, так что теперь я могу просто нажать новую ветку вверх по течению с

$ git push -u

-uбудет отслеживать удаленную ветвь с тем же именем. Теперь с этой конфигурацией вы будете автоматически угадывать удаленную ссылку на git push. Из документации git.config :

push.default

Определяет действие, которое должен выполнить git push, если явно не указан refspec.

push.default = current- нажмите текущую ветку, чтобы обновить ветку с тем же именем на принимающей стороне. Работает как в центральном, так и не центральном рабочих процессах.

Для меня это хорошее упрощение моего повседневного рабочего процесса в Git. Параметр конфигурации учитывает «обычный» вариант использования, когда вы добавляете ветку локально и хотите создать ее удаленно. Кроме того, я могу так же легко создавать локальные ветви из удаленных устройств, просто делая git co remote_branch_name(в отличие от использования --set-upstream-toфлага).

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

Чтобы добавить к вашей глобальной конфигурации Git, запустите это в командной строке:

$ git config --global push.default current

5
Я нашел, git push -u origin HEADкак ответ здесь, немного более многословно (вы пишете, что вы делаете), не слишком много печатать. Кроме того, git push -uбез дополнительных аргументов у меня не получилось, если ветка была создана с-t
Qw3ry

git config --global push.default upstream && git checkout -b foo && <change a file> && git push -uне работает (по состоянию на git 2.19.1); push требует аргументов remote и branch.
вязать

Не могли бы вы рассказать о том, что вы имеете в виду git co remote_branch_name?
flannelbeard

84

Как указано в предыдущих ответах,

git push <remote-name> <local-branch-name>:<remote-branch-name>

достаточно для подталкивания локальной ветки.

Ваши коллеги могут извлечь все удаленные ветви (включая новые) с помощью этой команды:

git remote update

Затем, чтобы внести изменения в ветку, обычный поток:

git checkout -b <local-branch-name> <remote-name>/<remote-branch-name>

Мне нравится это, потому что это позволяет удаленному имени отличаться от локального
Ариэль Габизон

66

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

git checkout -b newbranch

Зафиксируйте любые изменения, как обычно. Затем нажмите вверх по течению:

git push -u origin HEAD

Это ярлык для перемещения текущей ветви к ветви с тем же именем originи отслеживания ее, чтобы вам не нужно было указывать origin HEADв будущем.


4
Это помогло в моем случае: git push -u origin HEAD. Я думаю, что это самый понятный способ.
Scadge

2
Да, вы никогда не помните, что именно вы в последний раз ввели как ветку, так что это путь.
марксизм

4
@marksyzm Если вы не можете вспомнить, в какой ветке вы находитесь или как ее назвали, вам, вероятно, вообще не стоит нажимать! По крайней мере, не без запуска git statusпервым.
Zenexer

1
Да, нужно убедиться, что мир не взорвется от этого толчка; Согласен.
марксизм

1
Это наиболее эффективный способ создания как отслеживающей ветви, так и удаленной ветви одновременно. Я также хотел бы добавить git remote show originв качестве третьего шага только для визуализации новых отношений отслеживания / отслеживания.
hb5fa

54

Если вы хотите создать ветку из текущей ветки

git checkout -b {your_local_branch_name} 

Вы хотите ветку из удаленной ветки, вы можете попробовать

git checkout -b {your_local_branch_name} origin/<remote_branch_name>

Если вы закончили с изменениями, вы можете добавить файл.

git add -A or git add <each_file_names>

Затем сделайте коммит локально

git commit -m 'your commit message'

Когда вы хотите подтолкнуть к удаленному репо

git push -u origin <your_local_branch_name>

Все вместе будет

git checkout -b bug_fixes 

или Если вы хотите создать ветку из удаленной ветки, скажем, разработка

git checkout -b bug_fixes происхождение / разработка

Вы можете нажать на ветку для удаленного репо

git push -u origin bug_fixes

В любое время вы хотите обновить свою ветку из любой другой ветки, скажем, master .

git pull origin master,


46

Если вы хотите просто создать удаленную ветку без локальной, вы можете сделать это следующим образом:

git push origin HEAD:refs/heads/foo

Это подталкивает любую головку к ветке foo, которая не существовала на удаленном компьютере.


Это полностью запутало мою Visual Studio до такой степени, что она не запустилась бы правильно. Team Explorer вообще не будет загружаться, но все остальное тоже помешано на ошибках. Просто к вашему сведению.
Джош

Похоже, это должно работать, но когда я действительно попробовал это, наш сервер gitlab не распознал результат как ветвь.
JosephH

Какая ветка foo разветвлена ​​на удаленном? Что если я захочу, чтобы foo разветвлялся от foo2? Это возможно? Спасибо.
user674669

Он также работает на сервере Gerrit, создавая новую ветку на удаленном сервере, которой не было до этой команды.
MichaelZ

33

Самое простое решение ... Drumm Roll ... git version 2.10.1 (Apple Git-78)

1) git checkout -b localBranchNameThatDoesNotExistInRemote

2) Do your changes, and do a git commit 

3) git push origin localBranchNameThatDoesNotExistInRemote --force

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


3
Спасибо за ваше предложение. Даже если вы называете это простым решением, я все же думаю, что git push -uэто намного проще. Требуется, чтобы у вас была одна глобальная строка конфигурации, см. Stackoverflow.com/a/27185855/109305 . Я использую git push -uпостоянно, это покрывает 99% моих случаев использования при работе.
Джеспер Ренн-Йенсен

31

[Быстрый ответ]

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

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

git checkout -b yourBranchName

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

git push -u origin yourBanchName

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


1
Быстро и точно!
Дев

26

Сначала вы создаете ветку локально:

git checkout -b your_branch

А затем создать ветку удаленно:

git push --set-upstream origin your_branch

Примечание: это работает на последних версиях git:

$ git --version
git version 2.3.0

Ура!


Это просто текст справки, сгенерированный командой, git pushкогда ваша локальная ветвь не отслеживается пультом.
nurettin

18

Создайте ветку на вашем локальном компьютере и переключитесь в эту ветку:

$ git checkout -b [name_of_your_new_branch]

Нажмите на ветку на GitHub:

$ git push origin [name_of_your_new_branch]

Если вы хотите зафиксировать что-то в своей ветке, обязательно будьте в своей ветке.

Вы можете увидеть все ветви, созданные с помощью:

$ git branch

Который покажет:

* approval_messages
  master
  master_clean

Добавьте новый пульт для вашей ветки:

$ git remote add [name_of_your_remote] 

Вставьте изменения из вашего коммита в вашу ветку:

$ git push origin [name_of_your_remote]

Обновите вашу ветку, когда оригинальная ветка из официального репозитория была обновлена:

$ git fetch [name_of_your_remote]

Затем вам нужно подать заявку на слияние изменений, если ваша ветка является производной от разработки, вам нужно сделать:

$ git merge [name_of_your_remote]/develop

Удалить ветку в вашей локальной файловой системе:

$ git branch -d [name_of_your_new_branch]

Чтобы принудительно удалить локальную ветку в вашей файловой системе:

$ git branch -D [name_of_your_new_branch]

Удалить ветку на github:

$ git push origin :[name_of_your_new_branch]

Здесь вся информация

Другой Существующий проект


14

Создание локальной ветки из существующей ветки (может быть master / development / any-other-branch).

git checkout -b имя_файла

Нажмите это на пульт

git push -u имя_удаления local_branch_name: имя_удаленного_ответа

Вот,

  1. -u: устанавливает восходящую ветку
  2. remote_name: git устанавливает имя по умолчанию как «origin», когда создает репозиторий. Однако это можно изменить на другое произвольное имя.
  3. local_branch_name: это имя локальной ветви, которую нужно отправить.
  4. remote_branch_name: это имя удаленной ветви, которую мы хотим создать на удалённом компьютере.

Если мы удалим локальные и удаленные имена веток, он будет иметь формат

git push -u имя_удаления имя_ответа

Это подтолкнет локальную ветку к удаленной и с тем же именем, что и у локальной ветви имя_в ветви. Местный филиал также будет отслеживать удаленный филиал.


10

Я знаю, что на этот вопрос получен хороший ответ, но я просто хотел перечислить шаги, которые я предпринимаю, чтобы создать новую ветку «myNewBranch» и перейти к удаленной («происхождение» в моем случае) и настроить отслеживание. Считайте, что это версия "TL; DR" :)

# create new branch and checkout that branch
git checkout -b myNewBranch
# now push branch to remote 
git push origin myNewBranch
# set up the new branch to track remote branch from origin
git branch --set-upstream-to=origin/myNewBranch myNewBranch

8

Теперь с помощью git вы можете просто напечатать, когда вы находитесь в правильной ветке

git push --set-upstream origin <remote-branch-name>

и Git создать для вас ветку происхождения.


1
-u это сокращение от --set-upstream .. поэтому команда может быть git push -u origin <имя-удаленного-филиала>
Uncaught Exception

Роковое: «origin» не похоже на git-репозиторий
Дмитрий Гринько

может быть, вам нужно установить происхождение вашего git-репозитория
Maurizio Brioschi

8

Просто хотел добавить, что пока:

git checkout -b {branchName}

Создает новую ветку, она также проверяет эту ветку / делает ее вашей текущей веткой. Если по какой-то причине все, что вы хотите сделать, это отключить ветку, но не сделать ее текущей ветвью, то вы должны использовать следующую команду:

git branch {branchName}

В первой команде «checkout» делает указанную ветку вашей текущей веткой, а «-b» означает: эта ветвь еще не существует, поэтому сделайте ее для меня.


6

Как сделать через Source Tree

 1: Open SourceTree, click on Repository -> Checkout
 2 :Click on Create New Branch
 3: Select branch where from you want to get code for new branch 
 4: Give your branch name
 5: Push the branch  (by click on Push button)

5

git push -u <remote-name> <branch-name>не работает, если вновь созданная ветвь не порождена из того же репо, т.е. если вы не создали новую ветвь, используя git checkout -b new_branch, то это не будет работать.

Например, я локально клонировал два разных репозитория, и мне пришлось скопировать repo2 / branch1 в repo1 /, а затем отправить его тоже.

Эта ссылка помогла мне перенести мою локальную ветку (клонировано из другого репо) в мое удаленное репо:


3

Вот как вы делаете это в затмении через Egit.

1) Перейдите в представление «Git Repository Exploring» и разверните проект git, для которого вы хотите создать ветку. Под Brances -> Local .. выберите ветку, для которой вы хотите создать ветку (в моем случае я выбрал master .. вы можете выбрать другую ветку, если хотите) .. затем щелкните правой кнопкой мыши и выберите опцию Create Branch .. и выберите оформить заказ этот вариант проекта, а затем нажмите кнопку Готово.

2) Теперь из проводника проекта выберите проект .. щелкните правой кнопкой мыши, затем Team -> Push Branch.

Будет создана новая удаленная ветка. Вы можете дать название филиала своим коллегам, чтобы они могли его использовать.


Тангенциальное предупреждение об Egit и всех клиентах на основе JGit, AFAIK: они не поддерживают .gitattributes! Это означает, что если ваша команда использует сочетание Windows (CRLF) и Linux / OSX (LF), вы должны зависеть от того, чтобы каждый клиент всегда имел правильные настройки. Естественно, лучше управлять окончаниями строк централизованно на уровне репо или проекта, и .gitattributes является поддерживаемым способом сделать это. Так что, если вам не обязательно использовать Egit ... не надо! :)
еженедельно

2

Я использовал два способа создать ветку

Если вы используете TortoiseGit, выполните следующие действия: -

1.Создать ветку с помощью TortoiseGit

Щелкните правой кнопкой мыши свой проект >>> TortoiseGit >>> Создать ветку >>> введите название ветви и выберите базовую ветку, затем нажмите ОК

2. Нажмите на ветку

Щелкните правой кнопкой мыши на своем проекте >>> TortoiseGit >>> нажмите >>> нажмите ОК

3. Переключиться на новую ветку

Щелкните правой кнопкой мыши на своем проекте >>> TortoiseGit >>> Switch / Checkout >>> выберите вновь созданную ветку и нажмите ОК

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

1.Создать ветку с помощью командной строки

$ git checkout -b new_branch_name

2. Нажмите на ветку

$ git push origin new_branch_name

3. Переключитесь на новую ветку, она уже переключится на new_branch_name, иначе вы можете использовать

$ git checkout new_branch_name


0

Я использую это, и это очень удобно:

git config --global alias.mkdir '!git checkout -b $1; git status; git push -u origin $1; exit;'

Использование: git mkdir NEW_BRANCH

Вам даже не нужен статус мерзавца; может быть, я просто хочу убедиться, что все идет хорошо ...

Вы можете иметь ОБА ЛОКАЛЬНУЮ и УДАЛЕННУЮ ветвь с помощью одной команды.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.