Git是一款可记录历史,回到过去的分布式版本管理工具~
普及Git基本知识:http://git.oschina.net/progit/
1.如果无意删除了远程分支和本地分支应该如何回到过去版本?
答:
在使用Git的过程中,有时可能会有一些误操作,比如:执行checkout -f 或 reset -hard 或 branch -d删除一个分支,结果造成本地(远程)的分支或某些commit丢失。这时,我们可以通过reflog来进行恢复,前提是丢失的分支或commit信息没有被git gc(CD30天)清除。一般情况下,gc对那些无用的object会保留很长时间后才清除的。reflog是git提供的一个内部工具,用于记录对git仓库进行的各种操作,可以使用git reflog或git log -g命令来看到所有的操作日志。
本地仓库回滚的过程很简单:
1.1 通过 git log -g 命令来找到我们需要恢复的信息对应的commit_id,可以通过提交的 版本ID,注备,时间,日期来辨别(黑色处为个人隐私)。
1.2 通过 git branch reserve_branch commit_id 来建立一个基于commit_id的新的分支(分支名可自定义)。
1.3 这样丢失的东西会恢复到reserve_branch 分支上了,然后切换到reserve_branch分支,一会文件就被开发工具检查到,可以用git push origin HEAD -u将本地分支推送到远程~
参考地址:http://blog.csdn.net/losophy/article/details/8932157
2 .gitignore 失效,不能进行有效过滤,怎么办?
答:
在项目开发过程中,突然心血来潮想把某些目录或文件加入忽略规则,按照上述方法定义后发现并未生效,原因是.gitignore只能忽略那些原来没有被track的文件.
如果某些文件已经被纳入了版本管理中,则修改.gitignore是无效的。那么解决方法就是先把本地缓存删除(改变成未track状态),然后再提交(蓝色文件为加入了版本控制的,灰色为.gitgnore过滤后的不可添加版本控制):
不要误解了!!! .gitignore 文件的用途,该文件只能作用于 Untracked Files,也就是那些从来没有被 Git 记录过的文件(自添加以后,从未 add 及 commit 过的文件)。
# 1.清理本地缓存(改变成未被追踪状态)
$ git rm -r --cached .
# 2.把工作时的所有变化提交到暂存区 : 包括文件内容修改(modified)以及新文件(new),但不包括被删除的文件。(会通过 .gitgnore 过滤)
$ git add .
# 3.将缓存区更新到本地仓库
$ git commit -m ‘update .gitignore’
3. 关于Git的连接的方式的坑你知道多少?
答 :
两种Git Clone 方式的分别是:
Https Url 登录: 下载到本地很简单,但fetch和push每次需要输入密码
使用https url克隆对初学者来说会比较方便,
复制https url然后到git Bash里面直接用clone命令克隆到本地就好了,
但是每次fetch和push代码都需要输入账号和密码,这也是https方式的麻烦之处 (某些 GitGUI 已经实现HTTPS方式缓存 Key-Value)。
SSH Url登录: 必须绑定密钥才能做任何操作不需要输 入密码而使用SSH url克隆却需要在克隆之前先配置和添加好SSH key,因此如果你想要使用SSH url克隆的话,你必须是这个项目的拥有者。否则你是无法添加SSH key的,另外ssh默认是每次fetch和push代码都不需要输入账号和密码,
如果你想要每次都输入账号密码才能进行fetch和push也可以另外进行设置。
关于两种Git连接方式加密原则:
HTTPS_Git连接方式 :
HTTPS其实是有两部分组成:HTTP + SSL / TLS,也就是在HTTP上又加了一层处理加密信息的模块。服务端和客户端的信息传输都会通过 SSL / TLS 进行加密,所以传输的数据都是加密后的数据。具体是如何进行加密,解密,验证的,且看下图。
详细参考地址!!!: http://blog.csdn.net/clh604/article/details/22179907
SSH_Git连接方式 (安全外壳传输协议):
用 非对称加密(RSA)算法进行传输,使用非对称加密(RSA)算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey)。公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行签名,那么只有用对应的公开密钥才能检验。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法,可防止数据传输时被第三方截获后修改。
详细参考地址 : https://www.jianshu.com/p/0ef46bef9ddd
Git连接方式总结 (只是本人的理解):
SSH连接 : 在电脑上生成公钥与私钥,并告知给本地和代码托管平台,本地Git客户端在push时会用私钥签名,代码托管平台会用公钥检验,pull时代码托管平台会用公钥加密.然后本地Git客户端会用私钥解密,这就是SSH公私钥加密算法~
(RSA算法)性能是非常低的 , 原因在于寻找大素数、大数计算、数据分割需要耗费很多的CPU周期 , 但是安全性很高。
HTTPS连接 : SSL介于应用层和TCP层之间。应用层数据不再直接传递给传输层,而是传递给SSL层,SSL层对从应用层收到的数据进行加密,并增加自己的SSL头。只在第一次握手时使用非对称加密,通过握手交换对称加密密钥,在之后的通信走对称加密TLS/SSL中使用了非对称加密,对称加密以及HASH算法。。
关于SSH方式公私密钥的生成 :
1.1 在本地生成ssh 公钥与私钥~
首先确保你的服务器已经成功设置自己的用户名和用户邮箱
git config --global user.name "YourName"
git config --global user.email "[email protected]"
设置成功后(根据用户名和邮箱生成公钥与私钥)!!!
ssh-keygen -t rsa -C “代码托管平台的邮箱@qq.com”
按3个回车,密码为空,大功告成。
1.2.cat ~/.ssh/id_rsa.pub
:查看是否已经有了ssh公钥
1.3. [在代码托管平台添加SSH公钥 : 把公钥复制进ssh公钥管理]
clip < ~/.ssh/id_rsa.pub
执行后将公钥被copy在剪切板上,Ctrl+V到公钥钥管理处
1.4. 告知私钥到本地
ssh-add ~/.ssh/id_rsa
如果在这个过程中出现异常[Could not open a connection to your ]:
(!!!注意: ssh-agent 周围加上两个` ,MarkDown语法无法显示双点!!!)
执行eval ssh-agent
再次执行ssh-add ~/.ssh/id_rsa
成功 ssh-add -l 查看 如果有新加的rsa出现就OK:
1.5.测试:(注意 [email protected]为本人的代码托管平台)
ssh -T [email protected]
**(git@你的代码托管平台网址) **
若返回:Welcome to Git@OSC, “用户名”!
则说明添加成功了!!!若不成功请移步下一条
1.6.ssh-keygen -t rsa -C "[email protected]"
ssh -T [email protected] //报错
提示Warning:Warning:Permanently added ‘git@’ to the list of known hosts permission denied (publickey)错误。
解决方案 :
在当前用户目录下创建文件~/.ssh/config
,并给文件添加以下内容
UserKnownHostsFile ~/.ssh/known_hosts
1.7、更改项目clone地址(如果用HTTPS关联过前提下) :
vi .git/config
修改
url = https://xxx.com/Name/project.git
改为
url = [email protected]/Name/project.git