git 学习笔记

一、 git是什么?

分布式版本控制工具。

二、 什么是版本控制?

用来管理代码的版本迭代。个人开发需要不断的改进和迭代(记录每一次的历史记录状态,可以回退撤销操作,可以更自由地进行多种方法的探索,更高效),团队内部开发需要不断协作(团队多个人开发同一个类,同时改变了这个类上传,普通的文件服务器不能管理文件内容,后面上传会覆盖掉前面上传的,不利于团队开发协作),这样的需求由版本控制工具来满足。

  • 版本控制应该满足什么功能?

  1. 协同修改
    多人并行互不影响的修改同一文件。
  2. 数据备份
    不仅保存目录和文件的当前状态,还能保存每一个提交过的历史状态。
  3. 版本管理
    在保存每一个版本的文件信息时要做到不保存重复数据,以节约存储空间,提高运行效率。这方面SVN采用的是增量式管理的方式,而git采取文件系统管理快照的方式。
  4. 权限控制
    对团队中参与开发的人员进行权限控制。
    对团队外开发者贡献的代码进行审核--git独存。
  5. 历史记录
    查看修改人、修改时间、修改内容、日志信息。
    将本地文件恢复到某一个历史状态。
  6. 分支管理
    允许开发团队在工作过程中多条生产线(对应不同的功能、bug修复、新思路的 尝试等)同时推进任务,进一步提高效率。
  • 版本控制工具
    集中式:CVS、SVN、VSS...
    工作方式:每一个开发人员是一个客户端,文件和版本信息存储在服务器上,和服务器进行交互。缺点是服务器宕机,所有的历史数据丢失,本地只保存了当前的状态,重新上传到服务器也只有当前版本信息,这种问题叫“单点故障”。
    分布式:git...
    工作方式:每一个开发人员在自己本地进行完整的版本控制,本地有提交过的所有历史版本。
  • git的优势

  1. 大部分操作在本地完成,不需要联网。
  2. 完整性保证。(hash算法,每一个操作有一个hash保存,只要hash值不变就代表保存的历史数据不变)。
  3. 尽可能添加数据而不是删除或修改数据。
  4. 分支操作非常快捷流畅(内部以快照方式管理文件)。
  5. 与Linux命令全面兼容。

三、git详细了解

3.1 git的结构

工作区-->暂存区-->本地库
工作区:写代码。
暂存区:临时存储要提交的代码。
本地库:存储每一个历史的版本。

3.2 git和github

github是git的代码托管中心。

代码托管中心任务是维护远程库。

常见的代码托管中心:
局域网:gitlab服务器
外网:github、码云

3.3 本地库和远程库

  • 团队内协作
  • 跨团队协作

3.4 git的命令行操作

1. 本地库操作

1.1 本地库初始化
命令:git init
结果:生成一个.git隐藏文件。存放本地库相关的子目录和文件,不要胡乱修改。
1.2 基本操作
设置签名
形式:
用户名:Tom
Email地址:good@qq.com
作用是为了区分不同的开发人员。
注意:与登录代码托管中心的用户名和密码没有关系。
命令:
项目/仓库级别:仅在当前本地库范围内有效。
git config user.name tom
git config user.email good@qq.com
信息保存在:./git/config
系统用户级别:登录当前操作系统的用户范围。
git config --global user.name tom
git config --global user.email good@qq.com
信息保存在:~/.gitconfig
注意:项目级别生效就不会使用系统用户级别的签名(就近原则)。二者都没有不允许。
添加提交以及查看状态操作

  1. 状态查看操作
    git status:工作区、暂存区的状态
  2. 添加操作
    git add [file name]:将工作区的“新建/修改”添加到暂存区。
  3. 提交操作
    git commit -m '提交信息' [file name]:提交暂存区的内容到本地库。
  4. 查看历史记录
    git log
    当提交版本日志太多时:
    git log --pretty=oneline
    git log --oneline
    git reflog
  5. 回退前进操作
    基于索引值(推荐):git reset --hard [索引值]
    使用^:(只能后退)git reset --hard HEAD**。几个符号代表后退几步。
    使用~:(只能后退)
    git reset --hard HEAD~3**代表后退3步。
    5.1 reset命令三个参数对比:hard、soft、mixed
    hard:在本地库移动HEAD指针,重置暂存区和缓存区。
    soft:仅在本地库移动HEAD指针。
    mixed:在本地库移动HEAD指针,重置暂存区。
  6. 找回删除的文件
    前提:删除前,文件存在时的状态提交到了本地库。
    操作:git reset --hard [指针位置]
    指针位置是历史记录(删除操作已经提交到本地库)或当前位置(删除操作尚未提交到本地库,指针位置可使用HEAD)
  7. 比较文件差异
    git diff [文件名]:将工作区的文件和暂存区的文件比较
    git diff HEAD [文件名]/git diff [本地库历史版本][文件名]:将工作区文件和本地库历史记录比较。
    不带文件名比较多个文件。
    1.3分支管理
    什么是分支
    在版本控制过程中,使用多条线同时推进多个任务。
    分支的好处
    同时并行推进多个功能开发,提高开发效率。
    各个分支在开发过程中,如果某一个分支开发失败,不会对其他分支有任何影响,失败的分支删除重新开始即可。
    分支的具体操作
  8. 创建分支:**git branch [分支名]
  9. 查看分支:git branch -v
  10. 切换分支:git checkout [分支名]
  11. 合并分支:
    第一步:切换到接受修改的分支(被合并,增加新内容)上。git checkout [分支名]
    第二步:执行merge命令。git merge [有新内容分支]
  12. 解决冲突
    为什么会有冲突:当有两个分支对同一个文件进行修改的时候,分支不能自动合并,需要我们手动操作解决冲突。
    步骤:
    第一步:编辑合并冲突的文件,删除特殊符号。
    第二步:把文件修改到满意程度,保存退出。
    第三步:git add [文件名]。
    第四步:git commit -m '信息'。注意此时commit一定不能带具体文件名。

2. 远程库操作

3.5 git原理

了解git的本地库在内部是如何管理各个版本的历史数据的。git的分支操作为什么流畅和高效。
git底层采用的是SHA-1算法。

了解hash算法

是一种机密算法,把输入的明文经过一系列运算边成密文。
各个不同的哈希算法根据加密的程度不同,都有几个共同点:

  1. 不管输入数据的数据量有多大,采用同一个加密算法得到的加密结果长度固定。
    2.哈希算法确定,输入数据不变,输出数据能够保证不变。
  2. 哈希算法确定,输入数据有变化,输出数据一定有变化,而且变化通常很大。
  3. 哈希算法不可逆。
    哈希算法可以被用来验证文件。

3.6 git版本数据管理机制

  • 集中式版本控制工具的文件管理机制(增量式)
    以文件变更列表的方式存储信息。保存的信息看作是一组基本文件和每个文件随时间逐步累积的差异。
    每个版本只保存文件修改的一小部分,当想要某一个历史版本的数据时,需要把前面的历史版本和原始文件合并到一起,才能得到完整版本数据,能够很好节约服务器存储空间。
  • 分布式版本控制工具的文件管理机制
    每个历史版本对应工作区里面所有目录/文件的快照。
    git把数据看作是小型文件系统的一组快照,每次提交更新时git都会对当前的全部文件制作一个快照并保存这个快照的索引,为了高效,如果文件没有修改,git不在重新存储该文件,而只是保留一个链接指向之前存储的文件,所以的git的工作方式称之为快照流。
    细节:git的提交对象都生成一个hash值。每一个文件也都会有一个hash值。所有目录里文件的hash值构成一个树对象,树对象也有自己的hash值。提交对象包含树对象。
    每一个版本提交对象都有一个父节点指向父对象信息。

3.7git管理分支工具

svN:把所有文件复制。
git:创建和移动指针HEAD切换和创建分支。(高效和流畅的原因所在)

四、与GitHub

4.1 基本流程

  1. 注册github账号
  2. 创建本地库
    git init
    git add .
    git commit -m 'bbbb'
  3. 创建远程库
  4. 将本地库push到远程库
    git remote add origin '远程库地址':origin表示远程库的地址别名。
    git push origin master:master表示要推送的远程分支名。
    注意:*[new branch]表示远程库没有这个分支,master(本地库master分支)-> master(远程库master分支)

4.2 克隆操作

** git clone '远程仓库地址'**
会复制远程仓库的所有文件和生成.git文件。
效果:

  1. 远程仓库下载到本地
  2. 初始化本地仓库
    3.创建origin远程地址别名(通过git remote -v命令查看)
    此时可提交到本地库,但是不能push到远程库,403错误。需要加入团队,获取权限。

4.3 关于远程库修改的拉取

pull = fetch+merge(分开是更谨慎的操作,暂时不合并,观察后再合并)
git fetch origin master:(master是远程分支名)抓取是远程库master分支,读操作,远程内容下载到本地,但本地工作区文件不变。
git checkout origin/master:切换分支,查看下载的内容
git checkout master:
git merge origin master:本地和远程合并
git push origin master:推送

4.3 协同开发冲突解决

要点:
如果不是基于github远程库的最新版本做的修改,不能推送,必须先拉取。
拉取下来后如果进入冲突状态,则按照‘分支冲突’操作解决。
跨团队操作演示:

4.4 SSH免密登录

  1. 进入当前用户的家目录 :cd ~
  2. 删除.ssh目录:rm -rvf .ssh
  3. 运行命令生成.ssh密钥目录
    ssh-keygen -t rsa -C [github账号信息]
  4. 进入.ssh查看文件列表:cd .ssh ls -lF
  5. 查看id_rsa.pub文件内容:cat id_ras.pub?
  6. 复制文件内容到github的Settings->SSH and GPG Keys
  7. 回到工作区提交修改
    git remote add origin_ssh [SSH地址]
    git push origin_ssh master

4.5 图形化界面操作

posted @ 2020-10-14 14:52  小耳朵兔  阅读(134)  评论(0)    收藏  举报