目录
前言
git 是一种版本控制系统,是一个命令,是一种工具。用了一段时间的Git,颇有感触记录一下,以便以后查阅学习,开放讨论才有新的领悟。
版本管理软件的发展和区别
了解一个物种的发展,就要了解它的历史,所有技术的迭代见证了人类智慧的发展。版本管理软件的发展可以分为三种系统,前后为CVS、SVN、再到git都是版本控制系统,它们被用来管理代码、文档和任何其他类型的数据。知道这些吹吹水就够啦~
下面是ChatGpt给出的关于CVS和SVN的一些基本信息,了解一下,毕竟我用的git。。。:
CVS(Concurrent Version System):
- CVS最早的版本是在1980年,CVS的客户端和服务端都是用pserver方式进行通信的,这个pserver是cvs服务器的一个守护进程。
- CVS是最早的版本控制系统,最初是为 diff 和 patch 设计的,而不是为复杂的分支和标签设计的。
- CVS只支持ASCII字符集,不支持中文。
- CVS使用的是基于文件系统的版本控制方法,而不是基于数据库的。
- CVS只能支持最多两个人的并发访问,不支持多用户并发访问。
SVN(Subversion):
- SVN是CVS的替代品,它是由CollabNet于2000年创建的。
- SVN使用的是基于数据库的版本控制方法。
- SVN支持大文件和二进制文件,支持多用户并发访问。
- SVN可以支持基于HTTP协议的客户端/服务器访问,也可以支持基于文件协议的客户端/服务器访问。
- SVN使用的是原子提交,即所有的更改要么全部提交,要么全部不提交,不会出现中间状态。
- SVN支持分支(branch)、标签(tag)和合并(merge)等高级功能。
总之,CVS和SVN都是版本控制系统,用于管理代码、文档和其他类型的数据。SVN是在CVS的基础上发展起来的,它提供了更多的功能和更好的性能。
综上,我们其实可以研究SVN和Git就行,毕竟CSV有点古老了,版本管理软件我们主要知道他们的思想和共性,基本都能很快上手使用。这里不得不提到他们最大的不同点集中式版本控制和分布式版本控制。
集中式版本控制系统和分布式版本控制系统
1、集中式版本控制系统是指版本库集中存放在一个中央服务器中,我们需要在自己电脑上通过连接中央服务器,从而把代码clone到本地,或者把自己电脑上的代码提交到中央服务器,如果中央服务器被炸毁了,那么所有的版本库都没了。在工作中,公司一般都有一个SVN服务器,也就是版本控制系统,大家在自己电脑上通过TortoiseSVN客户端连接svn服务器,从而进行相应的版本库的操作。类似于这样:
感兴趣的小伙伴可以看下下面这篇:
【网络学习】对TortoiseSVN的基本了解及简单操作_沉默的小宇宙的博客-CSDN博客
2、分布式版本控制系统没有所谓的“中央服务器”,每个人的电脑上都可以安装一个版本控制系统,自己写的代码提交到自己电脑上的版本库中;如果不进行多人协作,自己电脑的版本库就可以管理了。如果进行多人协作,那就建立一台中央服务器,每个人把自己电脑上版本库和中央服务器建立通信,但这个中央服务器的作用仅仅是用来方便“交换”大家的修改,在大家不相互协作的情况下,没有它大家也一样干活,如果中央服务器有一天被人炸了也没关系,因为我们每个人的电脑上都有一个完整的版本库。现在流行的github(外国的)、gitee(中国的码云)都是开放的中央服务器,公司内部还可以使用gitlab来自己搭建中央服务器。就像下面这样:
其实可以看出,无论是SVN还是git,在进行单人作战时,区别是不大,但是多人作战时,或者使用需要远程做版本管理时,区别就很大,一个是诸侯国,皇帝死了都没关系,大家的领土还是该干嘛干嘛。一个是中央高度集权,皇帝死了就天下大乱了,因为版本库都没有了,每个人只有一份保存在本地的文件,啥都不是。。。
git初体验--下载安装、一丢丢基本操作
下载安装
这里以WIN为例,下载链接:Git for windows
安装的时候选择它
鼠标右键会出现
我们一般使用Bash,就可以了,命令行输入杆菌又微生,只有在对比前后差异和上传代码想直观的看看自己做了什么事,才会用GUI,不过也是用指令调用的,后面继续写。。。
注册用户
命令:git config --global user.name "xxx"(xxx可以随意)
git config --global user.email "email@example.com"
这个主要是让远程仓库知道是谁上传的,如果你只是本地玩一玩可以不用,但还是建立搞一搞。。。
操作文件夹
Bash操作文件夹的方式和使用DOS差不多,基本就是cd,rm这些,这里不多赘述,自己需要去百度,主要关注下面的两句
暂存区直接删除 git rm --cached
将某个文件撤回工作区 git restore --staged filename
建远程仓
建远程仓具体看是用的哪个一个远程服务器,每个门户的建仓方式大同小异,找到按钮点点点就完事了。下面以gitee码云为例,支持中文好理解。
最后点击创建就OK了,剩下的就是对着仓库装装修,设置成你喜欢的样子~
配置SSH key
拉取代码有两种方式:
1)直接使用https url克隆到本地
2)使用SSH url克隆到本地
是不是感觉一样,No No,当你使用了http方式之后,每次fetch和push都需要输入账号和密码。但是使用SSH方式,只要用之前配置和添加好SSH key,在这台电脑上,你不用每次都输入账号和密码。
那么如何设置呢?就四步,查看SSH key,创建SSH key,添加SSH key到远程仓,测试SSH key。
查看SSH Key: ~/.ssh 或者 ~/.ssh ls
创建SSH Key:
ssh-keygen -t rsa -C "你的邮箱"
OPENSSH8.8弃用了RSA算法,改用ed25519,此时出现无法链接的情况
改用 ssh-keygen -t ed25519 -C "你的邮箱" 注册。
输入后,开始提示
Generating public/private rsa key pair.
Enter file in which to save the key (/c/Users/16627/.ssh/id_rsa):
这是让我们输入文件名,保存SSH Key代码。为了避免麻烦,我们不输入,直接回车,生成默认的id_rsa和id_rsa.pub两个密钥文件。
Created directory ‘/c/Users/16627/.ssh’.
Enter passphrase (empty for no passphrase):
这是要我们输入密码,不是国家机密,直接无视,回车。
Enter same passphrase again:
继续回车~
Your identification has been saved in /c/Users/…/.ssh/id_rsa
Your public key has been saved in /c/Users/…/.ssh/id_rsa.pub
提示这个就是成功了!
接下来就是用~/.ssh看下密钥路径,然后打开复制id_rsa.pub文件的全部内容,然后复制到git远程仓的SSH Key下,收到成功建立就可以了。同样的密钥可以用于其他github这些网站。
添加SSH key到远程仓:
测试下SSH Key: ssh -T git@gitee.com
提示
Hi “用户名”! You’ve successfully authenticated, but GitHub does not provide shell access.
设置成功!
至此我们已经成功链接上远程仓库,接下来只要初始化本地仓库,然后卡卡操作就可以了。
常用指令收集
初始化仓库
git init
添加远程仓库
git remote add origin git@xxxx(SSH内容) --添加远程分支,本地名称为origin也可以是其他的名字如branch 那就是 git remote add branch git@xxxx(SSH内容)
查看本地分支链接了哪些远程分支
git remote -v
创建分支
git branch "name"
查看分支
git branch / git branch --al
绑定远程项目分支,不然上传和下载要指定分支
git branch --set-upstream-to=origin/远程分支名 本地分支名 (绑定远程分支origin到本地master分支)
OS:按git branch "name"、git branch --set-upstream-to=origin/master两步来创建分支,个人感觉可以节省很多事情,不要懒哈哈哈。
切换工作分支
git checkout xxx(分支名) / git checkout ID(切换到分支 ID是需要的代码的编号)
一步到位 :git checkout -b xxx(本地分支) 创建并切换至xxx分支
查看提交记录
git log
查看具体修改
git show commit的hash值
查看指定文件的修改历史
git log --pretty=oneline 文件名
查看某个文件某几行的修改历史
git blame -L 158,180 (开始行,结束行) "xxx"(文件的绝对路径)
重置
git reset --soft ID号 重置git commit
--mixed ID号 重置 git commit 和 git add
--hard ID号 重置git commit 和 git add 和 工作副本的修改
查看当前状态
git status
更新远程端代码
git fetch origin
添加新文件和编辑过的文件不包括删除的文件
git add xxx 表示添加新文件和编辑过的文件不包括删除的文件
git add -A 表示添加所有内容
git add -u 表示添加编辑或者删除的文件,不包括新添加的文件
提交代码
git commit -m "[RVC][fix][t22|t1j:修改倒车轨迹线位置不对的问题][BUGXXXXX|ALM1234][建议查看轨迹线是否被异常拉伸]" 提交备注
git commit --amend 撤回之前的commit,进入编辑界面,按“i”进行编辑模式,按“shift+:”进入命令模式然后按“q”或者“wq”直接退出编辑或者保存更改后退出编辑
git commit --amend --no-edit 撤回之前的提交,用于合并两次修改
git commit --amend -m "新的commend" 修改前面的commit的commend
提交远程仓库
git push origin head:refs/for/xxx (提交到对应的分支且需要审核)
git push origin head:refs/heads/xxx (提交到对应的分支且需要审核)
下拉代码
git pull origin xxx 下拉代码到指定的本地分支,上述命令其实相当于 git fetch 和 git merge
git pull origin xxx --rebase 下拉代码,将两个分支融合为一个线性的提交,不会形成新的节点,方便追溯
git pull 下拉代码,前提是已经有分支绑定,git pull --rebase 同理
暂存区操作
git stash save "备注内容" 暂存未提交工作区
git stash list
git stash pop
git stash clear 清空暂存列表
git stash apply 将缓存堆栈中的stash多次应用到工作目录中,但并不删除stash拷贝
git stash apply stash@{0} 指定使用哪一个stash
git stash drop stash@{0} 删除第一个暂存
git stash show -p 查看stash区的修改内容
git stash show -p stash@{x} 查看具体哪一笔暂存
拉取代码
git fetch origin master 获取origin主机的master分支,记得之前已经用过这条指令--git remote add origin git@xxxx(SSH内容)
或者 git fetch git@xxxx(SSH内容) master
git fetch -all 从一个远程仓库同时获取所有分支
git fetch origin 添加更新的内容到本地仓库
合并代码merge指令
git merge origin master git merge后面可以跟很多个分支,这句话的意思是将远程分支master在本地的副本以及本地分支master合并到当前分支
git merge origin/master 将origin上的master分支merge到当前分支
git merge --abort 遇到冲突,取消合并
git rebase master 一样是合并到merge到master,区别就是它会合并出来的更加简洁
合并代码rebase指令
git rebase --skip 冲突跳过
git rebase --continue 解决冲突,继续合并
合并提交到同个仓库的其他分支:
git cherry-pick [commit id] 将对应的commit id合并到当前分支
git cherry-pick -x [commit id] 保留原始作者信息并合并
git cherry-pick [star commit id]...[end commit id] 批量合并,但是不包含star commit id
git cherry-pick [star commit id]^...[end commit id] 批量合并,但是包含star commit id
打开帮助文档
git stash --help 上官网查看stash指令的帮助文档
git stash -h 查看stash指令的帮助文档
常用的提交修改的格式&注释说明
常用格式
[scope][type][project1|project2:subject][id][test suggestion]
备注:project1|project2 分别表示具体的项目名,表示此修改会影响到的项目范围,项目间以"|"分割,最后以":"符号结束。
示例一: [RVC][fix][t22|t1j:修改倒车轨迹线位置不对的问题][BUGXXXXX|ALM1234][建议查看轨迹线是否被异常拉伸]
示例二: [RVC][test][增加倒车轨迹线自测界面功能][No ID][NA]
注释说明
小结
git的使用主要还是实践,遇到啥问题就搜啥,慢慢积累,与坑填坑,熟能生巧