【新技能】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相关配置
- 日志查看
- git log
- git log
- 获取当前文件状态
- git status
- tip:代表当前项目处于master分支,仓库与远程仓库相同
- git status
- 添加文件
- 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
- HEAD:当前 commit 的引用,当前处于的commit分支,这里是master分支branch
- commit是指向每次提交得数据,为SHA-1 校验和。就是上图黄色的部分。不重复。
- Branch 分支
- master为默认分支,新建项目或clone项目默认指向master分支
- 原则:所有的 branch 之间都是平等的,只是master为主要分支,但是没有特殊性
- 创建新branch
- git branch 分支名 :在当前的commit处(也以当前branch作为基础)新建一个分支
- demo:git branch feature1(结构如上图)
- git branch 分支名 :在当前的commit处(也以当前branch作为基础)新建一个分支
- 切换分支
- git branch 分支名
- demo:git branch feature1
- git branch 分支名
- 删除 branch
- git branch -d/-D 分支名( 后者为强制删除)
- tips:无法删除HEAD所在的分支,必须切换成其他分支才可以
- master为默认分支,新建项目或clone项目默认指向master分支
- 引用:HEAD ->master,orgin/master,origin/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 上传,此时远程仓库的结构将如下:
- 远程仓库:
- 六、进阶三:merge:合并 commits
- 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 来合并。
- 2.1 合并分支
- 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 中的内容则是 移动硬盘(不买了) 。这里需要手动修改:保存后解决了冲突
- example:发生冲突后打开文件可见:
- 3.2.2 手动 commit 一下
- 按照上面的解决conflict后,commit一下就可以了
- 按照上面的解决conflict后,commit一下就可以了
- 3.2.1 解决掉冲突
- 3.3 放弃解决冲突,取消 merge?
- 如果放弃解决冲突,也需要取消merge。如何取消?
- git merge --abort
- 如果放弃解决冲突,也需要取消merge。如何取消?
- 3.1 为什么会发生冲突?
- 4. 特殊情况:HEAD 领先于目标commit
- 如果 merge 时的目标 commit 和 HEAD 处的commit 并不存在分叉,而是 HEAD 领先于目标commit :
- 此时merge将会无效
- 如果 merge 时的目标 commit 和 HEAD 处的commit 并不存在分叉,而是 HEAD 领先于目标commit :
- 5.特殊情况:HEAD 落后于 目标commit——fast-forward
- 如果 HEAD 和目标 commit 依然是不存在分叉,但 HEAD 不是领先于目标commit ,而是落后于目标 commit :
- 那么 Git 会直接把 HEAD (以及它所指向的branch ,如果有的话)移动到目标 commit :
- git merge feature1
- tips:因为这其实是 pull 操作的一种经典情形:本地的 master 没有新提交,而远端仓库中有同事提交了新内容到 master
- 如果 HEAD 和目标 commit 依然是不存在分叉,但 HEAD 不是领先于目标commit ,而是落后于目标 commit :
- 1.merge 到底是什么?
- 七、进阶四:Feature Branching:最流行的工作流
- 7.1 核心内容:
- 任何新的功能(feature)或 bug 修复全都新建一个 branch 来写;
- branch 写完后,合并到 master ,然后删掉这个 branch 。
- 7.1 核心内容:
- 八、进阶 五:关于 add
- 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 后,新添加的改动不会被提交的。
- example:假如你修改了文件 a.txt ,然后把它 add 进了暂存区:
- 1.1 add 后面加个点 ".":全部暂存
- 1 常用方法
- 九、进阶六:看看我都改了什么
- 9.1如何查看历史记录?
- git log
- git log
- 9.2 如何查看每条 commit 具体都有那些改动?
- git log -p
- git log -p
- 9.3 如何查阅每条commit的简要统计?
- git log --stat
- git log --stat
- 9.4 如何查看具体的 commit ?
- git show [commit值] [文件名]
- git show [commit值] [文件名]
- 9.5 如何查看看未提交的内容?
- git diff :显示更改内容
- git diff --staged :查看即将提交的内容和本地更改内容.
- git diff --cached:staged和cache一样
- git diff HEAD :查看未提交内容和上次comimit的不同
- 9.1如何查看历史记录?
- tips:以上就是进阶内容。