在git中恢复已删除的文件和历史记录

camsedfj  于 2023-09-29  发布在  Git
关注(0)|答案(4)|浏览(148)

如何在push后恢复git中意外删除的文件和文件夹。下面是场景。
1.不小心删除了一个文件夹,其中有一个单一的文件,并作出了一堆更改其他文件。
1.现在,推动了所有这些变化。因此,此推送包含已删除的文件夹沿着其他更改的文件。
1.除此之外,还有几个推。
现在,我可以恢复已删除的文件,沿着历史记录,然后推回存储库。

tzdcorbm

tzdcorbm1#

这是可能的,在Git copy file preserving history的帮助下,您需要在文件被删除之前复制它。
我将在这里写一个完整的例子。首先,我将准备一些测试仓库:

git init
echo "test content" > file.txt
git add file.txt
git commit -m "start"
echo "test content 2" >> file.txt
git commit -am "next commit"
rm file.txt
git commit -am "Delete file, lose history"

现在我们有了一个没有文件的测试仓库。要恢复文件及其提交历史,过程如下:创建一个分支文件确实存在。然后将此文件复制两份,每份都有历史记录。然后合并回主文件,在合并过程中,两个副本中只有一个会被删除。在下面的例子中,请确保使用你的提交哈希而不是190112b

git checkout 190112b -b before-deletion
git mv file.txt file1.txt
git commit -m "Move file (1)"
SAVED=`git rev-parse HEAD`
git reset --hard "HEAD^"
git mv file.txt file2.txt
git commit -m "Move file (2)"
git merge $SAVED
git commit -a -n

好了,现在在这个分支中,我们有这个文件的两个副本。每个副本都保留了历史。现在,当我们将其合并回master时,一个文件将消失(或将具有错误的历史),另一个将保留历史。

git checkout master
git merge before-deletion
git commit -a -n
git rm file1.txt
git mv file2.txt file.txt
git commit -m "recovery finished"

就是这样

xt0899hw

xt0899hw2#

当然,只要从它存在的提交中检查它就行了。如果删除文件的提交是你当前 checkout 的任何内容的提示,那就是HEAD^(最后一次之前的提交):

git checkout HEAD^ -- path/to/file

然后你就可以承诺并推动它。

tuwxkamq

tuwxkamq3#

刚刚遇到了类似的场景:以前删除了一个文件,现在我需要恢复它。
步骤1:找到删除文件的提交(假设文件名为test.log):

$ git log --all --stat --diff-filter=D -- test.log
commit aec72339081df3bc621a6c0cd3687257778466e4
(Author, Date, commit message etc appear here)

步骤2:从提交中恢复文件(上面的aec723390),注意包含尚未删除文件的前一次提交的^

$ git restore --source aec723390^ -- test.log

步骤3:文件将被恢复到你的工作树(但不是仓库,直到你真正提交它),你可以通过git add test.log添加它,然后提交:

$ git status
On branch main
Your branch is up-to-date with 'origin/main'.

Untracked files:
  (use "git add <file>..." to include in what will be committed)
    test.log

nothing added to commit but untracked files present (use "git add" to track)
$
vcirk6k6

vcirk6k64#

假设你目前在master分支上,一个简单的解决方案是从最后一次提交中找到GIT SHA1(使用类似gitk helps的东西)和你想要删除的文件。
运行命令

git checkout <GIT SHA1 value>

将文件的内容复制到记事本(或任何文本编辑器)中
运行命令

git checkout master

用记事本中的内容重新创建文件

相关问题