https://learngitbranching.js.org/?locale=zh_CN在线练习git
1. Git
安装好Git以后, 先检查是否已经绑定了用户名和邮箱
git config --list
1.1 为什么要使用版本控制?
从个人角度:
在做项目时,如果一点点去改代码会很乱,不利于我们的开发和进度。
使用版本控制可以让每一个历史版本都被记录,可以回到某一个历史状态,接着在这个历史状态下进行修改。
通俗来讲就是可以回退和撤销操作。
从团队合作角度:每一个都需要开发自己负责的功能,多个人在开发同一个项目时,必须使用版本控制协调好每个人对项目的更改
1.2 集中式版本控制
用户从远程仓库获取到的,只是最新版本的文件快照。
集中式的版本控制系统,所有的版本库是放在中央服务器中的
也就是说我们每一次的修改上传都是保存在中央服务器中的。
中央服务器就是个大仓库,大家把产品都堆里面,每一次需要改进和完善的时候,需要去仓库里面把文件给提出来,然后再操作。
集中式版本控制的缺点主要是
- 需要联网。无论是局域网还是互联网,电脑必须要与中央仓库联网。
- 仅中央仓库掌握完整的项目档案库(即所有文件即对应的修订版本),一旦中央仓库宕机,整个项目组都会停工;一旦中央仓库数据丢失,公司直接倒闭。
1.2.1 集中式版本控制的两种模式
1.2.1.1 锁定模式
在锁定模式下,当开发者想要修改某档案、签出该档案后,该档案便会进入锁定状态,其他开发成员便无法加以修改,直到签出者将该档案签回为止。
对于维持同步来说,这当然是一个十分保险的作法,因为永远不会有两个或以上的开发者同时修改同一个档案。
只是这种方法造成了开发者对于档案修改的互斥效应,大大降低了开发效率。
1.2.1.2 合并模式
在合并模式下,允许多位开发者同时针对同一档案进行修改
但是,若当他们分别将档案提交回仓库时发生冲突,便会自动进行合并,而若自动合并失败,再要求人工合并。
不过即使如此,最终目的还是要维持多个开发者间的同步。毕竟,版本控制的结果在集中式档案库中是唯一的,也是每位开发者都需与此结果保持一致的。
1.3 分布式版本控制
分布的含义是每台计算机上都还有一个完整的版本库。
也就是说,当用户 Clone 远程仓库时,并不只提取最新版本的文件快照,而是把代码仓库完整地镜像下来,包括完整的历史记录
不同于集中式版本控制系统的“中央服务器”,分布式版本控制系统可以通过推送版本库,实现不同的计算机之间的版本共享。
什么意思呢?就是说对于同一个文件A,如果两个人同时对A文件进行了修改,最新的版本应该都保存在各自的计算机中,想要实现协同开发,只需要将各自的最新版本库推送给对方,就可以得到最新的版本库了。
但是这里面有个问题,就是一个团队很大的情况下,大家都去修改,到底找谁同步版本库,不乱套了嘛。而且,大的开发项目也不是简单的两台计算机之间的版本互推就可以得到完整的版本库的。
所以,分布式版本控制系统中通常也会有一台充当“中央服务器”的计算机,大家都把版本推送到这台计算机上,而需要同步的人只需同步这一台固定的计算机就可以。
读到这,可能觉得又绕回到集中式版本管理系统了。
实则不然,所谓的分布式管理中的“中央服务器”是用来“交换意见”,或者说充当中介作用的。每一台计算机通过和这台固定的中介交换意见以后,都会拥有完整的版本库。
举个不恰当的例子,分布式中的“中央管理器”就是《乡村爱情》中的大脚超市,刘能、赵四以及长贵都掌握了最新的绯闻,通过大脚超市的意见交换后,每个人都掌握了整个象牙山的绯闻。我们可以看到,在这样的绯闻生态下,即便是王长贵挂了,象牙山的故事仍然可以继续。但是如果长贵是集中式的“中央管理器”,每个人可以将自己知道的绯闻、秘密吐槽给他且不外传,那么他的死将会直接导致《乡村爱情》的终结。
单枪匹马的工作流
团队协作的工作流
其中, pull request 与 pull 区别很大
pull request : 请求远程仓库拉取本人的 commt
pull : 将远程仓库同步更新到本地
2. Git管理本地仓库
初始化仓库(⭐)
现在F盘里创建一个文件夹demoProject,文件夹中建一个index.html。
① 在项目目录中,通过鼠标右键打开 CMD
② 执行 git init 命令将当前的目录转化为 Git 仓库
git init 命令会创建一个名为 .git 的隐藏目录,这个 .git 目录就是当前项目的 Git 仓库,里面包含了初始的必要文件,这些文件是 Git 仓库的必要组成部分
检查文件的状态(⭐⭐)
使用 git status 输出的状态
git status -s 输出简要状态
??代表图1的Untracked 状态,该文件处于工作区
跟踪新文件(⭐⭐⭐)
#使用命令 git add 开始跟踪 index.html 文件
git add index.html
# 如果文件过多,你项跟踪目录下所有文件
git add *.*
之后再运行 git status 命令,会看到 index.html 文件在 Changes to be committed 这行的下面,说明已被跟踪,并处于暂存区,staged 状态:
提交更新(⭐⭐⭐⭐)
现在暂存区中有一个 index.html 文件等待被提交到 Git 仓库中进行保存。
执行 git commit 命令进行提交,其中 -m 选项用来附带备注
commit 之后的文件就处于本地 Git 仓库中了,commited状态
git commit -m "这是一个备注,刚刚新建了index.html 文件"
修改并更新(⭐⭐⭐⭐⭐)
目前,index.html 文件已经被 Git 跟踪,并且工作区和 Git 仓库中的 index.html 文件内容保持一致。
当我们修改了工作区中 index.html 的内容之后,再次运行 git status 命令,会看到如下的内容:
文件 index.html 出现在 Changes not staged for commit 这行下面
运行 git status -s 命令,会看到如下的内容:M 代表着 Modified,即修改过的、没有放入暂存区的文件
总而言之,现在文件处于工具区,但是 modified 状态,等待add到暂存区
接下来,我们可以相继 add 和 commit,以将修改后的文件保存到本地 Git 仓库