使用git

时间:2017-02-17 00:58:03

标签: git github

如何在推送后在git中恢复意外删除的文件和文件夹。以下是情景。

  1. 意外删除了一个文件夹,该文件夹包含一个文件并对其他文件进行了一系列更改。
  2. 现在,推动所有这些变化。因此,此推送具有已删除的文件夹以及其他已更改的文件。
  3. 除此之外,还有一些推动。
  4. 现在,我可以将已删除的文件与历史记录一起恢复,然后再回到repo。

3 个答案:

答案 0 :(得分:8)

当然,只需从存在的提交中查看它。如果删除文件的提交是您当前检出的任何提示,那就是HEAD^(最后提交):

git checkout HEAD^ -- path/to/file

然后你可以提交并推送它。

答案 1 :(得分:1)

假设您当前在主分支上,一个简单的解决方案是找到上次提交的GIT SHA1(使用类似gitk帮助的东西)和所需的已删除文件。

运行命令

git checkout <GIT SHA1 value>

将文件内容复制到记事本(或任何文本编辑器)

运行命令

git checkout master

使用记事本

中的内容重新创建文件

答案 2 :(得分:0)

有可能在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 -m "next commit"
git commit -am "next commit"
rm file.txt
git commit -am "Delete file, lose history"

现在我们有了一个没有文件的测试库。要使用提交历史记录还原文件,请执行以下过程:在文件确实存在的地方创建一个分支。然后制作该文件的两个副本,每个副本都有历史记录。然后合并回母版,合并期间将仅删除两个副本之一。

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

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

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"

就是这样。

相关问题