当前位置:   article > 正文

【git使用】常用的 git 撤销操作(restore、reset、revert)

git 撤销

常用命令总结

  • 注意坑
    • 新增文件是未被跟踪状态(untracked),也就是下面命令不会对此文件生效
    • 所以新增文件,需要先被 git 记录到,也就是 git add new-file
    • 之后执行这些操作,就会生效了
# 丢弃工作区的修改(不包括对文件自身的操作,如添加文件、删除文件)
git restore <file_name> 
# 将暂存区的修改重新放回工作区(包括对文件自身的操作,如添加文件、删除文件)
git restore --staged <file_name> 


# 撤销最新的 commit,将其改动放回到 工作区
git reset HEAD~  # 或 git reset --mixed HEAD~  都是同一个意思

# 撤销最新的 commit,将其改动放回到 暂存区
git reset --soft HEAD~  

# 丢弃当前工作区和暂存区所有的改动
git reset --hard HEAD
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

git store

# 丢弃工作区的修改(不包括对文件自身的操作,如添加文件、删除文件)
git restore <file_name> 
# 将暂存区的修改重新放回工作区(包括对文件自身的操作,如添加文件、删除文件)
git restore --staged <file_name> 
  • 1
  • 2
  • 3
  • 4

git reset —— 更改 HEAD 指针指向

# 将该 commit-id 后面所有 commit 丢弃,那丢弃的 commit 中的改动内容是否会消失?
# --mixed 模式: 也就是默认模式,会将所有丢失 commit 的文件改动等放到【工作区】
# --soft 模式: 也就是默认模式,会将所有丢失 commit 的文件改动等放到【暂存区】
# --hard 模式: 也就是默认模式,会将所有丢失 commit 的文件改动【丢弃】

# 所以,再执行 reset 前,最好将工作区和暂存区清空,否则可能有未注意到的合并,从而产生bug
# 比如若有当前工作区有 a 文件改动,撤销的 commit 中也有 a 文件的改动, git reset 执行后,工作区的 a 文件是以哪种改动为主?
# 经测试 a 文件的改动 = 当前工作区的 a 文件改动 != 撤销commit中a文件的改动
# 所以,即使无法清空工作区和暂存区,最好也要保证 工作区和撤销的commit中 没有相同文件的改动
# 另外执行 hard 模式要慎重,会造成文件的丢失
# 若不慎造成 commit 丢失,可以通过 reflog 进行恢复,但是无法恢复【工作区】和【暂存区】的文件丢失
git reset commit-id # 默认 --mixed 模式


# 将该 commit-id 后面所有 commit 撤销
git reset commit-id # 默认 --mixed 模式
# 将最新的 commit 撤销
git reset HEAD~ # 或 git reset HEAD^
# 将最新的和次新的 commit 撤销
git reset HEAD~2 # 或 git reset HEAD^^
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

git revert

# git revert  不会改变历史 commit,而是提交一个新 commit,执行指定 commit 中改动的反向操作
# 如 commit-A 中的改动是,新增 a.txt 文件, git revert commit-A 执行后,会新增一个 commit,该 commit 的改动就是 删除 a.txt
git revert commit-id
  • 1
  • 2
  • 3

git clean

git clean用于清除没有加入到git版本库的文件和目录,如果加入到git版本库里的话,我们就无法使用git clean 清除,必须还原到未跟踪(Untracked)状态才可以进行git clean清除,在我们进行git管理项目代码的时候,经常会遇到以下场景。

  1. 在项目中添加了许多测试资源,测试完成后想把它们删了。
  2. 代码回滚时,有些文件或目录回滚到了未跟踪(Untracked)状态,并需要把它们移除掉。
  3. 项目开发过程中,临时创建了很多临时文件夹和目录,在项目核心代码加入到暂存区前,需要移除无用文件。

这个时候,通过使用git clean命令来处理,就会非常容易。

# 小结
git  clean在开发中应该充分应用。因此请牢记以下几个组合参数:
-n,显示哪些文件会被删除,如果文件是.gitignore里标记的文件,则忽略。
-d,查找目录。
-f,删除文件。
-x,查找未跟踪(Untracked)所有文件
-X,仅查找.gitignore里标记的未跟踪(Untracked)文件

查看删除列表 git clean -n组合
删除列表git clean -f组合


# 1. 查看哪些文件会被删除
# 可以查看哪些未跟踪文件将会被删除,同时这些文件没有在.gitignore文件里进行标记。
git clean -n 
# 查看将会被删除的所有未跟踪文件
git clean -nx
# 只展示那些在.gitignore里标记的文件中,哪些是将要被删除的未跟踪文件。
git clean -nX
# 可以查看哪些文件和目录将会被删除,同时这些文件和目录没有在.gitignore文件里进行标记
git clean -nd 
# 查看将会被删除的所有未跟踪的文件和目录
git clean -nx
# 只展示那些在.gitignore里标记的文件和目录中,哪些是将要被删除的未跟踪文件和目录。
git clean -nX
# 其中,.gitignore中,如果忽略的文件目录结构是dir/*时,git clean -ndX,只删除忽略目录下的所有文件;如果忽略的文件目录结构是dir/时,git clean -ndX,删除忽略的目录


# 2. 执行删除操作
# 删除.gitignore里未标记的文件
git clean -f
# 删除所有未跟踪的文件
git clean -fx
# 只删除.gitignore里标记的文件
git clean -fX

# 删除.gitignore里未标记文件和目录
git clean -fd
# 删除所有未跟踪的的文件和目录
git clean -fdX
# 删除.gitignore里标记的文件和目录
git clean -fdX

  • 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
  • 43
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/644958
推荐阅读
相关标签
  

闽ICP备14008679号