Git ssh安全认证
无论使用git bash客户端还是sourcetree,在git clone时需要进行ssh安全认证。从客户端来看,SSH提供两种级别的安全认证。
l 第一种级别是,基于口令的安全认证。github验证通过后,允许clone代码。
l 第二种级别是,基于密钥的安装认证。客户端生成一对公私密钥,并将公钥放到github主机上,客户端用私钥加密传送数据给github,github用公钥解密并比对原始数据,来认证客户端身份,通过后允许clone代码。原理如下:
对于非对称加密一般使用,可以归纳为两点:
(1) 使用公钥加密,来保证数据在网络传输的安全性。
(2) 使用私钥加密,来保证发送方来源的可靠性。
git工作流
l 工作区间: 即我们创建的工程文件, 在编辑器可直观显示;
l 暂存区: 只能通过git GUI或git shell 窗口显示,提交代码、解决冲突的中转站;
l 本地仓库: 只能在git shell 窗口显示,连接本地代码跟远程代码的枢纽,不能联网时本地代码可先提交至该处;
l 远程仓库: 即保存我们代码的服务器,本文以公共版本控制系统:github为例,登录github账号后可直观显示;
基本用法
(1) 将远程仓库更新到本地 git clone
(2) 提交代码到远程仓库
(3) 从远程仓库更新本地仓库和工作区git pull
git pull = git fetch + git merge
(4) 更新到本地仓库,出现冲突,解决冲突
当远程仓库和本地仓库某个文件不一致,如下命令更新本地仓库时会出现冲突:
git fech origin
git merge origin master
解决办法:
方法1:
本地另外保存一份工作区代码,然后git reset –hard更新并重置工作区,这时git pull就不会有冲突。之后将改动手动合入到工作区并提交。
方法2:
使用git stash先将工作区修改保存到缓冲区中,然后再git pull更新远程仓库到本地。之后使用git stash pop将之前的修改加入到本地,这时远程修改和本地修改混在一起,需要手动解决冲突后才能push本地的修改。
例如:
远程仓库11这个文件内容为2111,用户A先本地将其修改为3111,用户B将其修改为12111并远程提交。这时A想提交其修改,在git pull时发现了冲突:
用户A先用git stash临时保存其修改:
再git pull更新远程仓库到本地:
再git stash pop将缓存的本地修改更新到本地工作区:
这时本地工作区代码包含远程的更新和本地修改,需要手动merge后push:
(5)五种状态的撤销
Git reset 默认是 git reset –soft
Git reset 和 git revert 都是用于对本地仓库的撤销,但git reset会将之前的commit删除掉,而git revert则会新增一条新的撤销commit。
git reset 对本地的某次提交回退后,之后的提交都会删除,导致本地仓库落后于远程仓库。如果想把远程仓库也和本地一样回退并删除之后所有的提交,可以使用 git push -f 强制提交,这时远程仓库也会回退并删除掉之后的提交。
git reset 删除提交的做法是危险的,会导致某些修改从此丢失,且会将提交log删除不便于跟踪commit log。所以除非特殊情况,一般都使用git revert来回退某一个提交,它只仅仅回退指定的提交,不会对后面的提交做删除,相反会增加一条revert commit的提交记录。确认回退信息修改正确后,git push同步到远程仓库,无需强制提交。