git恢复误删文件及省去密码提交
自己遇到这种情况:自己将某文件在网页的控制面板上直接删除了,再pull下来。或者一个成员误删除了某个文件,然后push到远程库了,其他成员也都pull了,结果就是所有人的本地库当前版本中这个文件都不见了,那么如何恢复呢?
想到用revert恢复上一次提交或用reset和push -f重置版本并强制推送到远程库,经过实验发现这样做只能保证自己的本地库和远程库回到之前一个版本,而其他人想通过git pull同步是无效的,远程库版本已经低于其他人的本地库版本,这时候难道让其他人都删除版本库重新从远程库克隆?得不偿失。
然后就想,能不能从之前的版本中检出这个文件,然后重新添加到版本库中?再作为一个新的提交来挽救?
经实验室可以的,过程如下:
git checkout HEAD^ -- a.txt
HEAD^ 代表上一次提交,
-- a.txt 表示将上一次提交里的a.txt文件检出到工作区,这样a.txt就回来了。
接着:
git add a.txt && git commit -m "recover a.txt" && git push
其他人直接git pull
push时要你输入密码是因为你使用HTTPS方式,但是用SSH更方便更安全,不需要去输入长长的密码。
解决方案有多种:
修改repo目录下的.git/config,可以看到url是HTTPS形式。
[remote "origin"] fetch = + refs/heads/*:refs/remotes/origin/* url = https://username@github.com/username/projectname.git
为了使用SSH公钥的方式认证,把config的url改成下面这样
[remote "origin"] fetch = + refs/heads/*:refs/remotes/origin/* url = git@github.com:username/projectname.git
这样我git push的时候又可以用SSH公钥认证而不用去输入用户名和密码,不仅方便,而且更安全。
Linux 用户可以使用 ‘cache’ 认证助手包来缓存认证信息,运行下面的命令来启用凭据缓存,启用后每次输入密码将保存一小时(3600秒):
git config --global credential.helper 'cache --timeout 3600'
下面的命令可以查看 ‘cache’ 认证助手的所有配置:
git help credential-cache
除了这些方法之外,还有一种使用 .netrc 文件的方式.