DEV Community

Abhay Singh Kathayat
Abhay Singh Kathayat

Posted on

Mastering Git: Undoing Changes with Reset, Revert, Stash, and More

Undoing Changes in Git: A Complete Guide

In Git, sometimes things don’t go as planned, and you may need to undo or discard changes you’ve made. Whether you’re dealing with uncommitted changes or need to revert a commit, Git provides several powerful commands to help you go back to a previous state. In this article, we’ll discuss how to undo changes using commands like git reset, git revert, git checkout, git stash, and git clean.


30. Git Reset: Undoing Commits and Changes

git reset is one of the most powerful commands in Git for undoing changes. It allows you to move the HEAD (the current commit) to a previous state. This can be useful for discarding commits or changes from the staging area or working directory.

Types of Git Reset

There are three main options for git reset:

  • Soft Reset (--soft): Moves HEAD to the specified commit, but doesn’t touch the staging area or working directory. All changes from the reset commit are left staged for the next commit.

    git reset --soft <commit-hash>
    
  • Mixed Reset (--mixed): The default option. Resets the HEAD and updates the staging area to match the commit, but leaves your working directory intact (changes are unstaged).

    git reset --mixed <commit-hash>
    
  • Hard Reset (--hard): Resets the HEAD, staging area, and working directory to match the specified commit. All changes after that commit are discarded.

    git reset --hard <commit-hash>
    

When to Use Git Reset

  • Soft Reset: Useful if you want to uncommit but keep changes staged for future commits.
  • Mixed Reset: Ideal if you want to unstage files but keep your changes in the working directory.
  • Hard Reset: Use when you want to completely discard changes, including any changes in your working directory.

31. Git Revert: Reversing a Commit

git revert is used to create a new commit that undoes the changes of a previous commit. Unlike git reset, which alters commit history, git revert is a safer way to undo changes, especially in a shared repository.

How to Revert a Commit

To revert a commit, run:

git revert <commit-hash>
Enter fullscreen mode Exit fullscreen mode

This creates a new commit that reverses the changes introduced by the specified commit. Git will open an editor to allow you to modify the commit message for the revert.

Why Use Git Revert?

  • Preserve History: Unlike git reset, git revert doesn’t rewrite commit history, making it ideal for collaborative environments where rewriting history could cause issues.
  • Undo Changes Safely: Reverting a commit adds a new commit that undoes the changes, making it a transparent way to handle mistakes.

32. Git Checkout: Switching Branches and Discarding Changes

git checkout is a versatile command used to switch between branches or to discard changes in your working directory.

Switching Branches

To switch to a different branch:

git checkout <branch-name>
Enter fullscreen mode Exit fullscreen mode

Example:

git checkout feature-branch
Enter fullscreen mode Exit fullscreen mode

Discarding Changes

You can also use git checkout to discard changes in your working directory (only uncommitted changes):

git checkout -- <file-name>
Enter fullscreen mode Exit fullscreen mode

This will discard any changes made to the specified file and revert it to the last committed version.

Why Use Git Checkout?

  • Switching Between Branches: Quickly move between branches to work on different tasks.
  • Discard Unwanted Changes: Discard changes in specific files or the entire working directory.

33. Git Stash: Temporarily Storing Changes

Sometimes, you might have changes in your working directory that you’re not ready to commit but need to switch to another branch. git stash allows you to temporarily save changes, which can be reapplied later.

How to Stash Changes

To stash your changes:

git stash
Enter fullscreen mode Exit fullscreen mode

This will save your modifications (both staged and unstaged) and revert your working directory to the last committed state.

Reapplying Stashed Changes

To apply the latest stash to your working directory:

git stash apply
Enter fullscreen mode Exit fullscreen mode

Viewing Stashed Changes

To view the list of stashes you’ve made:

git stash list
Enter fullscreen mode Exit fullscreen mode

Why Use Git Stash?

  • Context Switching: Stash allows you to switch to another task (branch) without committing unfinished work.
  • Temporary Storage: It’s useful when you want to quickly move to another branch but don’t want to commit incomplete changes.

34. Git Clean: Removing Untracked Files

git clean is a command used to remove untracked files and directories from your working directory. This is helpful when you have files that aren’t being tracked by Git but want to clean up your working environment.

How to Clean Untracked Files

To remove untracked files:

git clean -f
Enter fullscreen mode Exit fullscreen mode

By default, this will remove untracked files but leave untracked directories intact.

Removing Untracked Directories

To also remove untracked directories, use:

git clean -fd
Enter fullscreen mode Exit fullscreen mode

Dry Run: Preview Files to Be Removed

Before running git clean to delete files, you can preview what would be removed with the -n (dry-run) option:

git clean -n
Enter fullscreen mode Exit fullscreen mode

Why Use Git Clean?

  • Clean Working Directory: It’s useful when you have extra files in your working directory that you no longer need or don’t want to track.
  • Safe Cleanup: The -n dry run option ensures that you can review what will be deleted before actually removing the files.

Conclusion

Git offers several tools for undoing changes, whether they are uncommitted modifications or committed mistakes. The ability to reset, revert, stash, and clean up your working directory helps ensure you can manage your code with flexibility and safety. Here's a quick summary of what each command does:

  • git reset: Move HEAD to a previous commit and optionally alter the staging area or working directory.
  • git revert: Create a new commit that undoes the changes of an earlier commit.
  • git checkout: Switch between branches or discard changes in your working directory.
  • git stash: Temporarily store changes to come back to them later.
  • git clean: Remove untracked files and directories from your working directory.

By mastering these commands, you can confidently handle any situation where you need to undo or manage changes in Git, ensuring smoother development workflows.


Top comments (0)