Git
主要概念:本地库、暂存区index file、工作区working tree
提交:工作区add→暂存区commit→本地库
回退:本地库(soft)→暂存区(mix)→工作区(hard)
一、代码托管中心
内网托管:搭建gitlab服务器
外网托管:github、码云
二、本地库和远程库
2.1.团队内部开发
本地库 push 到远程库
远程库 clone 到本地库
2.2.跨团队开发
远程库A fork 到远程库B
A组把自己开发的push和clone到远程库A
B组把自己开发的push和clone到远程库B
然后远程库B pull request →审核→merge到远程库A
三、起步
3.0.建立远程连接
这里用码云作为远程仓库
3.0.1首先在码云创建一个账号
3.0.2添加一个SSH公钥(方法可以参考码云的提示)
3.0.3在git本地仓库SSH公钥
//查看本地ssh密钥命令,如果没有设置过会显示No such file or directory
$ cd ~/.ssh
$ ls
//然后会像上图那样显示
//如果没有,就来创建新的密钥,这里的email地址是码云或github的账号
$ ssh-keygen -t rsa -C "your_email@youremail.com"
Creates a new ssh key using the provided email # Generating public/private rsa key pair.
//其他系统:
Enter file in which to save the key (/home/you/.ssh/id_rsa):
//windows:
Enter file in which to save the key(/c/Users/xxx/.ssh/id_rsa):
完成后,大概是这个样子的
Your identification has been saved in /c/Users/xxx/.ssh/id_rsa.
Your public key has been saved in /c/Users/xxx/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:g0Bjal6pyev27yb6lSofUUk7CcB3zVasdLqQDfR3rzk xxxx@qq.com
The key's randomart image is:
+---[RSA 2048]----+
| .=..oo= o. |
| +.o..*o= o |
| o +. .oBo+. |
| + + . oo.+. . |
| = o S. . . |
| . . o. o |
| . . o E |
| .. + .+ . |
| ..o.O* |
+----[SHA256]-----+
3.0.4添加公钥到你的远程仓库
1、查看生成公钥
//输入命令后,显示一串SSH-RSA码,复制到github里面
$ cat ~/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDZEE8qJA8jYY7NqcoQWwjcvdQuwDG4RHWDKZzpz5bZ1byJRAQA8vxcRJ5mqrwlYcISErXUcsfqjGkLbgXJMPSR7ggwdDgEBcpBXQE+eXFIafgZfUS5ZsCkNXtKJ3RXVdAkQGb6krVUbk7Bll7N+ygyZv1iH0s6GtKlz4uNicpyUZY+lv0BewWTAy+Dm0EpFh8FAIWufhpYpY8MvPf23RaZEMSaB8hDo+Ep4bLHNM5D4SKU6eggEARQYlI3m/f8kHZm600bEoJxwsxM03Qmqcr/kbKFC/TiJWVm4UiLj1DKOiHrtYUBaqx0m0cbtb6LYjoAedtKksLmqJg/sOe0CKEz xxx@qq.com
2、设置远程仓库的SSH公钥
github:登陆你的github帐户。点击你的头像,然后 Settings -> 左栏点击 SSH and GPG keys -> 点击 New SSH key
码云:码云账户,点击你的头像,然后左侧导航栏SSH。
3、然后你复制上面的公钥内容,粘贴进“Key”文本域内。 title域,自己随便起个名字。
4、点击 Add key。
完成以后,验证下这个key是不是正常工作:
5、查看公钥能不能用
//ssh -T选项的意思为,不分配伪终端
$ ssh -T git@github.com
$ ssh -T git@gitee.com
//显示下面的字符串说明连接OK
$ Hi xxx! You've successfully authenticated, but GitHub/gitee does not provide shell access.
3.0.5.创建一个仓库
如码云提示的操作,不过因为我放git的文件夹换过位置,显示证书错误,所以要多一步操作
$ git config --global user.name "用户名"
$ git config --global user.email "xxx@xxx.com"
//把远程仓库地址赋值给origin,origin = 'https://.........'
$ git remote add origin https://gitee.com/用户名/项目名.git
//关闭证书校验
$ git config --system http.sslverify false
//更新证书位置,一般是放在git里面
$ git config --system http.sslcainfo "D:/ProgramFiles/Git/mingw64/ssl/certs/ca-bundle.crt"
//把本文件夹的git仓库推送至远程仓库
$ git push -u origin master
//第一次使用上一行的代码会让你输入码云或github账号密码。
3.0.6[可选]修改git的remote url
使用命令 git remote -v 查看你当前的 remote url
$ git remote -v
origin https://github.com/someaccount/someproject.git (fetch)
origin https://github.com/someaccount/someproject.git (push)
origin https://gitee.com/someaccount/someproject.git (fetch)
origin https://gitee.com/someaccount/someproject.git (push)
如果是以上的结果那么说明此项目是使用https协议进行访问的(如果地址是git开头则表示是git协议)
你可以登陆你的码云/github,就像本文开头的图例,你在上面可以看到你的ssh协议相应的url,类似:
复制此ssh链接,然后使用命令 git remote set-url 来调整你的url。
git remote set-url origin git@github.com:someaccount/someproject.git
然后你可以再用命令 git remote -v 查看一下,url是否已经变成了ssh地址。
然后你就可以愉快的使用git fetch, git pull , git push,再也不用输入烦人的密码了
3.0.7git保存远程地址
#查看本文件夹底下,git保存的远程仓库地址(github地址、码云地址)
$ git remote -v
#添加远程地址,别名为origin
$ git remote add origin https://github.com/someaccount/someproject.git
$ git remote add origin https://gitee.com/someaccount/someproject.git
3.0.8PUSH到远程仓库
#push master分支到origin地址
$ git push origin master
3.0.9Clone到本地仓库
#克隆到本地
$ git clone https://github.com/skyloyal/JavaProject.git
3.0.10邀请开发人员
github登陆后,在需要更多开发人员的项目底下。
3.0.11.pull到本地
#抓取master分支
$ git fetch origin master
#切换到抓取下来的master分支
$ git checkout 'origin/master'
#合并
$ git merge origin/master
#pull = fetch + merge
$ git pull origin master
3.1.基本操作
//任何项目开始都先初始化本地git仓库
$ git init
//展示文件夹内文件数目
$ ll
//创建文件夹wechat
$ mkdir wechat
3.2.设置签名
3.2.1.形式如下
用户名:XX
Email地址:XXXXX@xx.com
作用:区分不同开发人员的身份
辨析:这里设置的签名和登陆远程库(github)的账号密码没有任何关系。
3.2.2.设置签名命令
项目级别/仓库级别:仅在当前本地库范围内有效
信息保存位置:~/.gitconfig文件
设置签名
$ git config user.name XXX
$ git config user.email XXXXX@xx.com
系统用户级别:登录当前操作系统的用户范围
$ git config --global user.name XXX
$ git config --global user.email XXXXX@xx.com
优先级:就近原则,项目级别优先于系统用户级别,二者都有时,采用项目级别的签名
如果只有系统用户级别的签名,就以系统用户级别的签名为准
不允许都没有系统级或项目级签名.
3.3.提交更改
下面以新建good.txt为例子
#查看工作区、暂存区状态
$ git status
#添加到本地暂存区
$ git add
$ git add -all
#撤出本地暂存区
$ git rm --cached good.txt
#提交暂存区到本地库,提交后会去到vim编译器,要写一段注释
$ git commit
#用一条命令添加暂存区、提交
$ git commit -a
#带注释提交
$ git commit -m "it is the node" good.txt
3.4.提交记录
#显示所有提交,显示作者author、记录date、记录node,记录hash。
$ git log
#分行显示(完整)
$ git log --pretty=oneline
#分行显示(哈希值最后7位,提交注释)
$ git log oneline
#分行显示(哈希值最后7位,提交注释,head指针移动步数)
$ git reflog
3.5.版本回退
#{9a9ebe0}是提交记录的后7位哈希值,版本回退命令
$ git reset --hard 9a9ebe0
#按相对步数回退
#一步
$ git reset --hard HEAD^
#两步
$ git reset --hard HEAD^^
#三步
$ git reset --hard HEAD^^^
#回退三步
$ git reset --hard HEAD~3
3.6.删除
#删除操作
$ rm good.txt
#把操作放到暂存区
$ git add good.txt
#提交到本地库
$ git commmit -m "delete" good.txt
#如果删除了想要回来,就可以用版本回退命令恢复
3.7.比较文件差异
#将工作区中的文件和暂存区进行比较
$ git diff good.txt
#将工作区中的文件和本地库历史记录比较
$ git diff HEAD^ good.txt
#不带文件名比较多个文件
四、分支管理
刚开始的主干是master
4.0.查询分支
$ git branch -v
4.1.新建分支
#新建分支hot_fix
$ git branch hot_fix
4.2.切换分支
#切换分支hot_fix
$ git checkout hot_fix
4.3.接受分支
#在主干上,接受分支
$ git checkout master
$ git merge hot_fix
4.4.冲突的解决
第一步:编辑文件,删除特殊符号
第二步:把文件修改到满意的程度,保存
第三步:git add 文件名
第四步:git commit -m ""
五、基本原理
git的文件管理机制
git把数据看作是小型文件系统的一组快照,同一个文件,做了变化,新的文件就会包含旧文件的指针。
每一个提交对象都会有一个hash值,