如何在push后恢复git中意外删除的文件和文件夹。下面是场景。1.不小心删除了一个文件夹,其中有一个单一的文件,并作出了一堆更改其他文件。1.现在,推动了所有这些变化。因此,此推送包含已删除的文件夹沿着其他更改的文件。1.除此之外,还有几个推。现在,我可以恢复已删除的文件,沿着历史记录,然后推回存储库。
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。
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"
就是这样
xt0899hw2#
当然,只要从它存在的提交中检查它就行了。如果删除文件的提交是你当前 checkout 的任何内容的提示,那就是HEAD^(最后一次之前的提交):
HEAD^
git checkout HEAD^ -- path/to/file
然后你就可以承诺并推动它。
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 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) $
vcirk6k64#
假设你目前在master分支上,一个简单的解决方案是从最后一次提交中找到GIT SHA1(使用类似gitk helps的东西)和你想要删除的文件。运行命令
git checkout <GIT SHA1 value>
将文件的内容复制到记事本(或任何文本编辑器)中运行命令
git checkout master
用记事本中的内容重新创建文件
4条答案
按热度按时间tzdcorbm1#
这是可能的,在Git copy file preserving history的帮助下,您需要在文件被删除之前复制它。
我将在这里写一个完整的例子。首先,我将准备一些测试仓库:
现在我们有了一个没有文件的测试仓库。要恢复文件及其提交历史,过程如下:创建一个分支文件确实存在。然后将此文件复制两份,每份都有历史记录。然后合并回主文件,在合并过程中,两个副本中只有一个会被删除。在下面的例子中,请确保使用你的提交哈希而不是
190112b
。好了,现在在这个分支中,我们有这个文件的两个副本。每个副本都保留了历史。现在,当我们将其合并回master时,一个文件将消失(或将具有错误的历史),另一个将保留历史。
就是这样
xt0899hw2#
当然,只要从它存在的提交中检查它就行了。如果删除文件的提交是你当前 checkout 的任何内容的提示,那就是
HEAD^
(最后一次之前的提交):然后你就可以承诺并推动它。
tuwxkamq3#
刚刚遇到了类似的场景:以前删除了一个文件,现在我需要恢复它。
步骤1:找到删除文件的提交(假设文件名为test.log):
步骤2:从提交中恢复文件(上面的aec723390),注意包含尚未删除文件的前一次提交的
^
:步骤3:文件将被恢复到你的工作树(但不是仓库,直到你真正提交它),你可以通过
git add test.log
添加它,然后提交:vcirk6k64#
假设你目前在master分支上,一个简单的解决方案是从最后一次提交中找到GIT SHA1(使用类似gitk helps的东西)和你想要删除的文件。
运行命令
将文件的内容复制到记事本(或任何文本编辑器)中
运行命令
用记事本中的内容重新创建文件