Git基础知识总结
- Authors
- Name
- 小明&小艺
git 背景
听说一个项目 10%的时间是开发,剩下 90%的时间是维护。频繁的维护必然会产生不同版本的代码,所以版本控制系统应运而生。
集中化的版本控制系统:多个开发人员通过一个中心版本控制系统来记录文件版本,获取和提交都和中心版本控制系统交互。
这种方式容易产生两个问题:
- 单点故障:中央服务器宕机或磁盘损坏了就 GG 了
- 必须联网:受网络状况、带宽影响
对此,有了分布式版本控制系统。每个客户端都存储整个代码仓库的镜像,个人直接跟本地的仓库交互,完了之后再跟远程仓库同步。这样即使无网络也可以本地工作,有需要时再推送到远程服务器。而服务器仓库出问题时,也可以根据客户机仓库进行还原。
需要提到的是 git 对文件的处理跟 svn 有比较大的差异:常规的版本控制以文件变更列表的方式存储版本变化,而 git 是以数据变更的方式存储版本变化。即添加一个文件之后,git 会把每次更新用变化量来记录,将所有变化量求和就是当前最新的版本。为了避免频繁比较和合并的性能消耗,git 会生成文件快照,通过对快照操作来避免回溯。
git 基本知识
验证方式
Git 支持 Http 协议和 SSH 协议,这里主要说一下 SSH 协议,其支持用户名密码验证方式及基于秘钥的验证方式。
密码验证方式如下:
- 当客户端发起 ssh 请求,服务器会把自己的公钥发送给用户;
- 用户会根据服务器发来的公钥对密码进行加密;
- 加密后的信息回传给服务器,服务器用自己的私钥解密,如果密码正确,则用户登录成功
基于密钥的登录方式如下:
- 首先在客户端生成一对密钥(ssh-keygen);
- 并将客户端的公钥 ssh-copy-id 拷贝到服务端;
- 当客户端再次发送一个连接请求,包括 ip、用户名;
- 服务端得到客户端的请求后,会到 authorized_keys 中查找,如果有响应的 IP 和用户,就会随机生成一个字符串,例如:qwer;
- 服务端将使用客户端拷贝过来的公钥进行加密,然后发送给客户端;
- 得到服务端发来的消息后,客户端会使用私钥进行解密,然后将解密后的字符串发送给服务端;
- 服务端接受到客户端发来的字符串后,跟之前的字符串进行对比,如果一致,就允许免密码登录。
ssh-keygen -t rsa -C "xxxx@xxxx.com"
状态说明
Git 有三种状态,你的文件可能处于其中之一:
- 已提交(committed):数据已经安全的保存在本地数据库中。
- 已修改(modified):已修改表示修改了文件,但还没保存到数据库中。
- 已暂存(staged):表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中。
由此引入 Git 项目的三个工作区域的概念:Git 仓库(.git directoty)、工作目录(Working Directory) 以及 暂存区域(Staging Area) 。
基本的 Git 工作流程如下:
- 在工作目录中修改文件。
- 暂存文件,将文件的快照放入暂存区域。
- 提交更新,找到暂存区域的文件,将快照永久性存储到 Git 仓库目录。
常规使用
仓库初始化
- 在现有目录中初始化: 进入项目目录运行
git init
命令 - 克隆一个现有的 Git 仓库:
git clone [url]
本地仓库交互
git status // 查看当前仓库状态(冲突、暂存文件等)
git add * // 可指定文件或者某一类文件
git commit -m "代码提交备注" // 提交到本地仓库
git commit -a -m // 自动把所有已经跟踪过的文件暂存起来一并提交
git rm filename // 从暂存区域移除
git mv README.md README // 对文件重命名
git log --author=bob // 看某个人的提交记录
git commit --amend // 尝试重新提交
git checkout -- filename // 撤消对文件的修改
.gitignore 文件记录了需要忽略的文件或者目录
强制回滚到最新版本:
git fetch origin
git reset --hard origin/master
撤销操作:最终你只会有一个提交,第二次提交将代替第一次提交的结果
git commit -m 'initial commit'
git add forgotten_file
git commit --amend
远程仓库交互
- 本地仓库连接到某个远端仓库
git remote add origin <server>
- 本地仓库提交到远端仓库
git push origin master
,master 也可以替换成别的分支名称 - 移除远程仓库
git remote rm test1
- 将 test 重命名位 test1
git remote rename test test1
分支
git branch test // 创建分支
git checkout test // 切换分支
git checkout -b bugfix // 创建并切换分支
git merge test // 合并分支
git branch -d feature_x // 删除分支
来源: