Git became the default version control for both professional and personal projects across the world. There are numerous articles to get started on git and understand different branch strategies. Some of them are:
As more people work on same project, there will be frequent number of changes and merges happening to the repository. In such a fast-changing distributed environment, there will be times where developers have to hunt for individual commits either to find the bug or copy changes from one branch to another. Combination of
git log and grep can do the job. But there are some hidden jewels in git to help developer life to find the commits much faster with less time and effort.
Here are some I have used to speed up commit hunt:
- git cherry
- git bisect
- git reflog
There are scenarios where you want to find differences between branches in commits without merged commits. git cherry comes in handy to do the same. Let's look at the example:
For commits which are present in develop branch but not in master branch.
git cherry develop master
You might have guessed that this name is close to another popular command cherry-pick.
We can pick commits using cherry and apply them using cherry-pick.
For picking all commits between 2 commits as a range,
git cherry-pick abcd..efgh #abcd and eggh are commit hashes
Root-cause analysis for resolving bugs plays an important role for any project sustainability. Finding commit in git history that caused the bug can be tedious process. When its related to production failures, time is luxury and reverting commit has to happen quickly. During those times, git bisect can be life saver.
For example, consider you know current state of branch is bad and there was earlier version where you know it was in good state.
git bisect bad git bisect good v20200901 git bisect log # lists all commits between good and bad commits git bisect next # move through history one commit at a time git bisect good # marking a commit as good or bad git bisect reset # anytime to stop bisecting
As you go through history, you can run the app to find the bug. Once you zero in on commit, its matter time to fix or revert.
There are scenarios when remote repository loses your changes or local branches get deleted by mistake. It can be stressful to recover or redo all the changes. git reflog can be savior command.
It works similar to git log but focus is on local machine changes to git repository.You can pick any commits and cherry-pick to get back those lost changes.
To conclude, these commands were useful in different situations occasionally. But with these in your repertoire, you can save lot of time and effort in the times where you needed them the most.