Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I restore a previous version as a new commit in Git?

Tags:

git

undo

First, I have seen the answer to this question here before, but it is buried by so many "answers" which don't answer my question properly, that I cannot find it again.

So here it goes: How do I restore in Git to a previous version in my history, so that it becomes the new commit on top of my current history?

Basically, this is the most fundamental thing I would like to do with a version control system. Simply doing a reset doesn't work, because it throws away my history, a simple revert doesn't work either, because sometimes it gives me error messages (what I want to do should be possible without any error messages).

Edit: If I just do a git revert this error happens:

git revert HEAD~1
error: could not revert f1b44e3... Towards translating API to kernel.
hint: after resolving the conflicts, mark the corrected paths
hint: with 'git add <paths>' or 'git rm <paths>'
hint: and commit the result with 'git commit'
like image 343
Steven Obua Avatar asked Jun 23 '17 18:06

Steven Obua


People also ask

How do you revert back to a commit in git?

To revert a commit with GitKraken, simply right-click on any commit from the central graph and select Revert commit from the context menu.


1 Answers

Simply "checkout the commit". This will overwrite your current working directory with the specified snapshot (commit) of your repo from history and make that your new working-set which you can stage and commit as you wish. If you commit immediately afterwards then your repo will have the same filesystem contents as the commit you performed the checkout to (assuming you have no other unstaged or staged changes)

This will not rewrite history nor edit or delete any previous commits - so it works similar to a "rollback" on Mediawiki:

cd ~/git/your-repo-root
git log
# find the commit id you want
git checkout <commitId> . 
# IMPORTANT NOTE: the trailing `.` in the previous line is important!
git commit -m "Restoring old source code"

See also: Rollback to an old Git commit in a public repo

Regarding the . (dot)

The . (dot) character means "current directory" - it is not anything special or unique to git, it's a standard command-line filesystem convention that's the same on Windows, Linux, macOS, and even MS-DOS. It works similar to how .. means "parent directory". I recommend reading these:

  • https://askubuntu.com/questions/54900/what-do-and-mean-when-in-a-folder
  • https://superuser.com/questions/37449/what-are-and-in-a-directory
  • What is double dot(..) and single dot(.) in Linux?
  • https://unix.stackexchange.com/questions/118175/what-are-some-uses-of-single-period-double-period-in-the-shell-command

Regarding checkout

Be aware: checkout is an overloaded command in git - it can mean to switch branches (a la svn switch) or to get a specific file or commit from history and put into your workspace (a la svn update -r <id>). It can mean other things too: https://git-scm.com/docs/git-checkout - I appreciate it can confuse people, especially myself when I started using git after using TFS for years (where "Checkout" means something else entirely).

like image 134
Dai Avatar answered Oct 14 '22 16:10

Dai