我有一个存储库,我最终与其他一些开发人员正常工作(我们正在通过FTP覆盖来互相攻击)。
其中一位开发人员使用FTP上传了对服务器的更改,我下载了这些更改,覆盖了我的本地文件夹。我当时认为git只会识别已经改变的文件,但事实并非如此。事实上,git认为文件没有改变。
是否有一个命令可以告诉git“进行物理重新扫描每个文件的更改,看看是否有任何更改。”在这一点上,我不确定哪些文件是从FTP下载更改的,所以当我进行git push / pull时,它表示没有任何更改,即使我知道它有。
答案 0 :(得分:1)
看看这个帖子:Git Push into Production (FTP)
其中包含一个名为git-ftp的非常棒的工具,以便通过FTP将生产就绪的更改推送到您的服务器。
https://github.com/resmo/git-ftp
我用它来推送到FTP,只要我认为我所做的开发更改已准备好推送到我的服务器。
答案 1 :(得分:0)
Git使用存储在树根目录中名为.git
的目录中的大量数据结构来跟踪存储库的状态 - 因此,如果您使用同事的.git
目录覆盖该文件FTP服务器,就git而言,它可以告诉你具有与上传时相同的存储库状态,所以当然它没有报告任何变化。
这不是一个很好的使用git的工作流程,但是如果你必须将FTP {up,down}加载与git中的本地版本控制相结合,你可以设置GIT_DIR
环境变量来引用一个以外的目录。您的源树(在下载新的FTP快照时不会被覆盖的源代码树),git可以跟踪存储库和历史元数据。
答案 2 :(得分:0)
你应该认真考虑设置一个合适的git服务器,因为通过FTP传输更改会破坏使用git等版本控制系统的目的。假设每个人都有SSH访问服务器,设置起来相当简单,你只需要在服务器上的一个目录中创建一个裸存储库,每个人都有读写访问权限。也可以在不必为每个人提供shell访问的情况下进行设置。
您可以阅读有关在免费Pro Git book中设置git服务器的更多信息,其中详细介绍了几种不同的技术。如果您更愿意使用托管的git服务,也可以使用托管的git服务。
那就是说,Matt的回答是正确的,很可能发生了什么:你无意中覆盖了git用来跟踪本地存储库信息的目录。
如果GitHub中的内容仍然不错,您可以git fetch
然后git reset origin/master
将本地存储库恢复到GitHub上远程仓库的状态,它将保留所有本地差异。这将导致您丢失任何未被推送到GitHub的本地提交,但不会导致任何数据在本地丢失。如果你在意外覆盖之后确实已经推送到GitHub,那么这可能无济于事(如果没有明确的--force
,你可能无法做到这一点)。您也可以通过指定commit的哈希而不是“origin / master”来重置特定的提交。