【Git】找回删除了的文件(已rm+commit)

本文详细介绍了如何在Git中恢复已删除并提交的文件。通过示例步骤,从创建文件到跟踪、提交,再到删除及恢复的过程,展示了如何利用Git的历史记录找回丢失的数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

git 恢复在本地删除了的文件(已rm+commit)

场景:
最近两天学习了一下如何使用git,如何恢复被删除的文件,已经rm和commit,然后尝试恢复已经删除了的文件,前提是已经写入git库,不然恢复不了

解决:
首先在git的目录下新建一个测试文件,123.txt,查看git状态
$ git status
On branch master
Untracked files:
  (use "git add <file>..." to include in what will be committed)
        123.txt
nothing added to commit but untracked files present (use "git add" to track)

--git add
$ git add 123.txt
warning: LF will be replaced by CRLF in 123.txt.
The file will have its original line endings in your working directory

--git commit
$ git commit -m "add 123.txt"
[master 2dc5f0d] add 123.txt
 1 file changed, 4 insertions(+)
 create mode 100644 123.txt

--再次查看git状态
$ git status
On branch master
nothing to commit, working tree clean

---------------------开始恢复
--查看状态
$ git status
On branch master
Changes not staged for commit:
  (use "git add/rm <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)
        deleted:    123.txt
no changes added to commit (use "git add" and/or "git commit -a")

--查看被删除的文件
$ git log --diff-filter=D --summary
commit 1050ef7d1bc4aca28443ce0c207a66b56e064d2e (HEAD -> master)
Author: William Meng <346633091@qq.com>
Date:   Sun Aug 4 17:02:38 2019 +0800

    rm 123.txt

 delete mode 100644 123.txt

--可以看草被删除的123.txt文件的commit id为1050ef7d1bc4aca28443ce0c207a66b56e064d2e
$ git checkout 1050ef7d1bc4aca28443ce0c207a66b56e064d2e~1 123.txt
Updated 1 path from e3778cc

--查看状态
$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)
        new file:   123.txt

去git目录查看已经恢复刚刚删除的123.txt文件。

 

<think>我们正在处理一个Git操作问题:用户已经执行了`git commit`,然后删除文件,现在想要提交这个删除操作。 根据Git的工作流程,删除文件也是一个修改,需要被暂存和提交。 步骤: 1. 用户已经删除了工作区中的文件(使用`rm`命令或直接删除)。 2. 此时,工作区的状态是:文件删除,但暂存区(stage)还没有记录这个删除。 3. 我们需要将删除操作添加到暂存区,然后提交。 具体命令: - 删除文件后,可以使用`git add <被删除文件>` 或者更简单的方式是使用`git add -u`(只暂存已跟踪文件的修改,包括删除)或者`git add .`(当前目录所有修改,包括删除和新文件,但注意新文件也会被添加)。 - 但是,由于我们只关心已跟踪文件删除,推荐使用`git add -u`或者针对具体文件的`git add /path/to/deleted/file`。 - 然后,再次提交:`git commit -m "commit message"` 另外,也可以使用`git rm <file>`命令,这个命令会从工作区和暂存区都删除文件,相当于执行了删除操作并自动暂存了删除。但注意,如果已经手动删除文件,那么使用`git rm <file>`只是将删除操作添加到暂存区(因为文件已经不在工作区了,所以这个命令实际上只是暂存了删除)。 所以,有两种方式: 方式一(手动删除后): rm file.txt git add file.txt # 或者 git add -u git commit -m "Delete file.txt" 方式二(使用git rm): git rm file.txt # 这会删除文件(如果还在)并暂存删除操作 git commit -m "Delete file.txt" 注意:如果文件已经被手动删除,那么使用`git rm file.txt`会报错(因为文件已经不存在了),但是Git会理解我们的意图,所以我们可以使用`git rm --cached <file>`来仅从索引中删除(保留工作区,但工作区已经删除了,所以这个操作也是安全的)?实际上,对于已经手动删除文件,我们只需要暂存这个删除操作,使用`git add`即可。 更简洁的做法是:无论文件是否已经被手动删除,都可以使用`git rm <file>`。如果文件已经被手动删除,`git rm`会报错说文件不存在,但我们可以使用`git rm --cached <file>`来仅从索引中删除(不删除工作区的文件,因为工作区已经没有了)。但是,这样操作后,工作区的状态和索引一致(都是删除)。 所以,对于已经手动删除文件,我们可以: git add -u # 将所有已跟踪文件的修改(包括删除)暂存 或者针对单个文件git add /path/to/deleted/file # 实际上,对于已删除文件,`git add`会将其从索引中删除(暂存删除) 总结:最通用的做法是,在删除文件后(无论是用`rm`还是其他方式),使用`git add -u`来暂存所有已跟踪文件的修改(包括删除),然后提交。 另外,如果用户想要一次性完成删除和提交,也可以使用: git rm <file> # 如果文件还在,用这个命令删除并暂存;如果文件已经手动删除,则用下面的命令 git commit -m "message" 但是,如果文件已经手动删除,那么`git rm <file>`会失败(因为文件不存在),所以此时我们应该使用: git add -u # 或者 git add . git commit -m "Delete files" 或者,我们可以使用`git rm`来暂存删除,但只针对已经被手动删除文件,可以使用: git rm --cached <file> # 从索引中删除,但保留在工作区(但这里工作区已经删除了,所以相当于只是暂存了删除) 但注意,`git rm --cached`通常用于我们想从版本控制中移除文件,但保留在工作区(作为未跟踪文件)。而在删除文件的场景下,我们通常希望从工作区和版本库中都删除,所以使用`git add`来暂存删除操作是更直接的做法。 因此,推荐做法: 1. 删除文件(如果还没有删除,则用`rm`删除)。 2. 执行`git add -u`(或者`git add .`,注意`git add .`会包括新文件,如果只想包括删除和修改,用`git add -u`)。 3. 执行`git commit -m "删除文件"` 如果用户只想提交删除文件,而不想提交其他修改,那么可以单独暂存删除文件git add <deleted_file1> <deleted_file2> ... 然后提交。 根据引用[3]中提到的,`git add .`会将当前路径下的所有文件(包括修改和删除)添加到暂存区,而`git add -u`则是将所有已跟踪文件的修改(包括删除)添加到暂存区,但不包括未跟踪的新文件。 所以,根据用户的需求,如果只提交删除操作,而不想提交其他修改,那么需要单独`git add`每个删除文件。如果希望一次性提交所有修改(包括删除和其他修改),则可以使用`git add -u`或`git add .`。 注意:在提交之后,删除操作就被记录在版本历史中了。 另外,如果用户已经删除文件,但还没有提交,此时想要撤销删除恢复删除文件): - 如果删除操作还没有被暂存(即还没有`git add`),可以使用`git checkout -- <file>`来恢复文件(因为删除操作还在工作区,未暂存)。 - 如果删除操作已经被暂存(`git add`了),那么需要先取消暂存:`git reset HEAD <file>`,然后再用`git checkout -- <file>`恢复。 - 如果已经提交了,那么就需要回退提交(使用`git revert`或`git reset`)然后恢复文件。 但这个问题是用户已经删除文件,并准备提交删除,所以我们不涉及撤销。 生成相关问题: 1. 如何撤销已提交的删除操作? 2. 如何只暂存删除操作而不暂存其他修改? 3. 删除文件后,如何恢复删除文件(在提交之前)? 4. 使用`git rm`和直接`rm`然后`git add`有什么区别? 5. 如何从版本库中删除文件但保留在工作区?</think>### Git 提交后删除文件并提交更改 在 Git 中,删除文件后提交更改需要以下步骤: 1. **删除文件** 使用命令删除工作区文件(或手动删除): ```bash rm 文件名 # 删除单个文件 rm -r 目录名 # 删除目录 ``` 2. **暂存删除操作** 以下任一命令均可: ```bash git add 被删除文件名 # 单独暂存删除 git add -u # 暂存所有已跟踪文件的修改(包括删除git rm 文件名 # 删除文件并自动暂存(文件需存在) ``` 3. **提交删除操作** ```bash git commit -m "删除说明:移除XX文件" ``` 4. **推送到远程仓库**(可选) ```bash git push ``` --- ### 关键注意事项 1. **已跟踪 vs 未跟踪文件** - `git add -u` 只处理 **已跟踪文件** 的删除(参考引用[3]) - 新创建的未跟踪文件不会被此命令处理 2. **撤销误删**(未提交前) ```bash git restore 文件名 # 恢复工作区文件 git reset HEAD 文件名 # 撤销暂存的删除 ``` 3. **已提交的删除如何恢复** ```bash git checkout HEAD^ -- 文件名 # 恢复上一次提交的版本 ``` --- ### 操作示例 假设要删除 `outdated.py` 文件: ```bash # 1. 删除文件 rm outdated.py # 2. 暂存删除 git add outdated.py # 或 git add -u # 3. 提交删除 git commit -m "移除过时的脚本文件 outdated.py" # 4. 推送(可选) git push ``` > **特殊场景**:若文件已手动删除但未暂存,运行 `git status` 会显示: > ``` > Changes not staged for commit: > (use "git add/rm <file>..." to update what will be committed) > deleted: outdated.py > ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值