Introduction: This article
focuses on some of the advanced techniques used with git pull requests that are
required for reviewing code changes made to the source code for a team. The
purpose of the pull request is that it allows reviewers to see the differences
between the current and the proposed code on a file by file and line by line
basis. They are so named because it is opened between two branches that are
different where one branch is pulled from another usually the master branch and
when the request is completed, it is merged back into the master. When a
feature is written, it is checked into the feature branch as the source and
merged into the master branch as target. Throughout this discussion, we will
refer to the master and the feature branch.
Technique #1: Merge options
Code is checked into the branch in the form of
commits. Each commit represents a point of time. A sequence of commits is a
linear history for that branch. Code changes overlay one on top of the other.
When there is a conflict between current and proposed code snippets, they are
referred to as HEAD or TAIL because only one of them is accepted. ‘Rebase’ and
‘Merge’ are two techniques by which changes made in master can be pulled into
the feature branch. The new changes from master appear as TAIL or HEAD
respectively in the feature branch. Rebase preserves history of commits while
merge creates a new commit.
There are four ways to merge the code changes
from the feature to the master branch. These include:
Merge (no fast forward) – which is a non-linear
history preserving all commits from both branches.
Squash commit - which is a linear history with
only a single commit on the target.
Rebase and fast forward – which is a rebase
source commits onto target and fast-forward
Semi-linear merge – which rebases source commits
onto target and create a two-parent merge.
Prefer the squash commit as the merge to master
because the entire feature can be rolled back if the need arises.
Technique #2 Interactive rebase
This allows us to manipulate multiple commits so
that the history is modified to reflect only certain commits. When commits are rebased, we can pick and
squash those that we want to keep or fold respectively so that the timeline
shows only the history required. A clean
history is readable which reflects the order of the commits and for narrowing
down the root cause for bugs, creating a change log and to automatically
extract release notes.
Technique #3: No history
Creating a pull request without history by
creating another branch enables easier review. If a feature branch has a lot of
commits that is hard to rebase, then there is an option to create a PR without
history. This is done in two stages:
First, the target branch for the feature_branch
merge is selected as a new branch say feature_branch_no_history and merge all
the code changes with the “squash commit” option.
Second, a new PR is created that targets the
merging of the feature_branch_no_history into the master.
The steps to completely clear history would be:
-- Remove
the history from
rm -rf .git
-- recreate
the repos from the current content only
git init
git add .
git commit
-m "Initial commit"
-- push to
the github remote repos ensuring you overwrite history
git remote
add origin git@github.com:<YOUR
ACCOUNT>/<YOUR REPOS>.git
git push -u
--force origin master
A safer
approach might be:
git init
git add .
git commit
-m 'Initial commit'
git remote
add origin [repo_address]
git push --mirror
--force
Conclusion: Exercising caution
with git pull request and history helps with a cleaner, readable and actionable
code review and merge practice.
No comments:
Post a Comment