init 后 git pull 是否删除未跟踪的文件?

l0b*_*0b0 9 git

我刚刚制作了一个简单的脚本,并在 GitHub 上为它创建了一个新的存储库。初始化本地存储库,将脚本移动到存储库并pull调用 GitHub 存储库(仅包含一个README.md文件)后,脚本消失了。这是正常行为吗?有没有办法恢复文件?

以下是执行时的命令:

$ mkgithub ~/dev/cr2meta2jpg
Initialized empty Git repository in /home/username/dev/cr2meta2jpg/.git/
$ mv test.sh ~/dev/cr2meta2jpg/cr2meta2jpg.sh
$ cd ~/dev/cr2meta2jpg/
$ ls
cr2meta2jpg.sh
$ git pull
remote: Counting objects: 3, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
From github.com:l0b0/cr2meta2jpg
 * [new branch]      master     -> origin/master
$ ls
README.md
Run Code Online (Sandbox Code Playgroud)

Jon*_*yJD 11

Agit pull不会覆盖本地更改,除非您git add之前使用过。即使在这种情况下,您仍然可以恢复数据。

当你git add在 pull 之前发出:

mkgithub blub
cp test.sh blub/
cd blub/
git add test.sh
git pull
Run Code Online (Sandbox Code Playgroud)

拉将删除test.sh. 只有在本地存储库中没有提交时,它才会执行此操作。添加提交后,这不会删除test.sh(git 要么忽略它,要么报告合并冲突)

文件不会丢失。它仍然作为一个悬空的 blob 存在于 Git 存储库中。

要恢复文件:

$ git fsck
Checking object directories: 100% (256/256), done.
Checking objects: 100% (401/401), done.
dangling blob 541060d8292ff808c9715265d063f1bae220da7c
$ git show 541060d8292ff808c9715265d063f1bae220da7 > test.sh
Run Code Online (Sandbox Code Playgroud)

只要您之后没有发出此问题,此方法git gc --prune=now就有效。

  • 你也可以发出```git fsck --lost-found```。这会将悬空的 blob 保存到 ```.git/lost-found/other```。无论哪种方式,文件名都会丢失。文件名将是对象的哈希值。 (3认同)