Convenient pushing new Git branch to remote repository – Git Tricks #3
Publishing a newly created Git branch to a remote repository can be easier than you might expect.
Introduction
It is a very often situation in various Git workflow models to create a new branch and push (publish) it to a remote repository. Majority of people creates a lot of new branches. Just to initialize a pull (merge) request, to show code to remote workmates or just to backup local changes overnight.
Unfortunately, it is not as easy in Git as it could be:
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 |
Hmm, just copy-paste the given line and you are set:
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' . |
Of course you may memorize it after some time (however, I observe that many people do not) or even use the shorter syntax:
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' . |
Nonetheless, for me it was to many characters to type, especially repeated multiple times, especially in a typical workflow with one remote repository (usually named origin
).
Solution
The perfect solution for me would be just one command. Something like 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' . |
Would not it be nice?
As you may know from my previous posts, I am a big enthusiast of comprehensive automation (such as CI/CD) or at least semi-automation (aka “making things easier”) when the previous is not possible (or viable). Therefore, at the time, I started looking at possible improvements. Git is written by developers for developers and offers different ways of customization. The easiest is write an alias. In that case is as simple as adding to ~/.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' -" |
As a result in addition to the basic case (seting an upstream branch to origin (if needed) and pushing branches from the current branch to origin):
1 | $ git publish |
it is also possible to do publish to some other remote repository:
1 | $ git publish myOtherRemote |
Cleaning up
As a counterpart to git publish
, it is easy to implement 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' -" |
to be remove the current branch from a remote repository (origin
or passed as the second parameter):
1 2 3 | ~ /C/my-fancy-project (featureNoLongerNeeded|✓) $ git unpublish To /tmp/my-fancy-project-remote/ - [deleted] featureNoLongerNeeded |
instead of:
1 2 3 | ~ /C/my-fancy-project (featureNoLongerNeeded|✓) $ git push origin --delete featureNoLongerNeeded To /tmp/my-fancy-project-remote/ - [deleted] featureNoLongerNeeded |
or
1 2 3 | ~ /C/my-fancy-project (featureNoLongerNeeded|✓) $ git push origin :featureNoLongerNeeded To /tmp/my-fancy-project-remote/ - [deleted] featureNoLongerNeeded |
Again, shorter and easier to remember.
Summary
I have been using git publish
(and git unpublish
) for many years and I really like it. Taking the opportunity of writing this Git Tricks blog series I decided to share it with others (felt in love in a command line :-) ). Remember, however, it is now a part GitKurka (or its uncensored upstream project) – a set of useful and productive tweaks and aliases for Git.
Btw, I do not conduct Git training anymore, but people wanting to develop their Git skills even more may consider an on-site course from Bottega (PL/EN), an online course by Maciej Aniserowicz (devstyle.pl) (PL) or a comprehensive Pro Git book (EN).
The lead photo based on the Iva Balk‘s work published in Pixabay, Pixabay License.
Published on Java Code Geeks with permission by Marcin Zajaczkowski, partner at our JCG program. See the original article here: Convenient pushing new Git branch to remote repository – Git Tricks #3 Opinions expressed by Java Code Geeks contributors are their own. |