Table of Contents
If you are following a branching strategy in which you first start working on a release by creating a release branch from develop and then deploying your release branch in pre production environment post approval. Once all the testing is completed and it is ready to be promoted in production then you need to first merge your release branch with master and then later with develop. So the next time, when you are working on a hotfix or on a release or feature then you can start working by just creating a branch from develop.
While the above steps looks quite simple but sometimes implementing this can be quite challenging in a real environment where you might encounter few issues. So it is utmost important to run all the steps accurately to avoid any unforeseen error.
Lab Setup
In my Lab setup, I have three branches in Bitbucket - release-1.0.1
, develop
and master
. Usually develop
and master
branch contains the same files. In other words, develop
is the exact replica of master
. But since master is critical for production so all the release branches starts from develop. Here release-1.0.1
branch is created from develop
. Along with that it also contains all the changes that we need to add in the next release. So once my release branch is ready to merge because the deployment can only happen from master as per our branching strategy so we need to first merge release-1.0.1
branch with master
and then with develop
. So that both master
and develop
contain the same files.
How to Merge Git Release Branch with both Master and Develop
Also Read: Solved: "error: src refspec master does not match any" when using git push
Step 1: Prerequisites
a) You should have a running System(in my case it is Ubuntu 20.04 LTS
) with git
package installed.
b) You should have access to clone the Repo.
c) You should have commit access to master
and develop
branch.
Step 2: Clone the Repo
Here we will first clone the example-app
repo from Bitbucket project using below git clone
command. This will create a local directory called example-app
containing all the cloned repo files.
cyberithub@ubuntu:~$ git clone https://app.cyberithub.com/bitbucket/scm/application/example-app.git
Cloning into 'example-app' ...
remote: Enumerating objects: 499, done.
remote: Counting objects: 100% (499/499), done.
remote: Compressing objects: 100% (332/332), done.
remote: Total 981 (delta 324), reused 454 (delta 332), pack-reused 876
Receiving objects: 100% (981/981), 1.01 MiB | 156.000 KiB/s, done.
Resolving deltas: 100% (820/820), done.
Updating files: 100% (267/267), done.
Step 3: Create Local Master branch
As our branching strategy allows to make a copy of develop
branch only so by default our current residing branch will be develop
. If you go to the cloned directory and check the current branch then it should show like below.
cyberithub@ubuntu:~$ cd example-app cyberithub@ubuntu:~/example-app$ git branch * develop
Then to switch to a new branch master
, you need to use git checkout -b master
command as shown below.
cyberithub@ubuntu:~/example-app$ git checkout -b master
Switched to a new branch 'master'
Step 4: Check for any Latest Changes
Before pulling and merging the files from release branch, check for any latest changes in master
using git pull origin master
command as shown below.
cyberithub@ubuntu:~/example-app$ git pull origin master warning: Pulling without specifying how to reconcile divergent branches is discouraged. You can squelch this message by running one of the following commands sometime before your next pull: git config pull.rebase false # merge (the default strategy) git config pull.rebase true # rebase git config pull.ff only # fast-forward only You can replace "git config" with "git config --global" to set a default preference for all repositories. You can also pass --rebase, --no-rebase, or --ff-only on the command line to override the configured default per invocation. From https://app.cyberithub.com/bitbucket/scm/application/example-app.git * branch master -> FETCH_HEAD Already up to date.
Step 5: Pull the Feature Branch Files
Now to pull and merge all the changes from release-1.0.1
branch, we need to use git pull origin release-1.0.1
command as shown below. It should create a new commit in your local system.
cyberithub@ubuntu:~/example-app$ git pull origin release-1.0.1 warning: Pulling without specifying how to reconcile divergent branches is discouraged. You can squelch this message by running one of the following commands sometime before your next pull: git config pull.rebase false # merge (the default strategy) git config pull.rebase true # rebase git config pull.ff only # fast-forward only You can replace "git config" with "git config --global" to set a default preference for all repositories. You can also pass --rebase, --no-rebase, or --ff-only on the command line to override the configured default per invocation. From https://app.cyberithub.com/bitbucket/scm/application/example-app.git * branch release-1.0.1 -> FETCH_HEAD Merge made by the 'recursive' strategy. config/test.yaml | 2 +- config/hello.yaml | 2 +- 2 Files changed, 4 insertions(+), 4 deletions(-)
Step 6: Tag the Commit(Optional)
We can also tag the commit in case it is required by using git tag 1.0.1 HEAD
command as shown below. The syntax for tagging the local commit is git tag <release> HEAD
.
cyberithub@ubuntu:~/example-app$ git tag 1.0.1 HEAD
After tagging the last commit, you can verify it by using git tag -l
command as shown below.
cyberithub@ubuntu:~/example-app$ git tag -l 1.0.1 1.0 0.9 0.8 0.7
Step 7: Check the Commit
You can check all the local commits done using git log
command as shown below.
cyberithub@ubuntu:~/example-app$ git log commit a287db7ea8768baf9fc79369ba318376 (HEAD -> master, tag: 1.0.1) Merge: b00dccf ea0d6b4 Author: Admin <admin@cyberithub.com> Date: Wed Aug 24 16:10:00 2022 +0530 Merge branch 'release-1.0.1' of https://app.cyberithub.com/bitbucket/scm/application/example-app.git commit c842ac8e7df8bf9549af9c617b21849 (origin/develop, origin/HEAD, develop) Merge: b00dccf ea0d6b4 Author: Admin <admin@cyberithub.com> Date: Wed Aug 23 10:04:00 2022 +0530 .......................................
Step 8: Push the Changes to Remote Master Branch
To push all the changes to the remote master branch, we need to use git push -u origin master
command as shown below.
cyberithub@ubuntu:~/example-app$ git push -u origin master
Enumerating objects: 16, done.
Counting objects: 100% (16/16), done.
Compressing objects: 100% (1/1), done.
Writing objects: 100% (2/2), 565 bytes | 565.00 KiB/s, done.
Total 2 (delta 1), reused 0(delta 0), pack-reused 0
remote: Checking connectivity: 2, done.
remote:
remote: Create pull request for master:
remote: https://app.cyberithub.com/bitbucket/scm/projects/EXAMPLE/repos/example-app/pull-requests?create&sourceBranch=refs/heads/master
remote:
To https://app.cyberithub.com/bitbucket/scm/application/example-app.git
768ca03..9acb8ca master -> master
Branch 'master' set up to track remote branch 'master' from 'origin'.
Step 9: Checkout to Develop Branch
Now to merge the master branch with develop, we need to first switch to develop branch using git checkout develop
command as shown below.
cyberithub@ubuntu:~/example-app$ git checkout develop
Switched to branch 'develop'
Your branch is up to date with 'origin/develop'.
After switching you can verify the current branch by using git branch
command as shown below.
cyberithub@ubuntu:~/example-app$ git branch * develop master
Step 10: Merge master with develop
Now you can merge the master with develop by using git merge master
command as shown below.
cyberithub@ubuntu:~/example-app$ git merge master
Updating b00cbbf..b60607c
Fast-forward
config/test.yaml | 2 +-
config/hello.yaml | 2 +-
2 Files changed, 4 insertions(+), 4 deletions(-)
Step 11: Push the Changes to Remote Develop Branch
Next step is to push the updated changes from local develop to the remote develop branch using git push -u origin develop command as shown below.
cyberithub@ubuntu:~/example-app$ git push -u origin develop
Total 0 (delta 0), reused 0 (delta 0), pack-reused 0
To https://app.cyberithub.com/bitbucket/scm/application/example-app.git
768ca03..9acb8ca develop -> develop
Branch 'develop' set up to track remote branch 'develop' from 'origin'.