Sling Academy
Home/DevOps/What is HEAD in Git? Explained with Examples

What is HEAD in Git? Explained with Examples

Last updated: January 28, 2024

Version control systems are the bedrock of software development, and Git reigns as one of the most popular tools in this realm. Understanding how Git tracks changes and maneuvers through the version history is crucial for developers. Amongst the many concepts in Git, HEAD is a cornerstone that often puzzles newcomers. This article demystifies Git’s HEAD by providing practical insights and examples.

The Fundamentals of HEAD in Git

HEAD in Git refers to a reference pointing to the latest commit in the current branch. It acts as a pointer to the ‘current’ state of your project, allowing you to see what’s latest. Think of HEAD as a bookmark that tells you where you are in your book of code.

Understanding How HEAD Operates

Typically, HEAD points to a branch reference, which in turn points to a commit. In a detached state, HEAD can point directly to a commit rather than a branch, facilitating operations like checking out a previous state of your project without having to create a new branch. However, this is a temporary and potentially risky state because new commits will not belong to any branch and can easily be lost.

git checkout COMMIT_HASH 
# This will detach your HEAD

One of the powerful features of HEAD is navigating to previous commits. By using notation like HEAD~1, you can go back one commit from the current position. This sequential step-back can be continued using HEAD~2, HEAD~3, and so on to sequentially move backward through the commit history.

git checkout HEAD~1 
# Moves to the commit before the current HEAD

You can also reference commits relative to branches using a similar syntax. For example, you can use master~3 to point to the third commit before the master branch’s current commit.

git checkout master~3 
# Checkout to a commit 3 places before master's HEAD

Moving HEAD around

When you check out a branch or a commit, Git will automatically move HEAD to that new reference. If you’re working in a feature branch and switch back to master, HEAD moves to follow you:

git checkout master 
# Moves HEAD to point at the tip of master

This navigation is vital when needing to test different branches, apply hotfixes, or simply review the state of your project at various points in history.

Using HEAD to Manipulate the History

HEAD isn’t just for navigation; you can also use it to manipulate the commit history. Resetting the HEAD allows you to rollback changes to a desired state.

git reset HEAD~1 
# Undo the last commit, keeping changes staged

The reset command has various modes, such as –soft, –mixed, and –hard, giving you control over the extent of the reset.

git reset --hard HEAD~2 
# Erases the last two commits completely

Warning: A --hard reset will permanently remove those commits and the changes they contain, which can lead to data loss if not used with caution.

Resolving Detached HEAD

Occasionally, you may find yourself in a ‘detached HEAD’ state. This typically occurs when you’ve checked out a commit that is not the tip of any branch. While in this state, you can look around, make temporary changes, or even create new commits. To exit the detached state and mitigate the risk of losing your changes, you’ll want to create a new branch.

git checkout -b new-branch-name

This command creates a new branch starting from the current detached HEAD, ensuring that your new commits are safe.

Conclusion

Understanding the HEAD pointer in Git can significantly enhance your version control experience. It gives you flexibility in navigating, fixing, and manipulating your code history. Use the examples and explanations provided to start incorporating HEAD maneuvers into your Git skillset, but always remember to use commands affecting the history with care to avoid unwanted data loss.

Whether you are switching contexts between branches, exploring historical commits, or undoing changes, remembering how HEAD functions will help you do so with confidence and precision.

Next Article: Git: How to Delete and Rename Branches

Previous Article: How to View, Create, and Switch Git Branches: A Complete Guide

Series: Git & GitHub Tutorials

DevOps

You May Also Like

  • How to reset Ubuntu to factory settings (4 approaches)
  • Making GET requests with cURL: A practical guide (with examples)
  • Git: What is .DS_Store and should you ignore it?
  • NGINX underscores_in_headers: Explained with examples
  • How to use Jenkins CI with private GitHub repositories
  • Terraform: Understanding State and State Files (with Examples)
  • SHA1, SHA256, and SHA512 in Terraform: A Practical Guide
  • CSRF Protection in Jenkins: An In-depth Guide (with examples)
  • Terraform: How to Merge 2 Maps
  • Terraform: How to extract filename/extension from a path
  • JSON encoding/decoding in Terraform: Explained with examples
  • Sorting Lists in Terraform: A Practical Guide
  • Terraform: How to trigger a Lambda function on resource creation
  • How to use Terraform templates
  • Understanding terraform_remote_state data source: Explained with examples
  • Jenkins Authorization: A Practical Guide (with examples)
  • Solving Jenkins Pipeline NotSerializableException: groovy.json.internal.LazyMap
  • Understanding Artifacts in Jenkins: A Practical Guide (with examples)
  • Using Jenkins with AWS EC2 and S3: A Practical Guide