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?