Git reset 笔记

Git reset 笔记:
使用 Git 提交代码时,或多或少会遇到过这次的提交不对想重新提交,并且不想再log里显示;今天就说说怎么撤销 commit

git区域

  • history:仓库
  • stage/index : 暂存区
  • working directory :工作区

三个主要参数

  • git reset –soft #— 撤销仓库的变更
  • git reset –mixed #— 撤销仓库、暂存区的变更,默认参数
  • git reset –hard #— 撤销仓库、暂存区、工作区的变更

提交级别的撤销

--hard方式,依然可以回到撤销前的状态(即未撤销状态),应该须在没有新的提交的前提下
当然最安全的还是默认方式--mixed,可以不指定

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# 参考:http://blog.csdn.net/carolzhang8406/article/details/49761927
# http://blog.csdn.net/hbwindy/article/details/51519999
# git log --oneline
baa3b06 reg
acd3a02 dir1
45c9eb8 git
e20c051 add README

# cat .git/refs/heads/master
baa3b062f99deba7eecb41bffc696070221ed561

# git reset --hard ^C #--- 或git reset --hard acd3a02
重置后撤出暂存区的变更:
M dir1/file1.txt
[root@vt-192-168-11-81-docker1 test]#
[root@vt-192-168-11-81-docker1 test]# git status
# 位于分支 master
# 尚未暂存以备提交的变更:
# (使用 "git add <file>..." 更新要提交的内容)
# (使用 "git checkout -- <file>..." 丢弃工作区的改动)
#
# 修改: dir1/file1.txt
#
修改尚未加入提交(使用 "git add" 和/或 "git commit -a"

# git log --oneline
acd3a02 dir1
45c9eb8 git
e20c051 add README

# git reflog
acd3a02 HEAD@{0}: reset: moving to HEAD^
baa3b06 HEAD@{1}: commit: reg
acd3a02 HEAD@{2}: clone: from http://g.zjlh.lan/zhuhongfeng/test.git

# git reset baa3b06 #--- **需要记得先前的ID,如果不记得,用上面的`git reflog`命令**
# git status
# 位于分支 master
# 您的分支领先 'origin/master' 共 1 个提交。
# (使用 "git push" 来发布您的本地提交)
#
无文件要提交,干净的工作区

文件级别的撤销

参考:https://git-scm.com/book/zh/v1/Git-%E5%9F%BA%E7%A1%80-%E6%92%A4%E6%B6%88%E6%93%8D%E4%BD%9C

取消已经暂存的文件

接下来的两个小节将演示如何取消暂存区域中的文件,以及如何取消工作目录中已修改的文件。不用担心,查看文件状态的时候就提示了该如何撤消,所以不需要死记硬背。来看下面的例子,有两个修改过的文件,我们想要分开提交,但不小心用 git add .全加到了暂存区域。该如何撤消暂存其中的一个文件呢?其实,git status的命令输出已经告诉了我们该怎么做:

1
2
3
4
5
6
7
8
$ git add .
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)

modified: README.txt
modified: benchmarks.rb

就在 “Changes to be committed” 下面,括号中有提示,可以使用git reset HEAD <file>... 的方式取消暂存。好吧,我们来试试取消暂存 benchmarks.rb 文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ git reset HEAD benchmarks.rb
Unstaged changes after reset:
M benchmarks.rb
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)

modified: README.txt

Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)

modified: benchmarks.rb

这条命令看起来有些古怪,先别管,能用就行。现在 benchmarks.rb 文件又回到了之前已修改未暂存的状态。

取消对文件的修改

如果觉得刚才对 benchmarks.rb 的修改完全没有必要,该如何取消修改,回到之前的状态(也就是修改之前的版本)呢? git status同样提示了具体的撤消方法,接着上面的例子,现在未暂存区域看起来像这样:

1
2
3
4
5
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)

modified: benchmarks.rb

在第二个括号中,我们看到了抛弃文件修改的命令(至少在 Git 1.6.1 以及更高版本中会这样提示,如果你还在用老版本,我们强烈建议你升级,以获取最佳的用户体验),让我们试试看:

1
2
3
4
5
6
7
$ git checkout -- benchmarks.rb
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)

modified: README.txt

可以看到,该文件已经恢复到修改前的版本。你可能已经意识到了,这条命令有些危险,所有对文件的修改都没有了,因为我们刚刚把之前版本的文件复制过来重写了此文件。所以在用这条命令前,请务必确定真的不再需要保留刚才的修改。如果只是想回退版本,同时保留刚才的修改以便将来继续工作,可以用下章介绍的 stashing 和分支来处理,应该会更好些。

记住,任何已经提交到 Git 的都可以被恢复。即便在已经删除的分支中的提交,或者用 --amend重新改写的提交,都可以被恢复(关于数据恢复的内容见第九章)。所以,你可能失去的数据,仅限于没有提交过的,对 Git 来说它们就像从未存在过一样。

修正最后一次提交

有时候我们提交完了才发现漏掉了几个文件没有加,或者提交信息写错了。想要撤消刚才的提交操作,可以使用--amend选项重新提交:

1
$ git commit --amend

此命令将使用当前的暂存区域快照提交。如果刚才提交完没有作任何改动,直接运行此命令的话,相当于有机会重新编辑提交说明,但将要提交的文件快照和之前的一样。

启动文本编辑器后,会看到上次提交时的说明,编辑它确认没问题后保存退出,就会使用新的提交说明覆盖刚才失误的提交。

如果刚才提交时忘了暂存某些修改,可以先补上暂存操作,然后再运行--amend提交:

1
2
3
$ git commit -m 'initial commit'
$ git add forgotten_file
$ git commit --amend

上面的三条命令最终只是产生一个提交,第二个提交命令修正了第一个的提交内容。

文章目录
  1. 1. git区域
  2. 2. 三个主要参数
  • 提交级别的撤销
  • 文件级别的撤销
    1. 1. 取消已经暂存的文件
    2. 2. 取消对文件的修改
  • 修正最后一次提交
  • ,