从Github存储库中提取文件时,它只是将文件合并到本地Git,还是要删除所有内容并从远程存储库中获取文件?
Package.json和config.js在执行git pull origin master
之后被删除,而在.gitignore中被忽略。
在哪里可以找到那些文件?我应该重新创建它们吗?
答案 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.json
和config.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
的第一步是pull
。 fetch
做两件事:
它根据称为“ refspec”的配置值将来自远程的ref映射到本地repo。如果您不熟悉所有的git lingo,这听起来像胡言乱语,但是默认情况下,这仅意味着对于远程服务器中的每个分支,都会在本地存储库中创建“远程跟踪引用”。例如,如果fetch
有一个名为origin
的分支,那么您将获得一个名为master
的本地引用。
它也从远程下载足够的对象以填充更新/添加的引用的历史记录,并将这些对象添加到本地数据库。为了明确起见,git具有三种存储类型。您正在处理的文件在工作树中。包含历史记录(提交)的与数据库进行交互的是数据库。 (索引是两者之间的桥梁。)因此,访存仅会影响数据库,并且只会将对象添加到数据库中。到目前为止,您的工作文件完全不参与该过程。
origin/master
的下一步是将一些更改集成到您已检出的提交中。您将fetch
的{{1}}分支指定为要集成的更改的来源,并且默认情况下,集成是通过简单地合并完成的-以便将更改集成的结果显示在新的合并提交中。分支的尖端,索引和工作树中。
因此,如果要合并的更改包括文件的删除(并且没有冲突的本地更改),则可以在此处删除文件。