Git基础知识总结

Authors
  • avatar
    Name
    小明&小艺
    Twitter

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 重命名位 test1git remote rename test test1
分支
git branch test // 创建分支

git checkout test   // 切换分支

git checkout -b bugfix  // 创建并切换分支

git merge test  // 合并分支

git branch -d feature_x // 删除分支

来源:

https://git-scm.com/book/zh/v2

https://backlog.com/git-tutorial/cn/intro/intro1_1.html