git的学习与使用
git Learning
1.背景
Git是什么?
Git是世界上最先进的分布式版本控制系统,由Linus Torvalds编写,用于高效处理从小型到大型项目的版本管理。Git最初设计用于Linux内核开发,现已成为开源和商业软件开发中最流行的版本控制系统。
版本控制系统:又叫修订控制或源控制系统,是一种软件实用程序,用于跟踪和管理对文件系统的更改。VCS 还提供协作实用程序,用于与其他 VCS 用户共享和集成这些对文件系统的更改。
Linus花了两周时间自己用C写了一个分布式版本控制系统,这就是Git!一个月之内,Linux系统的源码已经由Git管理了!
Git迅速成为最流行的分布式版本控制系统,尤其是2008年,GitHub网站上线了,它为开源项目免费提供Git存储,无数开源项目开始迁移至GitHub,包括jQuery,PHP,Ruby等等。
与分布式系统对应的就是集中式版本控制系统
集中式版本控制系统:集中式版本控制系统(CVCS)使用单一的中央服务器来存储所有文件的所有版本。用户从中央服务器检出文件的最新版本进行工作,并在完成后将更改提交回中央服务器。
集中式版本控制系统的缺点:
- 单点故障:如果中央服务器出现故障,整个团队都无法进行版本控制操作。
- 网络依赖:用户必须连接到中央服务器才能进行检出、提交等操作。
- 性能瓶颈:随着团队规模的增大,中央服务器的性能可能成为瓶颈。
- 数据安全性:所有数据都存储在中央服务器上,一旦服务器被攻击或损坏,数据可能丢失。
分布式版本控制系统根本没有“中央服务器”,每个人的电脑上都是一个完整的版本库
在实际使用分布式版本控制系统的时候,其实很少在两人之间的电脑上推送版本库的修改,通常也有一台充当“中央服务器”的电脑,但这个服务器的作用仅仅是用来方便“交换”大家的修改,没有它大家也一样干活,只是交换修改不方便而已。
2. 安装Git
最早Git是在Linux上开发的,很长一段时间内,Git也只能在Linux和Unix系统上跑。不过,现在Git可以在Linux、Unix、Mac和Windows这几大平台上正常运行了。
2.1 在Linux上安装Git
在大多数Linux发行版上,尝试输入git,如果提醒系统没有安装Git,就可以通过包管理器安装它。
# ubuntu / debian
sudo apt install git2.2 在MacOS上安装Git
使用homebrew安装
homebrew:MacOS 软件管理的利器
brew install git2.3 在Windows上安装Git
- scoop安装
Windows也有软件管理器scoop,scoop github页面有安装说明,主要是使用普通用户打开powershell之后,输入命令安装
# 1. 设置执行策略
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
# 2. 安装scoop
Invoke-RestMethod -Uri https://get.scoop.sh | Invoke-Expression使用 C:\> scoop install git
- 本地安装
进入git官网 git-scm.com,下载Windows版本的安装包,双击安装即可。
3. 基本配置
安装完成后,建议进行一些基本配置,比如用户和邮箱
# 设置用户名
git config --global user.name "Your Name"
# 设置用户邮箱
git config --global user.email "因为Git是分布式版本控制系统,所以,每个机器都必须自报家门:你的名字和Email地址,有冒充的也是有办法可查的。
如果没有配置用户名和邮箱,Git会拒绝提交操作,提交的时候会报错无法提交,无论你修改什么文件内容都无法提交上去
4. 本地创建版本库/仓库
4.1 创建版本库
什么是版本库?版本库又名仓库(Repository),可以简单理解为一个目录,这个目录里面所有的文件都被git管理起来,每个文件的增删查改git都可以追踪,是为了任何时刻都可以追踪历史
创建版本库有两种方式: - 在本地创建一个新的版本库 - 从远程版本库克隆一个版本库到本地
创建一个库非常简单,选择自己想要创建库的目录,然后在该目录下执行下面的命令,下面都是按照MacOS和WSL2来介绍:
# 创建一个名为 gitlearn 的目录
mkdir gitlearn
# 进入 gitlearn 目录
cd gitlearn
# 初始化一个新的 Git 版本库
git init瞬间Git就把仓库建好了,在当前目录下会生成一个隐藏的.git目录,这个目录就是Git用来管理版本库的核心目录,里面存放了所有的版本信息和配置文件。
下面是git文件的结构
[4.0K] .
├── [ 23] HEAD
├── [4.0K] branches
├── [ 92] config
├── [ 73] description
├── [4.0K] hooks
│ ├── [ 478] applypatch-msg.sample
│ ├── [ 896] commit-msg.sample
│ ├── [4.5K] fsmonitor-watchman.sample
│ ├── [ 189] post-update.sample
│ ├── [ 424] pre-applypatch.sample
│ ├── [1.6K] pre-commit.sample
│ ├── [ 416] pre-merge-commit.sample
│ ├── [1.3K] pre-push.sample
│ ├── [4.8K] pre-rebase.sample
│ ├── [ 544] pre-receive.sample
│ ├── [1.5K] prepare-commit-msg.sample
│ ├── [2.7K] push-to-checkout.sample
│ └── [3.6K] update.sample
├── [4.0K] info
│ └── [ 240] exclude
├── [4.0K] objects
│ ├── [4.0K] info
│ └── [4.0K] pack
└── [4.0K] refs
├── [4.0K] heads
└── [4.0K] tags
9 directories, 17 files
4.2 把文件添加到版本库
所有的版本控制系统,只能追踪文本文件的改动,二进制文件是无法追踪的,比如图片、视频、音频等文件,Git只能把它们当作一个整体来管理,无法追踪它们的改动内容。
图片、视频这些二进制文件,虽然也能由版本控制系统管理,但没法跟踪文件的变化,只能把二进制文件每次改动串起来
Microsoft的Word格式是二进制格式,因此,版本控制系统是没法跟踪Word文件的改动的
文本是由编码的,中文有GBK编码,日文有Shift_JIS编码,如果没有历史遗留问题,强烈建议使用标准的UTF-8编码,所有语言使用同一种编码,既没有冲突,又被所有平台所支持。
使用Windows的童鞋要特别注意:千万不要使用Windows自带的记事本编辑任何文本文件,它把每个文件开头添加了0xefbbbf(十六进制)的字符