I have a newbie question about Git:
I need to move back and forth in a history of a branch. That means, I need to get all the files to the state they were in in some old revision, and then I need to get back to the latest state in the repository. I don't need to commit.
With SVN, it would be
svn up -r800
to get to revision 800, and
svn up
to get in sync with the repository.
I know the hash of the commit I want to get back to, so I tried
git reset <hash>
which seems to get me there. But then I tried
git pull
but that complains about conflicts.
So what's the proper way to move through the history of the branch?
I'm thinking in terms of SVN, so don't hezitate to point me to some nice tutorial. Note that I've already checked http://git.or.cz/course/svn.html and http://www.youtube.com/watch?v=8dhZ9BXQgc4 .
Thanks, Ondra.
To checkout a different version of a file, use
Where rev can be the ID of a commit, the name of a branch, the name of a tag, or a relative version.
Use
git log
,gitk
to look examine versions to see which version of the file you want.To make this version of the file permanent, you need to commit the file:
git add filename; git commit filename
I would not recommend
git pull
to examine versions because it does a merge -- potentially modifying your current state.You do not need to use
git reset
in this case, unless yougit add
a file you decide not to commit.Well, I'm a former svn user too, and now use git for all my projects.
When using git, you should change the way of thinking from the client-server architecture that's used in svn. In svn, every change needs a connection with server. Using git, your repo is in the working directory. You don't need a connection for every repo action.
Only use
git push
andgit pull
to synchronise with repo. Think of it like using rsync or any backup solution, to make two place have exactly same content. Just like you connect external backup hard disk, then make the content in it same with the content in your main. That's the usage ofgit pull
andgit push
.If you just want to go back and forth the history, do it using
git checkout
. See the revision id usinggit history
. If you're using Linux, usegitk
to see the revision tree. In Windows, tortoise git can display it using revision graph.To get back to latest revision, use
git checkout master
. Before doing any command, always make yourself dogit status
. This command will display anything you need to know about current repo condition, and what action that you need to do to make it right. Before dogit pull
andgit push
, it's better to make sure thatgit status
result is contain textworking directory clean
.If you need to revert a file to it's previous revision, you can do it with
git merge
. Before doing it to a file, test it first withgit diff
. Ex:git diff rev1:rev2 filename
. It will print out any different between two revision. Change in rev1 will be replaced by the changes in rev2. So to do revert, rev2 will be the older than rev1. After you satisfy with the diff result, do it withgit merge
, just replacediff
withmerge
, all other parameters stay the same.I hope this helps you. The main key is to see that your working dir is your repo. Understanding this will help you use git to it's full capability. Good luck.
The other answers are informative, but I believe this is closest to what the OP wants:
Add these two functions to your ~/.bashrc:
Usage:
Note: These commands always enter detached HEAD state. If you
git_prev
thengit_next
from a currently checked out branch, you will end up back at the latest revision but you will be in detached HEAD state. Dogit checkout BRANCH_NAME
to get back to normal.You can use
git checkout
to checkout any commit and then use it with a branch name to go back to a named branch.git checkout
with a commit id and not a branch name moves you off any named branch and on to what is known as a detached head.If you use
git reset
then it will move your branch itself back to an old state, orphaning the more recent commits which probably isn't what you want.Try
git reflog
, this lists commits and checkouts you have done to switch between the commits, even the commits you have lost when checkout to a previous commit.Then you can try
git checkout <hash of a commit>
to switch to that commit.Hope this helps!