春风又绿江南岸,明月何时照我还
本文介绍:git 入门和使用
本文参考:尚硅谷课程
本文作者:一位追寻自己理想的少年
git的简介和历史
什么是git有什么用
Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。与常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本库的方式,不必服务器端软件支持。不仅仅是个版本控制系统,它也是个内容管理系统(CMS),工作管理系统等。版本控制是一种记录文件内容变化,以便将来查阅特定版本修订情况的系统。版本控制其实最重要的是可以记录文件修改历史记录,从而让用户能够查看历史版本,方便版本切换。
实际应用以及解决的问题
像 Git 这种分布式版本控制工具,客户端提取的不是最新版本的文件快照,而是把代码
仓库完整地镜像下来(本地库)。这样任何一处协同工作用的文件发生故障,事后都可以用
其他客户端的本地仓库进行恢复。因为每个客户端的每一次文件提取操作,实际上都是一次
对整个文件仓库的完整备份。
分布式的版本控制系统出现之后,解决了集中式版本控制系统的缺陷:
- 服务器断网的情况下也可以进行开发(因为版本控制是在本地进行的)
- 每个客户端保存的也都是整个完整的项目(包含历史记录,更加安全)
git 的历史
这里我只能说Linux这个人真的牛,不仅把开源Linux系统做到了极致,而且只用两周就开发了Git
设置用户签名
为什么要设置用户名签名
签名的作用是区分不同操作者身份。用户的签名信息在每一个版本的提交信息中能够看
到,以此确认本次提交是谁做的。Git 首次安装必须设置一下用户签名,否则无法提交代码。
※注意:这里设置用户签名和将来登录 GitHub(或其他代码托管中心)的账号没有任
何关系。
基本操作和查看签名
1)基本语法
git config --global user.name 用户名
git config --global user.email 邮箱
2)查看操作
#去用户目录下打开git
cat .gitconfig #执行这个代码
Git的工作流程
GIt一般的工作流程
- 克隆 Git 资源作为工作目录。
- 在克隆的资源上添加或修改文件。
- 如果其他人修改了,你可以更新资源。
- 在提交前查看修改。
- .提交修改。
- 在修改完成后,如果发现错误,可以撤回提交并再次修改并提交。
Git流程图
Git 工作区、暂存区和版本库(或者叫做本地库)
我们先来理解下 Git 工作区、暂存区和版本库概念:
- 工作区:就是你在电脑里能看到的目录,也就是我们写代码的地方
- 暂存区:英文叫 stage 或 index。一般存放在 .git 目录下的 index 文件(.git/index)中,所以我们把暂存区有时也叫作索引(index),临时存储
- 版本库:工作区有一个隐藏目录 .git,这个不算工作区,而是 Git 的版本库,历史版本。
工作区、暂存区和版本库图示
4. 图中左侧为工作区,右侧为版本库。在版本库中标记为 “index” 的区域是暂存区(stage/index),标记为 “master” 的是 master 分支所代表的目录树。
-
图中我们可以看出此时 “HEAD” 实际是指向 master 分支的一个"游标"。所以图示的命令中出现 HEAD 的地方可以用 master 来替换。
-
图中的 objects 标识的区域为 Git 的对象库,实际位于 “.git/objects” 目录下,里面包含了创建的各种对象及内容。
-
当对工作区修改(或新增)的文件执行 git add 命令时,暂存区的目录树被更新,同时工作区修改(或新增)的文件内容被写入到对象库中的一个新的对象中,而该对象的ID被记录在暂存区的文件索引中。
-
当执行提交操作(git commit)时,暂存区的目录树写到版本库(对象库)中,master 分支会做相应的更新。即 master 指向的目录树就是提交时暂存区的目录树。
-
当执行 git reset HEAD 命令时,暂存区的目录树会被重写,被 master 分支指向的目录树所替换,但是工作区不受影响。
-
当执行 git rm --cached 命令时,会直接从暂存区删除文件,工作区则不做出改变。
-
当执行 git checkout . 或者 git checkout – 命令时,会用暂存区全部或指定的文件替换工作区的文件。这个操作很危险,会清除工作区中未添加到暂存区中的改动。
-
当执行 git checkout HEAD . 或者 git checkout HEAD 命令时,会用 HEAD 指向的 master 分支中的全部或者部分文件替换暂存区和以及工作区中的文件。这个命令也是极具危险性的,因为不但会清除工作区中未提交的改动,也会清除暂存区中未提交的改动。
创建仓库及git实操
初始化本地库
Git 使用 git init
命令来初始化一个 Git 仓库,Git 的很多命令都需要在 Git 的仓库中运行,所以 git init 是使用 Git 的第一个命令。在执行完成 git init 命令后,Git 仓库会生成一个 .git 目录,该目录包含了资源的所有元数据,其他的项目目录保持不变。
- 使用当前目录作为 Git 仓库,我们只需使它初始化。
git init
- 该命令执行完后会在当前目录生成一个 .git 目录。使用我们指定目录作为Git仓库。
git init newrepo
初始化后,会在 newrepo 目录下会出现一个名为 .git 的目录,所有 Git 需要的数据和资源都存放在这个目录中。如果当前目录下有几个文件想要纳入版本控制,需要先用 git add 命令告诉 Git 开始对这些文件进行跟踪,然后提交:
增加一个文件到暂存区
git add 文件名
提交到本地库
git commit -m "日志信息" 文件名
查看日志
git reflog 查看版本信息 git log 查看版本详细信
更新操作
也就是执行一系列操作
版本穿梭
什么是版本穿梭
git reset --hard 版本号
其实意思很好理解,就是切换我们的提交到版本库中的版本,比如我发现第二次的版本并不比第一次好,这时我们就需要将版本穿梭回去。
分支操作
分支是什么有什么用
在版本控制过程中,同时推进多个任务,为每个任务,我们就可以创建每个任务的单独分支。使用分支意味着程序员可以把自己的工作从开发主线上分离开来,开发自己分支的时候,不会影响主线分支的运行。对于初学者而言,分支可以简单理解为副本,一个分支就是一个单独的副本。(分支底层其实也是指针的引用)。
Git 分支实际上是指向更改快照的指针。有人把 Git 的分支模型称为必杀技特性,而正是因为它,将 Git 从版本控制系统家族里区分出来。同时并行推进多个功能开发,提高开发效率。各个分支在开发过程中,如果某一个分支开发失败,不会对其他分支有任何影响。失败的分支删除重新开始即可。
查看分支情况
git branch -v
创建一个分支
git branch 分支名
如果在当前的分支上操作比如在master分支上执行了一更新操作,那么在这个master分支上会有版本更新但是其它分支上并不会有变化。
切换分支
git checkout 分支名
分支合并
git merge 分支名
一旦某分支有了独立内容,你终究会希望将它合并回到你的主分支现在假设我们在主分支上做了修改操作,在其它分支上也做了修改操作,但是我们现在想让其它的分支合并到主分支上去。
为什么会产生冲突
冲突产生的原因:合并分支时,两个分支在同一个文件的同一个位置有两套完全不同的修改。Git 无法替我们决定使用哪一个。必须人为决定新代码内容。
解决冲突(手动操作)
编辑有冲突的文件,删除特殊符号,决定要使用的内容
特殊符号:<<<<<<< HEAD 当前分支的代码 ======= 合并过来的代码 >>>>>>> hot-fix
master、first_branch其实都是指向具体版本记录的指针。当前所在的分支,其实是由 HEAD决定的。所以创建分支的本质就是多创建一个指针。HEAD 如果指向 master,那么我们现在就在 master 分支上。HEAD 如果执行 first_branch,那么我们现在就在 first_branch分支上,所以切换分支的本质就是移动 HEAD 指针。
文章创作不易,也谢谢各位的浏览
您的点赞便是我最大的支持
本内容尚未完结带更中。。