Git Pull Origin Master删除隐藏文件(来自.gitignore)

时间:2018-07-25 10:35:01

标签: git

从Github存储库中提取文件时,它只是将文件合并到本地Git,还是要删除所有内容并从远程存储库中获取文件?

Package.json和config.js在执行git pull origin master之后被删除,而在.gitignore中被忽略。

在哪里可以找到那些文件?我应该重新创建它们吗?

2 个答案:

答案 0 :(得分:0)

git pull等效于git fetch + git merge。这意味着它不会简单地覆盖本地文件。供参考,请参阅此处的文档:

https://git-scm.com/docs/git-pull

一生一世犯下的一切都可以检索。命令git reflog将在本地打印您的更改历史记录。因此,您可以执行git checkout some_commit_hash来追溯历史。请参阅参考资料:

https://git-scm.com/docs/git-reflog

免责声明:如果您不知道100%正在做什么,则不要执行git push -f来覆盖遥控器。

答案 1 :(得分:0)

仅在某些情况下git pull origin master将从工作树中删除文件,并且应该在这种情况下可以恢复。我认为问题的症结在于:

  

执行git pull origin master 后,Package.json和config.js被删除,而在.gitignore中被忽略。

(强调地址)。但是.gitignore的功能非常狭窄-它可以防止未跟踪的文件被意外跟踪。它不会使跟踪文件的更改被忽略。如果package.jsonconfig.js是跟踪文件,并且即将在origin/master上提交,则将它们删除,则将它们添加到.gitignore不会保护他们免受删除整合这些即将到来的提交时。

如果您在存储库中有一个文件,然后决定将其添加到.gitignore并将其从存储库中删除,这可能会很麻烦,因为即使您将文件添加到{ {1}},直到提交删除文件之前,它什么都不做;并且删除文件的提交将.... gitignore条目生效之前删除文件。

但是,对于git来说,从工作树中删除它们应该意味着(1)您没有在本地对它们进行任何更改(因为这会引起冲突),并且( 2)您没有对它们进行任何本地未提交的更改(因为git会警告您,您需要在覆盖它们之前撤消或隐藏本地更改)。

因此,您应该能够从较早的提交中检索文件。

.gitignore

git checkout master@{1} -- package.json config.js 之后可能会工作(利用reflog)。或者,如果reflog的格式不正确,则替换为可解析为仍包含文件的提交的任何表达式。 (也许pull ...这取决于存储库历史记录中的全部内容。)

如果这是怎么回事,那就是一次性的烦恼。从具有文件的提交更新 到没有文件的提交 时,文件消失。之后,master^条目实际上将使该文件保持未跟踪状态,并进一步处理该文件(除非将文件重新添加到以后的提交中,但这是另一回事)。

如果有帮助,这里还有一些其他背景:

.gitignore是一种快捷方式,用于更新git pull origin master(远程)中的本地存储库,然后集成origin版本的origin(分支)中的更改。升级到当前已签出的版本。

任何master的第一步是pullfetch做两件事:

它根据称为“ refspec”的配置值将来自远程的ref映射到本地repo。如果您不熟悉所有的git lingo,这听起来像胡言乱语,但是默认情况下,这仅意味着对于远程服务器中的每个分支,都会在本地存储库中创建“远程跟踪引用”。例如,如果fetch有一个名为origin的分支,那么您将获得一个名为master的本地引用。

它也从远程下载足够的对象以填充更新/添加的引用的历史记录,并将这些对象添加到本地数据库。为了明确起见,git具有三种存储类型。您正在处理的文件在工作树中。包含历史记录(提交)的与数据库进行交互的是数据库。 (索引是两者之间的桥梁。)因此,访存仅会影响数据库,并且只会将对象添加到数据库中。到目前为止,您的工作文件完全不参与该过程。

origin/master的下一步是将一些更改集成到您已检出的提交中。您将fetch的{​​{1}}分支指定为要集成的更改的来源,并且默认情况下,集成是通过简单地合并完成的-以便将更改集成的结果显示在新的合并提交中。分支的尖端,索引和工作树中。

因此,如果要合并的更改包括文件的删除(并且没有冲突的本地更改),则可以在此处删除文件。