Unlocking the Power of Advanced Git Commands 🚀

ganesh mondalganesh mondal
8 min read

Git is an essential tool for version control, and while most developers are familiar with basic commands like add, commit, and push, there’s a lot more under the umbrella. In this blog, we’ll explore some advanced Git commands and strategies that can help you work smarter, manage complex projects more easily and solve problems more effectively. We'll also include real-world examples to make everything clear. Let's dive in! 🎉

Table of Contents

  1. Simplifying History with git rebase

  2. Easing Conflict Resolution with git rerere

  3. Picking Specific Commits with git cherry-pick

  4. Saving Unfinished Work with git stash

  5. Finding Bugs Faster with git bisect

  6. Managing Dependencies with git submodule

  7. Recovering Lost Work with git reflog

  8. Creating Shortcuts with Git Aliases

  9. Understanding Project History with git log


1. Simplifying History with git rebase 🔄

Rebasing is a powerful way to clean up your commit history, making it look neater and more straightforward. Interactive rebasing allows you to edit, combine, reorder, or even delete commits before sharing them with others.

Example: Cleaning Up Your Work Before Sharing

Imagine you’re working on a new feature. Along the way, you’ve made several commits:

  • Commit 1: Started the feature.

  • Commit 2: Fixed a typo.

  • Commit 3: Added tests.

  • Commit 4: Optimized the code.

Before merging your work into the main branch, you might want to combine the typo fix with the first commit and group the tests with the optimizations. This makes your work easier for others to review.

How to Do It

Start Interactive Rebase

git rebase -i HEAD~4

This command lets you decide what to do with your last 4 commits.

Tips

  • Undo a Rebase: If something goes wrong, you can stop and undo the rebase with:

      git rebase --abort
    

Why It’s Useful

  • Cleaner History: It’s easier for others to understand your work when the commit history is organized.

Be Careful

  • Don't Rebase Shared Commits: If you’ve already shared your commits with others, avoid rebasing to prevent confusion and conflicts.

2. Easing Conflict Resolution with git rerere 🤝

Resolving the same conflicts over and over again can be frustrating. git rerere (reuse recorded resolution) helps by remembering how you resolved conflicts. Next time the same conflict happens, Git can automatically apply your previous solution.

Example: Repeated Conflicts in a Long-Lived Branch

Let’s say you’re working on a feature branch that regularly pulls updates from the develop branch. Every time you pull, you face the same conflict in a particular file. git rerere can save you time by remembering how you resolved that conflict.

How to Enable It

git config --global rerere.enabled true

How It Works

  1. First Conflict: Resolve the conflict manually. Git remembers what you did.

  2. Next Time: If the same conflict occurs, Git will automatically apply the remembered solution.

Why It’s Useful

  • Time-Saver: Avoid resolving the same conflicts repeatedly.

3. Picking Specific Commits with git cherry-pick 🍒

git cherry-pick allows you to apply changes from a specific commit to your current branch. This is useful when you want to bring in a particular change without merging all the other changes from that branch.

Example: Hotfix in Multiple Branches

Suppose you find a bug in the release branch. The fix is already made in the develop branch, but you don’t want to merge everything from develop into release. You can cherry-pick just the commit that fixed the bug.

How to Cherry-Pick

git cherry-pick <commit_hash>

Example:

git cherry-pick a1b2c3d4

This command takes the changes from commit a1b2c3d4 in develop and applies them to release.

Why It’s Useful

  • Control: You can choose exactly what changes you want to bring in.

4. Saving Unfinished Work with git stash 🗄️

Sometimes you need to switch tasks quickly without losing your current work. git stash allows you to temporarily save your changes, so you can come back to them later.

Example: Interruptions for Bug Fixes

Imagine you’re halfway through building a feature, and a critical bug is reported. You need to fix it immediately, but you don’t want to lose your current work.

How to Stash and Apply Changes

Save Your Work

git stash

This command stashes your changes so you can switch branches to fix the bug.

Get Your Work Back

git stash apply

After fixing the bug, you can come back to your feature branch and continue where you left off.

Why It’s Useful

  • Flexibility: Easily switch tasks without losing your place.

5. Finding Bugs Faster with git bisect 🔍

git bisect helps you find the exact commit that introduced a bug by checking out different commits between a known good and bad state. It’s like playing "hot or cold" to find the problem.

Example: Pinpointing a Regression

Let’s say a feature that worked before is now broken, but you’re not sure when it happened. You know it worked in version v1.0, but it’s broken in the latest version. git bisect can help you find out which commit caused the problem.

How to Use git bisect

  1. Start Bisect:

     git bisect start
    
  2. Mark the Bad Commit:

     git bisect bad
    
  3. Mark the Good Commit:

     git bisect good v1.0
    

Git will check out different commits for you to test until it narrows down the exact one that introduced the bug.

Why It’s Useful

  • Efficiency: Quickly find the commit that caused a bug, even in large projects.

6. Managing Dependencies with git submodule 📦

git submodule lets you include other Git repositories inside your own. This is helpful when you’re working with shared libraries or components.

Example: Including a Shared Library

Your team uses a shared library across multiple projects. Instead of copying the library code into each project, you can add it as a submodule.

How to Add and Update a Submodule

Add a Submodule

git submodule add https://github.com/example/lib.git libs/lib

Update Submodules

When the library is updated, you can pull the latest changes:

git submodule update --remote

Why It’s Useful

  • Modularity: Keeps your projects organized by reusing code across them.

7. Recovering Lost Work with git reflog 🕵️‍♀️

git reflog keeps track of every change you’ve made, even the ones that don’t show up in the regular commit history. It’s a lifesaver if you accidentally lose some work.

Example: Undoing an Accidental Reset

Let’s say you accidentally reset your branch to an older commit and lost some work. With git reflog, you can recover those lost commits.

How to Use git reflog

See the History of Changes

git reflog

Recover a Lost Commit

Find the commit hash of your lost work and reset your branch to it:

git reset --hard <commit_hash>

Why It’s Useful

  • Safety Net: Easily recover from mistakes that would otherwise lose your work.

8. Creating Shortcuts with Git Aliases 🛠️

Git aliases allow you to create shortcuts for frequently used commands, making your workflow faster and more efficient.

Example: Simplifying Long Commands

If you often type out long Git commands, you can save time by creating an alias.

How to Create an Alias

Create a Simple Alias

git config --global alias.st status

Now, instead of typing git status, you can just type git st.

Create a Complex Alias

You can also create aliases for more complex commands:

git config --global alias.lg "log --oneline --graph --decorate --all"

Now, git lg will show a

simplified, visual log of your repository’s history.

Why It’s Useful

  • Efficiency: Reduce the amount of typing and speed up your workflow.

9. Understanding Project History with git log 📜

git log is a versatile tool that lets you explore the history of your project. You can filter, format, and customize the output to get the information you need.

Example: Reviewing Team Contributions

You want to see what one of your team members has contributed in the last month.

How to Customize the Log

Filter by Author and Date

git log --author="Jane Doe" --since="1 month ago" --stat

This command shows all commits made by "Jane Doe" in the last month, along with a summary of the files she changed.

Visualize the Commit History

git log --oneline --graph --decorate --all

This command provides a clear, visual overview of the project’s history.

Why It’s Useful

  • Insightful: Get a deeper understanding of your project’s history and contributions.

Wrapping Up 🎯

Mastering advanced Git commands can make you a more efficient and confident developer. Whether you're streamlining your commit history with git rebase, managing dependencies with git submodule, or recovering lost work with git reflog, these tools give you greater control over your projects.

Git is more than just a tool for version control; it’s a powerful ally in managing your code’s history. Don’t be afraid to experiment with these commands—they’ll help you work smarter, not harder! 💪

Happy coding! 😄


What Coming Next

In the upcoming blogs,

  • Required Cloud skills for your DevOps Journey.

  • Introduction to Docker and importance.

  • Basic Docker Setup in cloud VM.

  • We will start an open-source mini project for all students to contribute.

  • and much more in DevOps to explore...


Hope you find this blog informative and helpful. If you have any questions or need further assistance with Git, feel free to drop a comment below! and email me at ganeshcmondal@gmail.com Happy coding! 💻😊

"Looking to create an amazing community having knowledge in different tools and technologies, where we will be contributing our skills to make something impactful."


0
Subscribe to my newsletter

Read articles from ganesh mondal directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

ganesh mondal
ganesh mondal