Git Mastery: Visualizing, Merging, Resetting, and Synchronizing Your Codebase

@Harsh
7 min readAug 2, 2024

--

Git is a powerful tool for version control and source code management, and mastering its features can significantly enhance your productivity as a developer. In this blog, we will delve into some advanced Git concepts, including visualizing Git using GitViz, understanding the detached HEAD state, exploring different merge strategies such as recursive and ort strategy merges, squash merging, git reset, and the differences between fetch, pull, and clone. We’ll also cover some practical commands to make the most of these features.

Visualizing Git with GitViz

Understanding the state of your Git repository and how branches interact can be challenging, especially for beginners. GitViz is a handy tool that allows you to visualize the structure of your Git repository. With GitViz, you can see your commits, branches, and merges in a graphical format, making it easier to understand the relationships and flow of your code.

How to Use GitViz

  1. Installation: First, you need to install GitViz.
  • Download the .zip file and extract the files.

2. Generating Visualizations: Initiate a Local Git Repository :

git init <repo-name>
  • Copy the Repo Path and paste it in the GitViz to track the repo.

GitViz provides an intuitive way to track your commits and branch history, helping you avoid common pitfalls and better manage your codebase.

3. Visualize Your Git Activity :

Understanding Detached HEAD

In Git, the HEAD is a reference to the current commit. Normally, the HEAD points to the latest commit on your current branch. However, sometimes you might find yourself in a detached HEAD state, which means the HEAD is pointing directly to a commit rather than a branch.

When Does Detached HEAD Occur?

A detached HEAD occurs in scenarios such as:

  • Checking out a specific commit: git checkout <commit-hash>
  • Checking out a tag: git checkout tags/<tag-name>

Why is Detached HEAD Important?

Working in a detached HEAD state can be useful for making temporary changes or exploring the repository’s history without affecting any branches. However, any commits made in this state can be lost if you switch branches without creating a new branch to save them.

Practical Example:

  1. Check out a specific commit:
git checkout <commit-hash>
  • Creating a new branch from a detached HEAD. This ensures your changes are saved and can be referenced later.

Merge Strategies: Recursive

Merging is a fundamental part of Git, allowing you to integrate changes from different branches. Git provides several merge strategies, with recursive and ort being two of the most commonly used.

Recursive Merge Strategy

The recursive merge strategy is the default in Git. It attempts to automatically resolve conflicts by combining changes from both branches. If conflicts occur, Git pauses the merge and allows you to manually resolve them.

A recursive merge is where you make commits on a branch, but further commits happen on main too. When it’s time to merge, Git will recurse over the branch in order to make its definitive commit. This means a merge commit will have two parents once you complete it.

ORT Strategy

This is meant as a drop-in replacement for the recursive algorithm (as reflected in its acronym — "Ostensibly Recursive’s Twin"), and will likely replace it in the future. It fixes corner cases that the recursive strategy handles suboptimally, and is significantly faster in large repositories — especially when many renames are involved.

Practical Example

Recurse Merge :

git merge branch-name

This uses the default recursive strategy.

  • Add a comment. This is because this merging will create one additional commit with these two commits as parent.
  • After merging we can delete the feature branch bugfix
git branch -d <branch-name>

Squash Merging

Squash merging is a technique in Git that combines all the changes from a feature branch into a single commit before merging it into the target branch. This results in a cleaner, more readable commit history.

Benefits of Squash Merging

  • Simplifies Commit History: Reduces clutter by combining multiple commits into one.
  • Easier to Revert Changes: A single commit makes it easier to roll back changes if needed.
  • Improves Code Review: Makes it easier for reviewers to understand the changes in a single context.

How to Perform a Squash Merge

  1. Squash During Merge:
git merge --squash <branch-name>
git commit -m "<message>"
  • Our merge is successful and can be verified with this command.
git show HEAD
  • After successfully merging feature branch into master branch, we will delete the feature branch.
 git branch -D <branch-name>
  • Now those two node become orphaned means unreachable. Orphaned commits are all commits in your local history that are not directly or indirectly accessible from a named reference such as a branch, tag, or HEAD. So we will use garbage collector to remove them.
 git reflog expire --expire-unreachable=now --all
git gc --prune=now

Git Reset: Mixed, Soft, Hard

The git reset command is used to undo the changes in your working directory and get back to a specific commit while discarding all the commits made after that one. There are three types of reset operations: mixed, soft, and hard.

Soft Reset

A soft reset moves the branch pointer to the specified commit but does not reset the staging area or working directory. This is useful for undoing a commit while keeping the changes in the staging area for further editing or recombination.

Practical Example

Soft Reset:

git reset --soft <commit-hash>

Mixed Reset

A mixed reset moves the branch pointer to the specified commit and resets the staging area (index) to match, but it does not modify the working directory.

Practical Example

  1. Mixed Reset:
git reset --mixed <commit-hash>

Hard Reset

A hard reset moves the branch pointer to the specified commit and resets both the staging area and the working directory to match. This operation discards all changes after the specified commit. Therefore one must be careful while using this type of reset as the data will be lost forever.

Practical Example

  1. Hard Reset:
git reset --hard <commit-hash>
  • Our data will be lost forever.

*Delete all the unreachable nodes.

git reflog expire --expire-unreachable=now --all
git gc --prune=now

Fetch, Pull, and Clone

Understanding how to synchronize your local repository with remote repositories is crucial in collaborative development. Git provides three primary commands for this purpose: fetch, pull, and clone.

Check the blog on “How to integrate local git repo with remote github repository”

Git Fetch

The git fetch command downloads commits, files, and references from a remote repository into your local repository but does not integrate them into your working directory. This allows you to review changes before merging them into your branch.

Practical Example

  1. Pull Changes:
git fetch origin

Git Pull

The git pull command combines the actions of git fetch and git merge. It fetches the changes from the remote repository and automatically merges them into your current branch.

Practical Example

  1. Pull Changes:
git pull origin master

Git Clone

The git clone command is used to create a copy of an existing repository. This is typically done once, at the start of working with a new repository.

Practical Example

  1. Clone a Repository:
git clone https://github.com/user/repository.git

Differences Between Fetch, Pull, and Clone

  • Fetch: Downloads updates from the remote repository but does not merge them.
  • Pull: Downloads updates and merges them into your current branch.
  • Clone: Creates a complete copy of the repository, including all branches, history, and files.

Conclusion

Mastering Git’s advanced features, such as visualizing your repository with GitViz, understanding detached HEAD, utilizing different merge strategies, squash merging, effectively using git reset, and understanding the fetch, pull, and clone commands, can significantly improve your workflow and code management. By incorporating these practices into your daily routine, you’ll be better equipped to handle complex version control scenarios and maintain a clean, efficient codebase.

--

--