Git|一文教你如何撤销Git中不同状态的文件

简介: 众所周知,Git 把文件在本地划分为三个区,分别是工作区、暂存区和本地仓库,还有一个不在本地的远程仓库,如果误操作把文件提交了,那么我们该怎么还原呢?

众所周知,Git 把文件在本地划分为三个区,分别是工作区、暂存区和本地仓库,还有一个不在本地的远程仓库,如果误操作把文件提交了,那么我们该怎么还原呢?此文从不同的角度出发,还原不同状态下的文件。

修改后未add的文件

如果是在工作区修改的文件,还没有添加到暂存区,怎么让工作区的文件恢复和暂存区一样呢?

git checkout <文件名>
  1. 可以撤销工作区的修改,内容和暂存区的文件内容保持一致
  2. 新创建的文件使用此命令会报错,因为文件还没有进行版本控制

image-20220426090702940.png

已经add的文件

1、如果需要保留修改内容的话,可以直接使用下面的命令把文件从暂存区删除掉:

git rm --cache -r <文件名>

有以下两个点需要注意:

  • 如果是新创建的文件,使用这个命令,可以直接从暂存区删除掉,转到工作区。
  • 如果是修改的文件,使用这个命令,那么文件会变成删除的状态,文件正在从本地仓库删除;再执行一次commit,就会把文件从仓库删除掉,文件进入工作区,文件修改的内容不会改变。

2、如果不需要保留修改内容的话,可以直接使用版本还原命令(版本号填写前几位即可,保证填写的这几位不出现重复,一般是写5位。例如:git reset --hard c5775

git reset --hard <版本号>

整个工作区撤销到某个版本,会把这个版本以后你新增或修改的内容全部还原,回收站和本地仓库都找不来的那种。

比较有意思的一点是未添加到版本控制的文件(即那些新建未执行add操作的文件)不会被删除。

已经commit的文件

这时候的文件已经进入本地仓库了,这时候的撤销就会出现不同的情况了,是要撤销到暂存区还是工作区呢?这时候多了不同的选择,具体的操作接着往下看。

1、撤销文件到暂存区,这时只是撤销 commit 的操作,可以使用下面的命令:

git reset --soft <版本号>

此版本后的 commit 都会被撤销,但是修改内容还是存在的,并且文件在暂存区,此时如果你想再撤销add操作的话,可以参考第一种情况。

2、撤销文件到工作区,保留修改的内容。相当于撤销 commit 和 add 操作

git reset --mixed <版本号>

该版本后面的的 commit 和 add 都会被撤回的,有以下两点需要注意:

  • 所有新创建的文件都会回到工作区,内容不变
  • 所有在版本后有修改的文件也回到工作区,内容与最后一次修改后的内容保持一致

示例

撤销前的日志如下所示,在版本77096后主要涉及三个文件:

  • num.txt:新创建并提交的文件
  • b.txt:新创建提交,然后又修改提交的文件
  • a.txt:以前就存在,在版本77096后修改提交的文件

image-20220426095238639.png

执行命令git reset --mixed 77096,撤销以后的仓库状态如下所示:

image-20220426095518898.png

3、撤销工作区以及暂存区的所有修改。工作区及暂存区的内容会和某次提交后的仓库内容保持一致。

git reset --hard <版本号>

撤销commit操作的同时会撤销add操作,并且把你修改和新增的内容全部删除掉,可以试着先撤销到最近提交的版本,这样可以把文件的变动降低到最小

PS:默认情况下,git reset后面不跟参数时,使用的是--mixed

拓展知识:只修改提交的说明内容

如果只是提交时的说明内容写错了,那么可以只修改提交内容:参考《手把手教你修改message和合并commit

已经push的文件

已经 push`的文件,会被推送到远程仓库,突然发现文件提交错了,这是不是感觉比较慌?不用紧张~

1、撤销本地仓库的修改,操作参照上面《已经 commit 的文件》。

2、推送到远程仓库。此时直接使用git push会报错,因为执行撤销操作以后,导致本地的版本号低于远程仓库的版本号。就需要我们执行强制推送。

git push <仓库名> <分支名> –-force

或者

git push -f <仓库名> <分支名>

示例

# origin远程仓库名,master分支名,-f 为force
git push -f origin master

git revert操作

revert可以理解为复原,相当于对某些操作的逆转。关于git revert有以下几个注意点:

  • 基本的使用操作是git revert <版本号>,撤销某次提交
  • git revert操作会产生一次新的commit

如何只产生一次新的commit完成批量撤销复原操作呢?

撤销一系列提交可以使用的命令是:

git revert --no-commit <commit1>..<commit2>

这是一个前开后闭的区间选择,意思就是不包括commit1,但包括commit2。这个是连续性,会把commit1commit2之间所有的修改都撤销了,包括commit2提交记录的修改。

一般来说,revert对每个撤销的commit记录都会生成一个新的提交,产生一次提交记录。--no-commit 表示可以最后一起手动提交,避免产生太多提交记录。

那么问题来了,如果你对某文件进行了多次修改,多次修改的是同一块代码,然后再撤销很久很久以前一次提交,那么会出现什么后果呢?

这时候再使用revert的话,会出错的,提醒无法复原文件,但是git会把执行结果展示在文件中,git会把文件划分为两部分,一部分包括文件现在的内容,一部分包括文件复原版本的上一个版本的内容。中间以=======划分。最终的内容由用户自己决定。

<<<<<<< HEAD
文件现在的内容
=======
文件在复原后,上一个版本的内容
>>>>>>> parent of e686989... modify 2.txt

修改完成以后,执行add和commit即可。

reset 和 revert

git resetgit revert的区别可以用一句话概括下来:

git reset --hard 撤销某次提交,git revert撤销某次提交 。

目录
相关文章
|
2月前
|
存储 前端开发 开发工具
Git Hooks实战:提交前检查修改文件中是否包含调试代码
Git Hooks实战:提交前检查修改文件中是否包含调试代码
48 0
|
3月前
|
存储 开发工具 git
Pycharm git-创建本地仓库\创建分支\合并分支\回溯版本\加入git后文件颜色代表的含义
Pycharm git-创建本地仓库\创建分支\合并分支\回溯版本\加入git后文件颜色代表的含义
68 0
|
2月前
|
存储 开发工具 git
Git 教程:解密 .gitignore 文件、合并分支、解决冲突、及 Git 帮助
如果你忘记了命令或命令的选项,你可以使用 Git 帮助。 在命令行中,有几种不同的使用帮助命令的方式: git command -help - 查看特定命令的所有可用选项 git help --all - 查看所有可能的命令 让我们看看不同的命令。
213 3
|
2月前
|
Shell 开发工具 git
查看 Git 中某个文件的提交历史记录(log)
要查看 Git 中某个文件的提交历史记录(log),你可以使用 `git log` 命令并指定文件名作为参数。以下是一些常用的方法来查看某个文件的 Git log: 1. **查看文件的完整提交历史**: ```bash git log -- <filename> ``` 这里的 `--` 是可选的,用于分隔命令行选项和文件名。 2. **查看文件的简要提交历史**: ```bash git log --oneline -- <filename> ``` --oneline` 选项会以一行显示每个提交,使输出更简洁。 3. **查看文件的提交历史并显示每次提交的差异**: ```
|
3月前
|
SQL 开发工具 git
git 修改文件后revert
如果你想撤销对一个文件的修改,可以使用`git checkout`命令。 假设你想撤销名为`file.txt`的文件的修改,你可以执行以下命令: ``` git checkout -- file.txt ``` 这将把`file.txt`文件恢复到最后一次提交的状态。如果你想撤销所有修改,可以使用`git checkout -- .`命令。 如果你已经提交了修改,并且想要撤销提交,可以使用`git revert`命令。这将创建一个新的提交,撤销之前的提交。假设你想撤销最后一次提交,可以执行以下命令: ```sql git revert HEAD ``` 这将创建一个新的提交,撤销最
|
3月前
|
存储 网络安全 数据处理
git远程操作,推送【push】,拉取【pull】,忽略特殊文件,配置别名,标签管理
git远程操作,推送【push】,拉取【pull】,忽略特殊文件,配置别名,标签管理
|
3月前
|
开发工具 git
GIT | 基础操作 | 初始化 | 添加文件 | 修改文件 | 版本回退 | 撤销修改 | 删除文件(二)
GIT | 基础操作 | 初始化 | 添加文件 | 修改文件 | 版本回退 | 撤销修改 | 删除文件(二)
|
3月前
|
算法 安全 Linux
GIT | 基础操作 | 初始化 | 添加文件 | 修改文件 | 版本回退 | 撤销修改 | 删除文件(一)
GIT | 基础操作 | 初始化 | 添加文件 | 修改文件 | 版本回退 | 撤销修改 | 删除文件(一)
|
3月前
|
开发工具 git
【git】git 查看 modified 状态文件与上个版本的改动
【git】git 查看 modified 状态文件与上个版本的改动
35 0