Как я могу легко перенести локальную ветку Git на пульт с другим именем?


175

Мне было интересно, есть ли простой способ подтолкнуть и вытащить локальную ветку с удаленной веткой с другим именем, не всегда указав оба имени.

Например:

$ git clone myrepo.git
$ git checkout -b newb
$ ...
$ git commit -m "Some change"
$ git push origin newb:remote_branch_name

Теперь, если кто-то обновит имя_удаленного_ответа, я могу:

$ git pull

И все слитно / быстро продвигается. Однако, если я внесу изменения в мой локальный «новичок», я не смогу:

$ git push

Вместо этого я должен:

% git push origin newb:remote_branch_name

Кажется немного глупым. Если git-pullиспользуется, git-config branch.newb.mergeчтобы определить, откуда вытащить, почему не может git-pushиметь подобную опцию конфигурации? Есть хороший способ для этого или я должен просто продолжить долгий путь?

Ответы:


93

Конечно. Просто установите push.defaultдля, upstreamчтобы подтолкнуть ветви к их восходящим потокам (что аналогично тому, что pullбудет извлекать, определяется как branch.newb.merge), вместо того, чтобы подталкивать ветви к ветвям, совпадающим по имени (что является настройкой по умолчанию для push.default, matching).

git config push.default upstream

Обратите внимание, что раньше это вызывалось trackingне upstreamдо Git 1.7.4.2, поэтому, если вы используете более старую версию Git, используйте trackingвместо этого. push.defaultОпция была добавлена в Git 1.6.4, так что если вы находитесь на старой версии , чем это, вы не будете иметь эту опцию на всех и необходимо явно указать ветку , чтобы подтолкнуть к.


Вот и все! Это относится ко всем ответвлениям, но это нормально. Спасибо!
Jmacdonagh

Мне было бы интересно узнать, есть ли сокращение для названия ветви, которое я проверил. Я мог бы просто хотеть, git push buildserver .:test_thisгде .должно быть местное название филиала, которое я не обязательно знаю. Конечно, я мог бы это найти, но если бы для этого была короткая рука, например точка, это было бы круто.
Фредерик Норд,

2
@FrederickNord HEAD- это сокращение, которое вы ищете. HEADэто то, что указывает на текущую извлеченную ветку или непосредственно на конкретную фиксацию, если у вас есть отдельная голова
Брайан Кэмпбелл

Спасибо! Это исправило Updates were rejected because a pushed branch tip is behind its remoteошибку для меня. Мой локальный репо был в курсе, но имена были просто разные.
canhazbits

171

Когда вы делаете начальный push, добавьте параметр -u :

git push -u origin my_branch:remote_branch

Последующие толчки пойдут туда, куда вы хотите.

РЕДАКТИРОВАТЬ:

Согласно комментарию, это только устанавливает тягу.

git branch --set-upstream

должен сделать это.


7
-uпросто устанавливает апстрим, который в соответствии с вопросом уже установлен. Он должен установить push.defaultдля upstremтого, чтобы pushсоблюдать настройки восходящего потока, так как по умолчанию только pullделает.
Брайан Кэмпбелл

2
Кажется, что это не работает - по крайней мере, на никогда не версии git
Томас Уотсон

git branch --set-upstream только после этого необходимо установить настройку pushRemote.
получено с

Я не думаю, что git branch --set-upstreamэто необходимо. Примечание: мой git --version2.17.1.
Габриэль Стейплз

15

Команда Адама теперь устарела. Ты можешь использовать:

git branch --set-upstream-to origin/my_remote_branch my_local_branch

установить восходящую ветвь my_local_branchк origin/my_remote_branch.


6
Можете ли вы предоставить ссылку, подтверждающую информацию о том, что вы устали? Документы для последней версии относительно push на git-scm.com, кажется, предполагают, что это актуально. Заранее спасибо - это может быть очень полезно для читателей, чтобы следить за дополнительной информацией.
Кей V

Согласитесь с @KayV, особенно с тем, что я получил это сообщение при попытке создать новую удаленную ветку с именем, отличным от моего локального филиала: «Если вы планируете выдвинуть новую локальную ветвь, которая будет отслеживать его удаленную копию, вы можете захотеть использовать "git push -u", чтобы установить исходный конфиг при нажатии. '
FBB

0

Вот процесс, который работал для меня.

git clone original-repo-url
git remote rename origin upstream
git remote add origin new-repo-url

Теперь ваш новый репо будет «origin», а оригинальный репо «upstream». Подтвердите это, запустив git remote -v. (Примечание: восходящий поток используется для извлечения из исходного репо - для того, чтобы синхронизировать локальную копию с проектом, в который вы хотите внести вклад, а источник используется для извлечения и продвижения, поскольку вы можете внести свой вклад в свое собственное репо).

git push origin master

Теперь мастер вашего нового удаленного репо (на Github) будет синхронизирован с оригинальным мастером, но у него не будет ни одной ветви функций.

git rebase upstream/branch-name
git push origin master

Rebase - это умное слияние. Затем снова нажмите на мастер, и вы увидите выбранную ветку объектов как мастер в новом репо.

По желанию:

git remote rm upstream
git remote add upstream new-repo-url

0

Я уже давно сталкиваюсь с той же проблемой. Наконец-то у меня есть ряд утверждений, поэтому мне не нужно делать это git push origin local:remoteкаждый раз. Я следовал за этим:

git branch --set-upstream-to origin/remote_branch_name
git config push.default upstream
git push

После установки восходящего потока на удаленную ветвь с другим именем (1-я строка), а затем сделав этот восходящий канал по умолчанию (2-я строка), 3-я строка теперь будет подчиняться этим правилам и перейдет к установленному восходящему каналу.

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