git reset --mixed: A Comprehensive Guide for Beginners and Intermediates 🎯

beginner
9 min

git reset --mixed: A Comprehensive Guide for Beginners and Intermediates 🎯

Welcome to our deep dive into the world of git reset --mixed! This powerful command is an essential tool for any Git user, helping you navigate through your project's history with precision. Let's get started! 🚀

Understanding git reset --mixed 📝

git reset --mixed is a Git command that allows you to change the head of a branch to a different commit. This command operates in a way that combines elements of both git reset --hard and git reset --soft.

git reset --hard

git reset --hard moves the head to the specified commit and discards all changes in the working directory and the index. This command is destructive and should be used with caution.

git reset --soft

git reset --soft moves the head to the specified commit but keeps all changes in the working directory and the index. This command is non-destructive, allowing you to continue working on your changes while switching to a different commit.

Now that we understand these two commands, let's delve into git reset --mixed.

git reset --mixed Explained 💡

git reset --mixed moves the head to the specified commit, but unlike git reset --hard, it discards changes in the index. Unlike git reset --soft, it discards changes in the working directory. This means that you can choose to keep or discard changes in the working directory while switching to a different commit.

Example 1: A practical scenario 💻

Let's imagine you're working on a feature branch, and you've made some changes that you no longer want. You'd like to switch to a different commit but keep your changes.

bash
$ git checkout feature-branch $ git add . $ git commit -m "Unwanted changes" $ git log

Now, you want to go back to a previous commit without discarding your changes in the working directory. Here's how you can do it:

bash
$ git reset --mixed <commit-hash> $ git checkout HEAD^ # go back to the previous commit $ git add . # stage your unwanted changes $ git commit --amend # amend the previous commit with your changes

In this example, we reset the head to a different commit, but our unwanted changes are still in the working directory. We then checkout the previous commit, stage our changes, and amend the previous commit to include our changes.

Example 2: A real-world example 🌐

Imagine you've accidentally committed a sensitive file to a public repository. You'd like to switch to a different commit but want to keep the sensitive file out of the repository.

bash
$ git checkout main $ git add . $ git commit -m "Accidentally committed sensitive file" $ git log

Now, you want to go back to a previous commit without the sensitive file in the repository. Here's how you can do it:

bash
$ git reset --mixed <commit-hash> $ rm sensitive-file # remove the sensitive file from the working directory $ git add . $ git commit --amend # amend the previous commit without the sensitive file

In this example, we reset the head to a different commit, remove the sensitive file from the working directory, amend the previous commit without the sensitive file, and keep the sensitive file out of the repository.

Using git reset --mixed with Caution 📝

While git reset --mixed is a powerful command, it should be used with caution. Changes in the working directory will only be discarded if you explicitly stage and commit them after resetting. Always make sure to understand the impact of your actions and take backup when necessary.

Quiz Time 🧮

Quick Quiz
Question 1 of 1

What does `git reset --mixed` do?