Mac下git使用以及遇到的一些问题
前言
最近换工作,需要重新装一波环境,一共整理了三篇文章以作记录,本文为其一,gitlab(git)篇
目的(本文涉及内容)
- mac 下 git 使用(问题1)
- gitlab 简介
- 使用git ssh方式获取项目(问题2)
- git常用命令(问题3)
步骤 && 问题
1、mac 下 git 使用
问题1:git使用 和 不安装xcode安装命令行工具
初次运行git
命令,可能会遇到active developer path(xxx) does not exist
的错误,其实这个提示下面已经给出了问题解决方式
use `xcode-select --switch path/to/Xcode.app`
to specify the Xcode that you wish to use for command line
developer tools (or see `man xcode-select`)
意思是,使用git需要命令行工具,而xcode中是包含这个工具的,有的搜到的文章就会告诉我们安装xcode来解决这个问题,其实没有必要,只需要使用下面的命令即可,会有弹窗,不过看清文字就好了
xcode-select --install
2、gitlab 简介
GitLab 是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的web服务。安装方法是参考GitLab在GitHub上的Wiki页面。(转自百度百科)
3、使用git ssh方式获取项目
gitlab注册之类的肯定不用说的,一般也就是用的公司给分配好的账号,
下面主要说下项目的下载(clone),有http 和 ssh两种形式的链接,http形式一般没什么问题,而ssh形式则有坑
首先说一下ssh方式的配置
ssh方式的配置
- (1)、设置Git的user name和email:(如果是第一次的话)
$ git config --global user.name "xxx"
$ git config --global user.email "xxx@xx.xx"
- (2)、生成密钥
$ ssh-keygen -t rsa -C "xxx@xx.xx"
连续3个回车。如果不需要密码的话。
最后得到了两个文件:id_rsa
和id_rsa.pub
。
- (3)、添加密钥到ssh-agent
确保 ssh-agent 是可用的。ssh-agent是一种控制用来保存公钥身份验证所使用的私钥的程序,其实ssh-agent就是一个密钥管理器,运行ssh-agent以后,使用ssh-add将私钥交给ssh-agent保管,其他程序需要身份验证的时候可以将验证申请交给ssh-agent来完成整个认证过程。
# start the ssh-agent in the background
$ eval "$(ssh-agent -s)"
添加生成的 SSH key 到 ssh-agent。
$ ssh-add ~/.ssh/id_rsa
- (4)、登陆Github, 添加 ssh 。
把id_rsa.pub
文件里的内容复制到ssh key中。
如此之后,执行ssh方式的 clone,依然失败,于是,这里是问题2
问题2:无法使用ssh方式下载项目
如下是问题文本
Cloning into 'XXX'...
Unable to negotiate with xxx.xxx.xxx.xxx port 22: no matching host key type found. Their offer: ssh-dss
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
项目并不存在是一定的,看来主要就是access rights
的问题了
no matching host key type found. Their offer: ssh-dss
,这个提示其实给出了答案了,服务器的key没有匹配到,但是他们提供了ssh-dss。
这个链接中是来自Stack Overflow的解决方案:
https://stackoverflow.com/questions/34208495/unable-to-negotiate-with-xx-xxx-xx-xx-no-matching-host-key-type-found-their-of
我来翻译下就是,现在的openssh默认是拒绝DSA验证的。DSA是什么呢,简单来说,DSA是一种签名与验证的算法,和大家熟悉的RSA加密解密过程相反,在DSA数字签名和认证中,发送者使用自己的私钥对文件或消息进行签名,接受者收到消息后使用发送者的公钥来验证签名的真实性。DSA只是一种算法,和RSA不同之处在于它不能用作加密和解密,也不能进行密钥交换,只用于签名,它比RSA要快很多。这也就决定了它不够安全,被拒绝也是可以理解,那么,如何解决?
有两个解决方法
- 其一,在
~/.ssh/config
文件中添加下面的代码,文件不存在就新建一个,主要是制定ssh链接时候使用的host key算法。
Host your-remote-host
# 为了方便可以直接使用 Host *
HostkeyAlgorithms +ssh-dss
- 其二,通过如下方式,在每次使用ssh方式clone项目时制定算法
GIT_SSH_COMMAND="ssh -oHostKeyAlgorithms=+ssh-dss" git clone git@git.xxx.com:xxx/xxx.git
我选用的是第一种方式,然后担心会对其他ssh有影响,所以用自己的个人服务器验证了下 ssh root@xxx.xxx.xxx.xxx
,没有问题,开心完结此问题。
4、问题3:git 常用命令
- 初始化本地仓库
git init
本地仓库分为:暂缓区 和 master分支 - 将本地代码添加到暂缓区
git add .
- 将暂缓区代码提交到master分支
git commit
- 给本地代码仓库和远程代码仓库添加关联 ,查看关联
git remote
添加关联:git remote add origin xxxurl
- 将本地代码上传到远程代码仓库
git push origin master
- 给本地代码打个标签
git tag -a ‘0.0.1’ -m ‘标签描述’
将本地标签推送到远程代码仓库git push --tags
- 删除本地标签/删除远程标签
git tag -d 0.0.1
/git push origin --delete 0.0.1
- 精准拉取指定的某一个版本
git fetch origin tag V1.2
- 查看代码状态 ,红色表示在工作区间,绿色表示在暂缓区
git status
- 查看分支
git branch
;我想列出所有分支,并且在后边列出分支的最后提交内容git branch -av
;创建分支git branch 分支1
;切换分支git checkout 分支1
;分支比较git diff master 分支1
;分支合并,首先换回主分支git merge 分支1
;删除分支git branch -d 分支1
- 我想比较工作区与暂存区的差异直接使用
git diff
就可以了,此处会列举出所有的不同;假设我们只想看某个文件,工作区与暂存区的差异;直接使用git diff -- 文件名
总结
git命令在之前的工作中并没有用过,只是自己玩过,所以还是有很多需要学习的,尤其对于一些高敏感操作,删除,合并等,切记需要谨慎小心。加油!
参考文章
https://blog.csdn.net/xunxianren007/article/details/54021499
https://blog.csdn.net/maindek/article/details/53893718
https://www.cnblogs.com/ldq2016/p/7418206.html
https://stackoverflow.com/questions/34208495/unable-to-negotiate-with-xx-xxx-xx-xx-no-matching-host-key-type-found-their-of
https://blog.csdn.net/LuckyStar_D/article/details/51319136
https://blog.csdn.net/yinqiangqiang/article/details/79000459
https://blog.csdn.net/ppby2002/article/details/38456045
https://blog.csdn.net/gzyzwx/article/details/81234993
https://www.cnblogs.com/ShaYeBlog/p/5576601.html
欢迎大家关注我的公众号
半亩房顶