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

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

我刚刚制作了一个简单的脚本,并在 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

答案1

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

当您在git add拉取之前发出时:

mkgithub blub
cp test.sh blub/
cd blub/
git add test.sh
git pull

拉动就会删除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

只要您git gc --prune=now事后未发出此命令,此操作就有效。

答案2

我尝试使用 github 远程创建一个新的存储库:

$ 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

然后尝试从github上拉取:

$ 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

cr2meta2jpg.sh已被删除,所以看起来答案是肯定的。

相关内容