Git企业开发控制理论和实操-从入门到深入(二)|Git的基本操作
前言
那么这里博主先安利一些干货满满的专栏了!
首先是博主的高质量博客的汇总,这个专栏里面的博客,都是博主最最用心写的一部分,干货满满,希望对大家有帮助。
高质量博客汇总
https://blog.csdn.net/yu_cblog/category_12379430.html
然后就是博主最近最花信息的一个专栏《Git企业开发控制理论和实操》希望大家多多关注!
Git企业开发控制理论和实操
https://blog.csdn.net/yu_cblog/category_12419275.html?spm=1001.2014.3001.5482
博主的Github主页
里面都是一些博主自己做的项目,希望对大家有帮助。
Git的基本操作
创建本地仓库
命令:git init

创建好之后会多一个 .git 目录,里面是什么我们先不管,后面再说。

不要手动修改里面的任何内容!
配置本地仓库
一进去之后首先要配置的两个东西,是一定要配置的
- name
如果不配置在后续就会有一系列的问题。
配置使用 git config 命令
git config user.name "xxx"
git config user.email "xxx"
检查是否配置好了:
git config -l # 检查config中的所有配置
删除配置:
比如删除名字
git config --unset user.name
全局设置:
表示可以在当前机器下的所有仓库中都生效。
git config --global user.name "xxx" # 全局设置
git confit --global --unset user.name # 全局重置
认识工作区、暂存区、版本库

现在,请问这个git仓库可以管理这个README.md吗?
答案是还不可以。因为本质上.git才是仓库,外面不是。
但是.git是绝对不允许手动修改的。
其实.git里面叫做版本库(仓库),外面叫做工作区。
那么怎么样才能让README.md被管理呢?要进行一些操作。

这张图的工作区,就是README.md所在的地方。
stage可以称作暂存区/索引,即/index
HEAD是一个指针,只想master,这个概念我们到后面再理解。
添加文件
git add
本质是添加到stage中!
命令:
git add # 后面跟上文件名
git add . # 添加当前所有问题
git add file.log test.txt # 添加指定文件
git commit
git commit -m "add my first file" # 这里不要乱写,这里写的是提交的细节,对后续维护很重要
git log
git log
可以打印从近到远的所有提交记录。

这个是经过哈希计算出来的,很大的数字。
git log --pretty=oneline # 这样可以打印的漂亮一点
学会看懂.git目录里的文件
我们可以看看完成了一系列操作后的目录结构,如下所示。
(base) [yufc@ALiCentos7:~/Src/Bit-Courses/GitDevelopment/gitcode]$ tree .git
.git
├── branches
├── COMMIT_EDITMSG
├── config
├── description
├── HEAD
├── hooks
│ ├── applypatch-msg.sample
│ ├── commit-msg.sample
│ ├── post-update.sample
│ ├── pre-applypatch.sample
│ ├── pre-commit.sample
│ ├── prepare-commit-msg.sample
│ ├── pre-push.sample
│ ├── pre-rebase.sample
│ └── update.sample
├── index
├── info
│ └── exclude
├── logs
│ ├── HEAD
│ └── refs
│ └── heads
│ └── master
├── objects
│ ├── 0d
│ │ └── f05318450b3455603cd0b0fc2cb4f4c8faa366
│ ├── 86
│ │ └── 5a7036c778b72e201a13e65b37bc35cbd83ade
│ ├── 8d
│ │ └── 9ba68bb8b2dfea545ec559b43f9f08d4d362c0
│ ├── d3
│ │ └── b98d1ce30bb03f3140dee28718bbdf08579543
│ ├── e6
│ │ └── 9de29bb2d1d6434b8b29ae775ad8c2e48c5391
│ ├── f4
│ │ └── 2df147c60543792b9b56e1118f11409d55e87a
│ ├── info
│ └── pack
└── refs
├── heads
│ └── master
└── tags
18 directories, 24 files
我们在刚才说了,add之后东西会被放到暂存区里面去:/index
暂存区 /index
然后我们可以在目录结构中找到这个index了。

add之后的内容就会放到index里面去的!
HEAD指针
我们还要看HEAD,刚才说了HEAD是一个指针,指向master。

就是指向master的
master

可以发现,master就是最新的一次提交的commit id
我们刚才说了,master里面存放的都是对象object的索引,可以把commit id理解成一个对象
object对象
那么如何查看object对象里面的具体内容呢?
首先要把上面的 commit id 分成两部分来看。
前两位,也就是f4表示文件夹的名称,后面表示文件名,如图所示。

但是现在查看不能直接cat了,要用一个特殊的命令
git cat-file -p [commit id]

最新的一次提交的描述信息,就写在这里。
学到这里,我们可以输出一个结论:Git追踪管理的其实就是修改,而不是文件!
修改文件
git status命令
先介绍一个命令,用于查看仓库的状态。
git status

我刚才在我的README.md里面新增了一行,然后git statues 告诉我:
Changes not staged for commit :暂存区中没有要修改的内容
修改的内容在工作区的README.md中
git diff命令
git diff README.md
即:找出工作区和暂存区中README.md文件的差异。打印格式是Unix常用的diff格式。
修改后
我们git add .一下之后,再git status试一下

提交看看。

版本回退
回退操作
重点命令:
git reset [--soft | --mixed | --hard] [HEAD]
直接上例子。
我们的README.md其实是有两个版本的,一个是一开始的版本,一个是添加一行后的版本。
git reset本质是回退版本库中的内容。
--soft |
--mixed |
--hard |
|---|---|---|
| 只回退版本库中的内容,工作区和暂存区不变 | 版本库+暂存区回退,工作区不变 | 回退所有区域中的内容 |
默认使用--mixed选项。
--hard慎用,因为如果我正在工作区进行开发,但是调用了--hard的回退,工作区的内容就直接丢失了。
在操作直线先看看日志。

调用git reset

回退之后,在add my first file这一次修改之后的所有修改,都会直接被回退。
如果后续需要撤销修改:也是执行git reset命令。
如果你的bash还没clear,还是能看到刚才的commit id
那直接调用git reset也是可以撤销的。
那如果你屏幕clear了呢?也是可以撤销的。
git reflog # 它可以看到本地每一次的提交命令

前面那些短的数字和字母,其实就是 commit id 的一部分。用这一部分也是可以回退的。
回退本质
本质就是一个指针动来动去而已。

撤销修改
如果我们在工作区在一个版本基础上继续开发,但是越写越觉得自己的代码是垃圾,写不下去了,想直接回到修改前的版本。
首先是有三个场景:
只在工作区中改了
add了但没有commit
commit了
情况一:仅在工作区中进行了修改
git checkout -- README.md
这个命令可以让文件撤销到上一次add时候的状态。
注意:命令中的--是很重要的,如果不加--,命令是另外一个含义。
情况二:add了但没有commit
先把准备工作做一下,把工作区和暂存区的弄成一致的先。

利用git reset就行
git reset --hard ... # 这个命令也可以回退到和当前版本库内容一致的版本下,即版本库啥样就回退到啥样
git reset --hard HEAD # 表示回退到当前版本
git reset --hard HEAD^ # 表示回退到上一个版本
git reset --hard HEAD^^ # 表示回退到上两个版本,以此类推
# 当然这里面reset的选项可以自己选
情况三:已经commit
同样可以利用git reset命令。
那么我们知道HEAD是当前版本,HEAD^是上一个版本,所以情况三也是很好解决的。
git reset --hard HEAD^ # 三个区都回退到上个版本
注意:情况三有一个大的前提条件,即:commit之后没有push操作。
至于什么是push操作后续才会讲解。
为什么要有这个前提呢,不是说push了我们的代码就改不了,而是说,在企业中,跑的代码是远程仓库中的代码,不是我本地的代码。
撤销的目的:就是不影响远程仓库的代码。
删除文件
方法一
在工作区rm之后,add和commit就行了。
方法二
使用git提供的命令。
git rm file1
这个命令可以帮我们做两件事:
删除工作区中的
file1删除暂存区中的
file1
因此我们再git commit一下就能完成删除了。
Git企业开发控制理论和实操-从入门到深入(二)|Git的基本操作的更多相关文章
- 2-6 Flutter开发环境与Android开发环境设置实操(Windows)
通常安装完AS后,sdk的目录 C:\Users\wjw\AppData\Local\Android\sdk 如果在这个目录下没有找到sdk的目录的话 Settings里面搜索sdk,找到Androi ...
- 快速开发基于 HTML5 网络拓扑图应用--入门篇(二)
上一篇我们绘制了一个 graphView 场景,在场景之上通过 graphView.dm() 获取数据容器,并通过 graphView.dm().add() 函数添加了两个 Node 节点,并通过 s ...
- SFUD+FAL+EasyFlash典型场景需求分析,并记一次实操记录
SFUD+FAL+EasyFlash典型场景需求分析:用整个flash存储数据,上千条数据,读取得时候用easyflash很慢,估计要检索整个flash太慢了. 改进方法:分区检索. 1存数据时,根据 ...
- React 可视化开发工具 Shadow Widget 非正经入门(之五:指令式界面设计)
本系列博文从 Shadow Widget 作者的视角,解释该框架的设计要点.本篇解释 Shadow Widget 中类 Vue 的控制指令,与指令式界面设计相关. 1. 指令式界面设计 Vue 与 A ...
- React 可视化开发工具 Shadow Widget 非正经入门(之六:markdown)
本系列博文从 Shadow Widget 作者的视角,解释该框架的设计要点.本篇讲解 Markdown 在 Shadow Widget 中的应用. Markdown 在 Shadow Widget 中 ...
- 【强烈推荐,超详细,实操零失误】node.js安装 + npm安装教程 + Vue开发环境搭建
node.js安装 + npm安装教程 + Vue开发环境搭建 [强烈推荐,超详细,实操零失误] 原博客园地址:https://www.cnblogs.com/goldlong/p/8027997.h ...
- mPaaS 小程序架构解析 | 实操演示小程序如何实现多端开发
对于 mPaaS 小程序开发框架,想必读者们并不陌生.它源自于支付宝小程序框架,继承了易开发性.跨平台性及 Native 性能,不仅帮助开发者实现面向自有 App 投放小程序,还可快速构建打包,覆盖支 ...
- Git实操
使用git首先要理解工作区(working).暂存区(stage或者index).和版本库(repo区),很多命令都是和这三个概念相关的. git init 初始化git仓库,会生成默认的.git文件 ...
- SBT实操指南
参考资料:1.英文官方文档2.中文官方文档,内容翻译的不全 SBT是类似maven和gradle的自动构建和包依赖管理工具,SBT是Scala技术体系下的包管理工具,都是Lightbend公司开发的, ...
- 【Social listening实操】作为一个合格的“增长黑客”,你还得重视外部数据的分析!
本文转自知乎 作者:苏格兰折耳喵 ----------------------------------------------------- 在本文中,作者引出了"外部数据"这一概 ...
随机推荐
- AtCoder ABC 049 C - 白日梦 (DP写法)
题目传送门:Here Description 提供由小写字符构成的长度N的字符串S. 请将S分割成几个连续的字符串,并判断这些字符串是否能够全部变成"dream"."dr ...
- AtCoder Beginner Contest 211 (C ~ E) 个人题解
比赛链接:Here A.B题跳过 C - chokudai 题意: 给出一个字符串,问有多少个字串能构成 chokudai 这道题算是一个简单DP,只要计算某个位置对构成 chokudai 的贡献值即 ...
- java字符串与json互转
开发中经常遇到将字符串转成json和字符串转成json属组的方法,网上搜到的方法,好多都是不好用的,今天这里记录一下方便自己今后查看,也提供给需要的人. 依赖: <!-- 处理json --&g ...
- linux ntp时间服务器搭建
工作中经验遇到搭建时间服务器的任务,如何搭建网上找的例子总是有些许问题,如下自己动手操作一遍总结一下,方便自己和后来人直接上手使用. 准备工作:192.168.0.1 服务端: ntp服务器192 ...
- Visual Studio2019 使用WCF服务
什么是WCF Windows Communication Foundation (WCF) 是一个框架,用于生成面向服务的应用程序.它取代了较旧的进程间通信技术,例如 ASMX Web 服务..NET ...
- @Conditional注解使用及@ConditionalOnXXX各注解的作用
本文为博主原创,转载请注明 出处: 一.@Conditional注解作用: 必须是 @Conditional 注解指定的条件成立,才会在容器中添加组件,配置类里面的所有配置才会生效 二.@Condit ...
- idea 配置 service 服务,多模块同时启动
转载请注明出处: 1,打开IDEA项目 .idea 下 的workspace.xml 2,查找"RunDashboard" 节点 3,添加如下内容 <option name= ...
- Angular系列教程之父子组件通信详解
.markdown-body { line-height: 1.75; font-weight: 400; font-size: 16px; overflow-x: hidden; color: rg ...
- 问题--C中结构体想要嵌套一个该结构体指针,但是系统无法识别该类型
代码如下: typedef struct_Person{ char name[64]; int age; //Person* person; //这里会出现一个问题,由于Person是在末尾定义的,那 ...
- crypto常用工具
古典密码 维吉尼亚密码(Vigenere): https://github.com/atomcated/Vigenere(加密解密程序,包含自动猜测密钥功能) https://www.guballa. ...

