- Published on
git gems to find commit
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:
- https://git-scm.com/docs/everyday
- https://git-scm.com/book/en/v2/Git-Branching-Basic-Branching-and-Merging
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
git cherry
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
git bisect
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.
git reflog
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.
git reflog
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.