一. 快速了解Git
1.1什么是git
Git是一个免费开源的分布式版本控制软件,用以快速高效的处理从小型到大型项目的版本控制
1.1.1 软件
git类似常见的软件如qq, 微信等软件,需要下载到电脑中进行使用
1.1.2 版本控制
1.1.2.1版本控制的发展史
-
同一个文件创建多个版本,产生多个文件
-
本地存档,只有一个文件,但有多个版本
-
集中式的版本控制
-
分布式的版本控制
1.1.2.2为什么做版本控制
通过版本控制可以很好的实现对版本之间的切换,如在线上出现问题时排查问题代码
1.1.3 分布式
分布式相对于集中式去除了中心化,在集中式中每个客户端只能拿到一个版本,而分布式则可以拿到多个甚至全部的版本
集中式只能将某次的修改提交到服务端,分布式可以在本地进行提交,然后将多个提交统一提交到远端
1.2 安装Git
git的安装主要有针对Linux, Win或者Mac系统,通过百度可以很简单的安装到本地,通过如下命令查看本地git版本
git --version
1.3 配置文件&初始化git
1.3.1 初始化git
在第一次运行git,我们主要设置用户名和邮箱,操作如下
git config --global user.name "kunmzhao"
git config --global user.email "xxxxx@qq.com"
# 查看配置是否成功
git config --list
1.3.2 配置文件
在git 中有2个权限文件
-
当前项目配置文件
配置文件路径为: git 项目的中.git文件下的config文件
该配置只对当前项目生效
-
全局配置文件
配置文件路径为 ~/.gitconfig
该配置对所有的项目生效
在上述添加用户名和密码中的
--globa
l就是添加到全局配置文件中, 如果改成--loca
就会添加到本项目配置文件中1.3.3 配置文件&应用场景
1.4 免密登陆
在后面的讲述中,我们可能需要将本地的代码推送到远端(例如GitHub),但是每次推送都会输入用户名和密码,这会很麻烦的
1.4.1 SSH密钥
通过这种方式就可以通过SSH的方式进行git远端的操作
-
在本地电脑生成公钥
终端输入命令ssh-keygen # 然后一直点击回车键
-
找到生成的公钥
在目录下找到该公钥
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDF6fXa8gnZN0SY+raGmQFhbEzvyMFqhkpe7JM6O11dZ/9H6W7d9sUphhPMRFEAart4BU70xZ0Ww6pHENhhZRWxmIa0od1uTtKC+bGKII2bcoJDfO8UQqUEeOjFsnlg1ulRKxM4l9L$0IVtKUIo0kKKgHw5SZbKHM8F+x1X1++KjuVepls5Cibu3Y9Cft1BnIabvVdTjUMllpG0w5FKS1eNFbtl77XFOMRB60IXz6BfnlJZkEVhDMpIpQd0kw3K5/yCnEF+eN6UDw1IPUrGivqUvQEeUMiXpbFUGJeZQxXIDIo13l+tUTWmqcQoxalC9WEW6DWbgmn1eytJFsrlPf1KNzNS6bFHx9WX06zYQz8pvau2Os6RbcyrTVNNe9dHXmtk9cAId7OsMhPsq+oWsPeoypIqpJGbFYuH3jjz/cJ45x6ehvFipXnRlmYewX1td+UDIavbMQ7LJx2mV2EuMsYGfx6w87cRDchxlLB1GUf9vBiVtzeTJ8056cL3+7YEF4ljU= kunmzhao@kunmzhaodeMacBook-Pro.local
-
将公钥拷贝到github中添加
1.4.2 token
该方式针对https方式下载的代码,下载之后在推送代码的时候需要输入用户名和密码,并且使用用户密码是无法登陆的
-
打开GitHub,生成token
-
将生成的token在登陆的时候作为密码进行验证
1.5 gitignore忽略文件
有时候我们不希望将项目中产生的中间文件进行git管理,可以通过.gitignore文件进行管控
-
在本地项目创建.gitignore文件
-
将需要忽略的文件写入该文件中即可
a.h *.o file/ !a.h
-
可以在在github中搜索gitignore,找到对应语言的gitignore
1.6 简单使用
-
初始化git库
git init
-
克隆git仓库
git clone git@github.com:kunmzhao/dbhot.git
-
在本地添加远程仓地址
git remote add git@github.com:kunmzhao/dbhot.git
-
查看文件夹下所有文件的状态
git status
-
将新增文件或者修改的文件加入到git中进行管理
git add 文件名 git add . (管理 当前文件夹中未管理的所有文件)
-
将文件提交到本地
git commit -m "描述性信息"
tip:三种状态的变化
-
查看提交记录
# 查看所有的提交记录 git log # 将提交记录简化为一行显示 git log --oneline # 美化显示log git log --pretty=oneline --graphy # 显示详情操作记录 git reflog
-
查看修改
# 查看工作区做的修改 git diff # 查看暂存区相对版本区做的修改 git diff --cached # 查看两个版本之间的修改 git diff commitID1 commitID2
二. Git的本地操作
2.1 Git的三大区域
- 工作区:程序员工作的目录
- 暂存区:缓存区
- 版本区:版本控制
2.2 回滚
-
工作区回滚
git checkout x.py git clean -df ```![<img src="picture/image-20220503193117913.png" alt="image-20220503193117913" style="zoom:50%;" />](https://img-blog.csdnimg.cn/e4366903356a440595a9be5b58769ac2.png)
-
暂存区回滚
```shell
git reset HEAD x.py -
版本区回滚
-
版本区回滚到暂存区
-
版本区回滚到工作区(红色)
-
版本区回滚到工作区(透明色)
git reflog --(查看回滚的版本号) git reset --hard (回滚的版本号) --> 回滚到之前回滚的状态
-
2.3 分支
分支中每一个节点保留着相对上一个节点改变的内容,分支在git中是非常重要的,环境隔离使得多人协同开发称为可能
-
查看分支
# 查看本地分支 git branch --list # 查看包括远程的所有分支 git branch --all # 产看分支包括跟踪分支 git branch -vv
-
创建分支
git branch 分支名
-
切换分支
git checkout 分支名 # 在创建分支的同时切换分支 git checkout -b 分支名
-
删除分支
# 删除分支,该分支没有为合并的提交 git branch -d 分支名 # 删除分支,有未合并的分支也会删除 git branch -D 分支名 注意:删除一个分支的时候,必须切换到另外一个分支上
-
合并分支
# 将分支合并到当前分支 git merge 分支名 注意:先切换到要合并到的分支上去,再合并指定分支
2.4 冲突
冲突是在两个分支(要合并的)对同一个文件的同一行内容作了修改而产生的
解决办法如下:
- 找到产生冲突的文件中的冲突代码
- 决定保留哪一个分支的代码行,删除其他冲突代码
- 重新合并代码
2.4.1 快速解决冲突
2.5 变基
rebase可以将git的提交记录变得简洁
-
合并多个提交记录
现状:希望将前三条记录合并为一条
git rebase -i HEAD~3
将上图修改为下图:
然后重新添加修改记录
最后结果如下图:
- 分支合并
我们在合并分支时log会出现如下情况
如果在合并分支的时候希望主分支上仍是一条直线,可以用rebase代替merge,如下
通过rebase可以节省一次提交记录
3.如果忘记提交代代码
注意:在rebase中也是可能产生冲突的,解决方法如上所述
三. GitHub远程仓
远程仓可以理解为某一个存放代码的服务器,市面上常见的有GitHub和GitLab等
我们以GitHub为例,学习一下自己创建远程仓
-
注册账号
-
创建仓库
-
推送本地代码到远程仓库
假如你本地已经有了一些代码,你希望上传到远程仓库
-
初始化代码目录:在本地代码目录的最外层执行
git init
-
配置git
# 创建用户名和邮箱 git config --global user.name "xxx" git config --global user.email "xxx" # 添加远程仓 git remote add origin git@github.com:kunmzhao/mytest.git
-
将本地代码推送到远程仓库
git push origin 分支名 # 完整命令 # 通常省略remote branchName,与local branchName 同名 # remoteName为我们一开始为远程仓配置的名字origin git push <remoteName> <local branchName>:<remote branchName>
-
-
下载代码到本地
假如你希望从远程克隆代码-
本地创建文件夹并初始化
git init
-
克隆代码
git clone git@github.com:kunmzhao/mytest.git
-
配置git
# 创建用户名和邮箱 git config --global user.name "xxx" git config --global user.email "xxx" # 添加远程仓 git remote add origin git@github.com:kunmzhao/mytest.git
-
四. Git远程操作
-
推送代码
# 如果远程分支不存在就创建 git push 远程仓名字(origin) 本地分支名字:远程分支名字 # 如果希望远程分支和本地分支同名,命令如下 git push 远程仓名字(origin) 本地分支名字 # 如果希望将远程仓可本地仓建立联系,使得以后推送代码和拉去代码更简单 git branch -u 远端分支名字 # 可看跟踪分支情况 git branch -vv # 以后将本地分支推动到远端,命令如下 git push # 如果你想在本地创建一个分支跟踪远端的分支,命令如下 git checkout -b 分支名 远端分支名字
-
拉取代码
# 方式一:下载远程代码但不合并版本区的代码 # 将所有的远端分支进行更新 git fetch # 将远端分支和本地分支合并 git merge # 方式二: 下载远程代码并合并版本区代码 git pull
五. 提交开源项目代码
-
在github上找到开源项目
-
fork到自己账户下
-
在本地进行操作
-
Pull request到项目上去
六. github任务管理相关
1.issues:文档以及任务管理
2.wiki:项目文档
七. 补充
-
追溯历史
# 文件的创建日期,创建人等信息 git blame 文件名 # 追溯某n1-n2之间的代码 git blame -L n1,n2 文件名
-
堆栈保存
# 将本分支未提交的内容先缓存起来,后续再次恢复,常用在需要切换分支时使用 # 保存 git stash # 查看保存 git stash list # 恢复缓存 git stash pop