Статьи

Удобное добавление новой ветки Git в удаленный репозиторий — Git Tricks # 3

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

Вступление

В различных моделях рабочих процессов Git очень часто возникает ситуация, когда создается новая ветка и отправляется (публикуется) в удаленный репозиторий. Большинство людей создает много новых отраслей. Просто для инициализации запроса на слияние (слияния), для показа кода удаленным коллегам или просто для резервного копирования локальных изменений за ночь

К сожалению, в Git это не так просто, как могло бы быть:

1
2
3
4
5
6
7
8
~/C/my-fancy-project (master|✓) $ git checkout -b featureX
Switched to a new branch 'featureX'
 
~/C/my-fancy-project (featureX|✓) $ git push
fatal: The current branch featureX has no upstream branch.
To push the current branch and set the remote as upstream, use
 
    git push --set-upstream origin featureX

Хм, просто скопируйте и вставьте данную строку, и вы настроены:

1
2
3
4
5
~/C/my-fancy-project (featureX|✓) $ git push --set-upstream origin featureX
Total 0 (delta 0), reused 0 (delta 0)
To /tmp/my-fancy-project-remote/
 * [new branch]      featureX -> featureX
Branch 'featureX' set up to track remote branch 'featureX' from 'origin'.

Конечно, вы можете запомнить его через некоторое время (однако, как я заметил, что многие люди этого не делают) или даже использовать более короткий синтаксис:

1
2
3
4
5
~/C/my-fancy-project (featureX|✓) $ git push -u origin featureX
Total 0 (delta 0), reused 0 (delta 0)
To /tmp/my-fancy-project-remote/
 * [new branch]      featureX -> featureX
Branch 'featureX' set up to track remote branch 'featureX' from 'origin'.

Тем не менее, для меня было много символов, особенно многократно повторяемых, особенно в типичном рабочем процессе с одним удаленным репозиторием (обычно называемым origin ).

xkcd — стоит ли время? https://xkcd.com/1205/

Решение

Идеальным решением для меня была бы всего одна команда. Что-то вроде git publish .

1
2
3
4
5
6
7
8
~/C/my-fancy-project (master|✓) $ git checkout -b featureY
Switched to a new branch 'featureY'
 
~/C/my-fancy-project (featureY|✓) $ git publish
Total 0 (delta 0), reused 0 (delta 0)
To /tmp/my-fancy-project-remote/
 * [new branch]      featureY -> featureY
Branch 'featureY' set up to track remote branch 'featureY' from 'origin'.

Разве это не было бы хорошо?

Как вы, наверное, знаете из моих предыдущих постов, я большой энтузиаст всеобъемлющей автоматизации (например, CI / CD) или, по крайней мере, полуавтоматики (то есть «упрощения»), когда предыдущая невозможна (или жизнеспособна). Поэтому в то время я начал искать возможные улучшения. Git написан разработчиками для разработчиков и предлагает различные способы настройки. Самый простой — написать псевдоним. В этом случае так же просто, как добавить в ~/.gitconfig :

1
2
3
[alias]
    # Pushes given tag to remote 'origin' repo (or the remote passed as the second parameter)
    publishtag = "!sh -c 'git push ${2:-origin} $1' -"

В результате в дополнение к базовому случаю (установка восходящей ветви на источник (если необходимо) и продвижение веток от текущей ветви к источнику):

1
$ git publish

также возможно сделать публикацию в каком-либо другом удаленном хранилище:

1
$ git publish myOtherRemote

Убираться

В качестве аналога git publish легко реализовать git unpublish :

1
2
3
[alias]
    # Removes given tag from remote 'origin' repo (or the remote passed as the second parameter)
    unpublishtag = "!sh -c 'git push ${2:-origin} :refs/tags/$1' -"

чтобы удалить текущую ветку из удаленного репозитория ( origin или передаваемый как второй параметр):

1
2
3
~/C/my-fancy-project (featureNoLongerNeeded|✓) $ git unpublish
To /tmp/my-fancy-project-remote/
 - [deleted]         featureNoLongerNeeded

вместо:

1
2
3
~/C/my-fancy-project (featureNoLongerNeeded|✓) $ git push origin --delete featureNoLongerNeeded
To /tmp/my-fancy-project-remote/
 - [deleted]         featureNoLongerNeeded

или же

1
2
3
~/C/my-fancy-project (featureNoLongerNeeded|✓) $ git push origin :featureNoLongerNeeded
To /tmp/my-fancy-project-remote/
 - [deleted]         featureNoLongerNeeded

Опять же короче и легче запомнить.

Резюме

Я использую git publishgit unpublish ) уже много лет, и мне это очень нравится. Пользуясь возможностью написания этой серии блогов Git Tricks, я решил поделиться ею с другими (влюбился в командную строку :-)). Помните, однако, что теперь это часть GitKurka (или его восходящий проект без цензуры) — набор полезных и продуктивных настроек и псевдонимов для Git.

Кстати, я больше не занимаюсь обучением Git, но люди, желающие еще больше развить свои навыки в Git, могут рассмотреть курс обучения на месте от Bottega (PL / EN), онлайн-курс Maciej Aniserowicz ( devstyle.pl ) (PL) или всеобъемлющая книга про Git (EN).

Главная фотография, основанная на работе Ивы Балк , опубликованной в Pixabay , Pixabay License.

См. Оригинальную статью здесь: Удобное добавление новой ветки Git в удаленный репозиторий — Git Tricks # 3

Мнения, высказанные участниками Java Code Geeks, являются их собственными.