I will introduct three ways of undoing changes and each one of them working in a specific phase of lifecycle of git.
Separately:
git commit --amend
git rest HEAD <file>
git checkout <file>
Let’s start with ‘git commit --amend
’, It is a little hard to explain the what this command dose,
a example will be helpful:
(base) -a01:testGit $ touch a.txt
(base) -a01:testGit $ git add a.txt
(base) -a01:testGit $ git commit a.txt -m 'first commit'
[master acf2b2d] first commit
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 a.txt
(base) -a01:testGit $ git log -1
commit acf2b2d05daaf590d331ca056a4391acda2a9590 (HEAD -> master)
Author: xxxxx <xxxxxxx@qq.com>
Date: Wed Dec 4 09:54:14 2019 +0800
first commit
we add a new file ‘a.txt’ to our git repository and commit with message ‘first commit’, make an assumption now that there is also a file b.txt we forget to create and it should be commited with a.txt at the same time. let’s see what we can do with command ‘git commit --amend
’:
(base) -a01:testGit $ touch b.txt
(base) -a01:testGit $ git add b.txt
(base) -a01:testGit $ git commit --amend -m 'first commit?'
[master dc22f53] first commit?
Date: Wed Dec 4 09:54:14 2019 +0800
2 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 a.txt
create mode 100644 b.txt
we create this file b.txt, stage it and commit it using ‘git commit --amend
’, this message tells us we commit two files in this action, I want to put some descriptions from 《Git Pro》 here:
It’s important to understand that when you’re amending your last commit, you’re not so much fixing it as replacing it entirely with a new, improved commit that pushes the old commit out of the way and puts the new commit in its place. Effectively, it’s as if the previous commit never happened, and it won’t show up in your repository history.
((base) -a01:testGit $ git log -2
commit dc22f53ee31e9341b12166b9d5b6ce55fbb1b287 (HEAD -> master)
Author: xxxxx <xxxxxxxx@qq.com>
Date: Wed Dec 4 09:54:14 2019 +0800
first commit?
commit 38ba72d4c06498efb7e905eadf20c590d5468092
Author: xxxxx <xxxxxxx@qq.com>
Date: Wed Dec 4 09:53:01 2019 +0800
nonsense
git log
command can tell us that the ‘first commit’ will never show in git log.
we can conclude that git commit --amend
is used to fix your last commit.