Sometimes, when reviewing topic branches, I like to reset a file (to whatever it was in the master branch) and play around with it.
I figured out how to do that (see below) but it’s a bit clunky. Please take a look and comment if you know of a better way.
Here goes the example: first a repository is initialised and a file is added to it.
$ mkdir -p gitreset $ cd gitreset/ $ git init . Initialized empty Git repository in /home/muharem/tmp/gitreset/.git/ $ cat > a This is file a, rev. 1 ^D $ git add a $ git commit -a -m "initial commit" [master (root-commit) 3e74747] initial commit 1 files changed, 1 insertions(+), 0 deletions(-) create mode 100644 a
Next a topic branch is created and the file is modified in the former.
$ git checkout -b topic-branch master Switched to a new branch 'topic-branch' $ cat > a This is file a, rev. 2 ^D $ git diff diff --git a/a b/a index 595c3aa..7eb0dca 100644 --- a/a +++ b/a @@ -1 +1 @@ -This is file a, rev. 1 +This is file a, rev. 2 $ git commit -a -m "change to file a" [topic-branch 300108e] change to file a 1 files changed, 1 insertions(+), 1 deletions(-)
Now I would like to reset the file to whatever it was in the master branch.
$ git reset master a Unstaged changes after reset: M a $ cat a This is file a, rev. 2 $ git diff diff --git a/a b/a index 595c3aa..7eb0dca 100644 --- a/a +++ b/a @@ -1 +1 @@ -This is file a, rev. 1 +This is file a, rev. 2 $ git diff --staged diff --git a/a b/a index 7eb0dca..595c3aa 100644 --- a/a +++ b/a @@ -1 +1 @@ -This is file a, rev. 2 +This is file a, rev. 1
It appears the file was reset but the revision of interest is in the staging area. To get that revision into the working tree I need to do additional work.
$ git diff --staged | patch -p1 patching file a $ cat a This is file a, rev. 1
Is there a way to have the changes resulting from git reset in the working tree straightaway?