【新技能】GIT原理详解与应用

324 阅读7分钟
【新技能】GIT原理详解与应用
  • 整理自掘金小册《GIT原理详解与应用》 感谢 扔物线 大佬的小册资源
  • 整理者:聪明的傻孩子 微信号:Crazy13983627202
  • 一、版本控制系统(CVS ,Version Control System)
    • 版本控制,意思就是在文件的修改历程中保留修改历史,让你可以方便地撤销之前对文件的修改操。
    • CVS系统三要素
      • 版本控制、主动提交、中央仓库
    • 中央版本控制系统
      • 功能:保存版本历史、同步团队代码
      • 主项目工程师:负责发布维护中央仓库 #案例分析
      • 其他工程师:获取中央仓库到本地,开发并提交
    • 分布式版本管理系统(DCVS)
      • 主工程师:构建代码(init),提交本地仓库(commit),提交到远程仓库(push)
      • 其他工程师:克隆远程仓库代码到本地仓库z(clone),提交本地仓库(commit),推送远程仓库(push)
      • DCVS优缺点 #自我思考
        • 优点:
          • 1. 响应速度快,便于维护,不依赖于网络
          • 2. 便于回溯、能细化提交
        • 缺点:
          • 1.初次获取项目时非常耗时
          • 2.操作相比CVS更复杂,命令行更多
          • 3.占用得存储空间比较大(本地仓库)
  • 二、GIT新手上路
    • 下载GIT客户端(略)
    • 克隆
      • git clone url地址
    • 本地文件.git.
      • 用来保存GIT相关配置
    • 日志查看
      • git log
    • 获取当前文件状态
      • git status
      • tip:代表当前项目处于master分支,仓库与远程仓库相同
    • 添加文件
      • git add ./文件名
    • 添加文件
      • git commit -m 日志
    • 推送到远程服务器
      • git push
    • 获取远程服务器资源
      • git pull
  • 三、团队合作工作模型
    • 流程:add --->commit---->push----->(push失败)pull---->push(循环)
  • tips:以上为GIT基础部分
  • 四、进阶 一:HEAD、master 与branch
    • 引用:HEAD ->master,orgin/master,origin/HEAD
      • HEAD:当前 commit 的引用,当前处于的commit分支,这里是master分支branch
      • orgin/master 远程master分支
      • origin/HEAD 最新的commit
    • commit是指向每次提交得数据,为SHA-1 校验和。就是上图黄色的部分。不重复。
    • Branch 分支
      • master为默认分支,新建项目或clone项目默认指向master分支
      • 原则:所有的 branch 之间都是平等的,只是master为主要分支,但是没有特殊性
      • 创建新branch
        • git branch 分支名 :在当前的commit处(也以当前branch作为基础)新建一个分支
        • demo:git branch feature1(结构如上图)
      • 切换分支
        • git branch 分支名
        • demo:git branch feature1
      • 删除 branch 
        • git branch -d/-D 分支名( 后者为强制删除)
        • tips:无法删除HEAD所在的分支,必须切换成其他分支才可以
  • 五、进阶二:Push的原理
    • 1.push 是把当前的分支上传到远程仓库,并把这个 branch 的路径上的所有 commit s也一并上传
    • 2. push 的时候,如果当前分支是一个本地创建的分支,需要指定远程仓库名和分支名,用 git push origin branch_name 的格式,而不能只用 git push ;或者可以通过 git config 修改 push.default 来改变 push 时的行为逻辑。
    • 3. push 的时候之后上传当前分支,并不会上传 HEAD ;远程仓库的 HEAD 是永远指向默认分支(即 master )的。
    • 案例:例如,我现在的本地仓库有一个 master ,它超前了远程仓库两个提交;另外还有一个新建的 branch 叫 feature1 ,远程仓库还没有记载过它。具体大概像这样:
      • 远程仓库:
      • 本地仓库:
      • 这时我执行 git push ,就会把 master 的最新位置更新到远端,并且把它的路径上的 56 两个 commit s 上传,此时远程仓库的结构将如下:
    • 1.merge 到底是什么?
      • merge 的意思是「合并」,它做的事也是合并:指定一个 commit ,把它合并到当前的 commit来。
      • example:如下图所示的结构
      • 如果此时使用 git merge branch1命令。Git 会把 5 和 6 这两个 commit 的内容一并应用到 4 上,然后生成一个新的提交,并跳转到提交信息填写的界面:
      • 这时候就完成了merge,结果如下:
      • 此时的4已结包含了branch1中5,6的commit数据
    • 2.使用场景
      • 2.1 合并分支
        • 当一个 branch 的开发已经完成,需要把内容合并回去时,用 merge 来进行合并。
      • 2.2 pull 的内部操作
        • pull 的实际操作其实是把远端仓库的内容用 fetch (获取远端分支)取下来之后,用merge 来合并。
    • 3.特殊情况:冲突(conflict)
      • 3.1 为什么会发生冲突?
        • merge 在做合并的时候,是有一定的自动合并能力的:如果一个分支改了 A 文件,另一个分支改了B 文件,那么合并后就是既改 A 也改 B,这个动作会自动完成;如果两个分支都改了同一个文件,但一个改的是第 1 行,另一个改的是第 2 行,那么合并后就是第 1 行和第 2 行都改,也是自动完成。
        • example:
        • 上面就是不同分支修改了同一文件相同位置,merge的自动算法就搞不定了。产生的这种情况 Git 称之为:冲突(Conflict)。以下就是尝试merge后产生confilict的报文:
      • 3.2 如何解决冲突呢?
        • 3.2.1 解决掉冲突
          • example:发生冲突后打开文件可见:
          • HEAD 中的内容是 移动硬盘(已买) ,而 feature1 中的内容则是 移动硬盘(不买了) 。这里需要手动修改:保存后解决了冲突
        • 3.2.2 手动 commit 一下 
          • 按照上面的解决conflict后,commit一下就可以了
      • 3.3 放弃解决冲突,取消 merge?
        • 如果放弃解决冲突,也需要取消merge。如何取消?
          • git merge --abort
    • 4. 特殊情况:HEAD 领先于目标commit
      • 如果 merge 时的目标 commit 和 HEAD 处的commit 并不存在分叉,而是 HEAD 领先于目标commit :
      • 此时merge将会无效
    • 5.特殊情况:HEAD 落后于 目标commit——fast-forward
      • 如果 HEAD 和目标 commit 依然是不存在分叉,但 HEAD 不是领先于目标commit ,而是落后于目标 commit :
      • 那么 Git 会直接把 HEAD (以及它所指向的branch ,如果有的话)移动到目标 commit :
        • git merge feature1
      • tips:因为这其实是 pull 操作的一种经典情形:本地的 master 没有新提交,而远端仓库中有同事提交了新内容到 master
    • 7.1 核心内容:
      • 任何新的功能(feature)或 bug 修复全都新建一个 branch 来写;
      • branch 写完后,合并到 master ,然后删掉这个 branch 。
    • 1 常用方法
      • 1.1 add 后面加个点 ".":全部暂存
        • git add .(除忽略文件外,全部缓存)
      • 1.2 add 添加的是文件改动,而不是文件名
        • example:假如你修改了文件 a.txt ,然后把它 add 进了暂存区:
          • git add a.txt
          • git status
        • 效果
        • 然后你又往 a.txt 里写了几行东西。这时候你再status 一下的话:
          • git status
        • 结果:
        • a.txt 既在 "Changes to becommited" 的暂存区,又在 "Changes notstaged for commit"。
        • git commit 后,新添加的改动不会被提交的。
    • 9.1如何查看历史记录?
      • git log
    • 9.2 如何查看每条 commit 具体都有那些改动?
      • git log -p
    • 9.3 如何查阅每条commit的简要统计?
      • git log --stat
    • 9.4 如何查看具体的 commit ?
      • git show [commit值] [文件名]
    • 9.5 如何查看看未提交的内容?
      • git diff :显示更改内容
      • git diff --staged :查看即将提交的内容和本地更改内容.
      • git diff --cached:staged和cache一样
      • git diff HEAD :查看未提交内容和上次comimit的不同
  • tips:以上就是进阶内容。