Skip to content

回滚

参考:https://github.com/geeeeeeeeek/git-recipes/wiki/2.6-%E5%9B%9E%E6%BB%9A%E9%94%99%E8%AF%AF%E7%9A%84%E4%BF%AE%E6%94%B9

1. git revert

还原一些现有的提交。

git revert [--[no-]edit] [-n] [-m parent-number] [-s] <commit>...
git revert --continue
git revert --quit
git revert --abort

它是通过搞清楚如何撤销这个提交引入的更改,然后在最后加上一个撤销了更改的新提交,而不是从项目历史中移除这个提交。这避免了Git丢失项目历史。

例子:

[root@dev git-test]# git log --oneline
3c525df test rebase
fdd2dad conflict commit

# 3c525df增加了d6这个文件的内容
[root@dev git-test]# cat d6
test rebase

# 撤销3c525df所做的更改
[root@dev git-test]# git revert 3c525df
[master bdcb3b5] Revert "test rebase"
 1 file changed, 1 deletion(-)

# 此时d6没有内容
[root@dev git-test]# cat d6
[root@dev git-test]# git log --oneline
bdcb3b5 Revert "test rebase"
3c525df test rebase
fdd2dad conflict commit

2. git reset

该命令不会重置git未追踪的文件(比如.gitignore中的文件)。

不加--hard选项时只重设缓冲区;加上该选项时,还会重设工作目录。

  • git reset:重设缓冲区,匹配最近的一次提交,但工作目录不变。它会取消 所有 文件的缓存,而不会覆盖任何修改
  • git reset --hard:重设缓冲区和工作目录,匹配最近的一次提交。
  • git reset <commit>:将缓存区重设到这个提交,但不改变工作目录。所有 <commit>之后的更改会保留在工作目录中。

3. git clean

删除git未追踪的文件。常与git reset --hard结合使用。

git clean [-d] [-f] [-n] [-q] [-e <pattern>] [-x | -X] [--] <path>...
  • -f:删除文件必加选项。
  • -n:不去真正地删除文件,而是告知哪些文件会被删除。
  • -d:除了未跟踪的文件外,还删除未跟踪的目录。
  • -x:不使用.gitignore(每个文件夹下的)和$GIT_DIR/info/exclude的忽视规则,只使用-e选项定义的规则来删除文件。
  • -X:只删除被git忽视的文件。
[root@dev git-test]# git clean -n
Would remove clean-test
[root@dev git-test]# git clean -f
Removing clean-test