Git 基础与使用

Git 基础与使用

什么是 Git

在说 Git 之前,我们先来聊聊版本控制系统 VCS(Version Control Systems)。

版本控制系统

在多人协作工作中,往往是每个人负责一个或几个功能,最后再将大家的工作成果整合在一起;或者当项目出现某些问题,需要紧急修复但是又不能影响现在开发的功能;或者需要将线上出现问题的版本紧急回退到上一个稳定版本等等的情况。为了应对这些问题,版本控制系统在项目中是不可或缺的。

常见的版本控制系统有本地版本控制系统、集中式版本控制系统、分布式版本控制系统。

本地版本控制系统

常见的本地版本控制系统有 RCS 等。其原理是在本地硬盘上保存记录文件修改前后变化的补丁集,通过应用补丁,来计算出各个版本的文件内容。

在这里插入图片描述

集中式版本控制系统

本地版本控制系统只能在自己的电脑上进行版本控制。当要团队合作是就需要能够联网的版本控制系统,于是集中式版本控制系统应运而生。

常见的集中式版本控制系统有 CVS,Subversion,Perforce 等。

集中式版本控制系统是将需要管理的文件上传到一台中央服务器,并且在这台服务器上保存有文件修改记录等。所有协同工作的人都连接到这台服务器上进行取文件、更新、上传等操作。

在这里插入图片描述

分布式版本控制系统

集中式版本控制系统有个缺陷,一旦中央服务器宕机,那么就无法将文件上传,项目进度就会受影响。而中央服务器如果磁盘受损,那么项目文件就有丢失的风险。

为了解决这些问题,分布式版本控制系统出现了!常见的分布式版本控制系统有 Git,Mercurial,Bazaar 等。

分布式版本控制系统同样有放在服务端的远端仓库,不同的是,本地每次获取远端的文件时,并不是取文件快照,而是把整个仓库完整地镜像到本地。这样就算远端仓库发生故障,本地仍有完整的备份。

除此之外,一个本地仓库可以连接复数个不同的远端仓库,这样就能和不同小组的人协同工作(当然一般来说我们并不会直接连接到别人的远端仓库,而是使用自己的远端仓库和主仓库交互,关于仓库的概念解释见下文)。

在这里插入图片描述

Git

如上文所说,Git 是一个免费的分布式版本控制工具。

背景小知识
Git 是 Linux 之父 Linus Torvalds 在 Linux 内核开发社区使用的商业分布式版本控制系统的免费使用权限被回收后开发的。要承载当今世界上最大的开源项目,Git 在设计之初就追求速度,并且能够很好地保证完整性。因此 Git 是项目开发时首选的代码管理工具。

因为分布式版本控制系统在本地存储的是完整的远端仓库,并且 Git 的文件操作都可以在本地进行,因此就算在无网络的状态,仍旧可以提交修改到本地仓库,当恢复网络后再推送到服务器上。这是集中式版本控制系统无法做到的。

同时 Git 还有很强大的分支功能。遗憾的是本文不会对分支太过深入,有兴趣的朋友可以阅读本文最后提供的资料进行进一步学习。

Git 基本概念

仓库

我们一般把纳入 Git 进行版本控制的根目录文件夹叫仓库(Repository)。

主仓库

主仓库即在服务端新型文件保存的仓库。一般一个项目会指定一个主仓库,所有开发者从主仓库将文件备份到自己的远端仓库,再克隆到本地。

虽然能够直接对主仓库进行操作,但是原则上不允许。

远端仓库

我们一般把从主仓库备份到自己账号下的仓库叫做远端仓库。

远端仓库是属于自己的对于主仓库的备份,可以随意操作。

本地仓库

通过克隆(clone)操作将远端仓库备份到本地后的仓库。

本地仓库拥有远端仓库的全部内容,可以随意修改,同时也可以进行分支切换等操作。

分支

分支可以理解为项目内细分的“版本”。

比如我们将 master 分支定为项目的发布分支,当项目发布了一个版本后,将版本保存在 master 分支。而 develop 分支作为开发分支,有新功能时就在 develop 分支开发。

Git 十分鼓励使用分支,不同分支之间的切换十分快,并且分支之间不会互相影响。

文件状态

Git 本地仓库中的文件一般有三种状态:已提交(commited),已修改(modified)和已暂存(staged)。

  • 已提交:文件已经保存到本地仓库中;
  • 已修改:文件被修改,但是尚未保存到本地仓库中;
  • 已暂存:文件被修改,并且被 Git 标记,将在下次提交中保存到本地仓库中;

除此之外,在本地仓库中新建的文件默认处于未追踪(Untracked)状态,需要将文件进行暂存、提交之后才会被纳入版本控制。

工作流程

以下流程说明以 GitLab 为例。

拉取

管理员创建好主仓库后,开发者需要先将主仓库备份(fork)一份到自己的远端,再克隆到本地。

远端

第一步,在主仓库进行 Fork 操作

第二步,选择自己的账号

第三步,进入自己的远端仓库,复制 SSH 地址备用

本地
准备工作 - 添加 SSH Key

在将仓库克隆到本地之前,需要在 GitLab 上先进行一步准备工作——配置 SSH Key。

Git 支持使用 ssh 进行传输,使用 ssh 之前需要先在 GitLab 后台配置 SSH Key。

生成 SSH KEY

在终端输入命令行

# mail_address 替换为 GitLab 账号绑定的邮箱。
ssh-keygen -t rsa -C "mail_address"

生成成功之后进入保存路径,会看到两个文件

配置 - 远端

带有 .pub 后缀的文件为公钥,按照下图所示在 GitLab 进行配置

配置 - 本地

如果在生成 SSH Key 时 没有 对默认路径与默认秘钥名进行更改(即生成的秘钥地址为 /Users/<your user name>/.ssh/id_rsa),那么系统会自动启用该秘钥,可直接使用。

如果做出了更改,则需在终端中输入:

# ${path} 为秘钥 `id_rsa` 的路径
ssh-add ${path}

扩展阅读

ssh-add 在电脑或终端重启的时候都需要重新执行一次,否则会出现无法将本地仓库的改动提交到远端仓库的情况(报错为 Error: Permission denied (publickey))。

但是每次都添加的话过于繁琐,可以使用以下两种方式来解决。

  1. 在终端运行 ssk-add -K ${path}。加入 -K 选项,会将 SSH Key 加入到 Mac 的 Keychain 中,在使用 Git 时会自动去检测 Keychain 中保存的 SSH Key。
  2. 编辑 ~/.ssh/config 文件(默认是没有的,自己创建一个)或者 /etc/ssh/ssh_config,内容如下
# 注释
Host gitlab
Hostname <仓库域名>
User <用户名>
IdentityFile <id_rsa 私钥路径>
Port <远端端口号,默认 22>

配置文件要注意以下几点

  1. 参数名与参数值写法支持 key valuekey=value,并且可以混用。
  2. 参数名忽略大小写,而参数值区分大小写。
  3. ~/.ssh/config 中是当前用户的配置。/etc/ssh/ssh_config 中是系统对于所有用户的配置。

对于 SSH Key 的配置,系统默认的读取顺序是 ssh-agent(通过 ssh-add 添加的私钥就是存放于 ssh-agent 中) => config

克隆远端仓库

在终端使用命令行

# ${ssh-path} 为上文在远端仓库复制备用的地址
git clone ${ssh-path}

执行后会将远端仓库克隆到当前目录下。

也可以按照下文的介绍使用软件进行克隆。

提交

本地

在本地仓库中提交文件一般步骤如下:

  1. 新加入的文件、修改后的文件,通过 追踪 操作将其暂存
  2. 拉取 主仓库的 同名 分支,将其他人的修改同步到本地。如果出现冲突请解决冲突
  3. 对已暂存的文件执行 提交 操作,同时描述修改信息
  4. 提交之后执行 推送 操作,将本地的修改提交到远端仓库

在提交本地修改的时候请务必拉取一次主仓库,如果不同步主仓库的话在后续合并时可能会出现冲突。

远端

在本地提交后,需要将代码合并到主仓库。合并申请一般在网站上提出。

第一步
第二步
第三步

安装 Git

从官网安装

官网有提供 Windows,Mac,Linux 版的 Git 安装下载地址。

官方下载地址

使用 Homebrew 安装

推荐
Homebrew 是 Mac 上的软件安装管理工具,可以通过命令行对软件进行安装、卸载、更新,并且能够自动配置环境变量,十分方便!

安装 Homebrew

Homebrew 官方网站

在终端输入

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
安装 Git

在终端输入

brew install git

进度跑完就安装完毕了!

验证是否安装成功

在终端输入

git --version

如果正确输出版本号,那么就安装成功了!

设置 Git

在正式使用 Git 之前,需要设置用户名与邮箱。

建议使用和 GitLab 一致的用户名与邮箱。

在终端输入

git config --global user.name 'your_name'
git config --global user.email 'your_email_address'

Git 也支持每个项目使用独立的用户名与邮箱。只需要在 对应项目 的目录下,使用上面的命令,去掉 --global 即可。

SourceTree

SourceTree 是一个 Git 客户端。相比于 Git 的命令行,图形界面的操作会更加直观,更适合新手。

下载地址

SourceTree 官网 首页即有 Mac 版下载地址。

注册账号

安装后打开 SourceTree,选择 Bitbucket 云
之后会跳转到网页注册账号,并且使用账号登录。

SourceTree 使用时需要用 Atlassian 账号或者 Google 账号登录,可以先进行注册。

Atlassian
Google

在注册并且登录后,如果没有出现下面这个页面,那么请在客户端再点击一次 Bitbucket 云

点击 Grant access,跳转回 SourceTree 客户端。

完成注册后,可以在这里设置提交时的用户名与邮箱。

使用

克隆仓库

选择 从 URL 克隆

目标路径可以进行更改。设置完毕后点击右下角克隆就能将远端仓库克隆到本地。

界面简介
操作
暂存文件

未暂存区域 点击新文件或者已修改的文件(包括修改与删除)左侧的框,就能执行暂存操作。

从项目中删除的文件也需要暂存并提交才能同步到远端仓库。

提交

点击左上角的 提交 按钮,或者激活下方的 提交信息 输入框,都能触发提交操作。

输入改动信息后点击右下角提交,即可将暂存的文件提交到本地仓库。

改动信息建议写的详细一些,避免别人不知道你都做了什么修改。

另外,以一个功能为单位或一次 bug 修复为单位进行提交,这是一个好习惯。尽量避免将多个功能或修改在一次提交(commit)里进行。目的是当需要进行版本回退,或者其他的分支需要从当前分支进行部分合并(cherry-pick)的时候,会更容易操作。

推送

点击上方菜单的 推送 按钮

选择推送的仓库与分支后点击右下角 确定 即可。

强烈不建议直接对远端仓库进行操作,推送操作最好只推送到自己的远端仓库。

如果远端仓库没有要推送的分支,那么会在远端仓库新建一个同名分支。

拉取

点击上方菜单的 拉取 按钮

选择要拉取的仓库和分支,点击右下角的 确定 即可。

眼神好的同学可能会注意到菜单上有一个 抓取 按钮,那么抓取(fetch)和拉取(pull)有什么不同呢?

  • 抓取:仅将远端的修改同步到本地,所有的修改会以 已修改 的形式存在本地
  • 拉取:将远端的修改同步到本地,并且尝试与本地的分支进行 合并,文件最后以 已提交 的形式存在本地

拉取(pull)可以看做是 抓取(fetch)+ 合并(merge)

新建分支

点击上方的 分支 按钮

为分支命名后,就会创建一个以 master 分支为基础的新分支。

虽然新分支是由 master 创建的,但是二者的修改并不会互相影响。

添加远端仓库

一个新的仓库,默认的远端仓库只有克隆时使用的远端仓库。要添加新的远端仓库(比如主仓库),先右键左侧远端列表,选择 新建远程

输入远端仓库的名称与路径。路径可以是远端仓库的 SSH 地址。输入后点击右下角 确定 即可。

贮藏

点击上方菜单的 贮藏 按钮

输入一个自己能记得住当前工作区已暂存的文件都做了什么的名字后,点击右下角的 贮藏 按钮。

贮藏的功能

贮藏可以将当前工作区内已暂存的文件保存到贮藏区域,工作区会恢复到已暂存文件未修改的状态。

贮藏功能在开发到一半、突然出现需要在当前工作区做其他修改的任务时特别有用。

保留缓存的变更

勾选 保留缓存的变更 后会把暂存的文件保留在工作区,不会恢复到修改前。

应用贮藏

贮藏后的修改保存在左侧的 已贮藏 列表中。

双击列表中的贮藏或者右键后选择 应用贮藏 即可将贮藏的修改应用到当前工作区。

合并

这不是入门与基础应该做的事。

解决冲突

在拉取或者合并过程中很容易产生冲突,这种时候不要慌。一般 Git 解决冲突需要借助差异对比工作,我们可以直接打开冲突的文件,通过搜索 >>>>>>> (7个 >)来定位冲突的位置。

<<<<<<< HEAD
// 这里是本地仓库的修改
const a = 10;
=======
// 这里远端的修改
const a = 15;
>>>>>>> 6853e5ff961e684d3a6c02d4d06183b5ff330dcc

如果对直接修改代码抱有不安,也可以使用 Webstorm 提供的代码比对工具进行冲突解决。

具体步骤如下:

第一步,在 Webstorm 中 右键/Git/Resolve Conflicts...

第二步,选择有冲突的文件,双击打开对比工具

第三步,通过代码比对工具进行冲突解决

一般造成冲突的原因是同一个地方本地和远端都进行了修改,Git 无法决定要用哪个版本的代码,因此会出现冲突。

在 IDE 或者代码编辑器中解决完冲突后,在 SourceTree 中右键冲突的文件,选择 解决冲突/标记为已解决,然后再执行暂存于提交操作。

如果要使用远端的文件进行冲突解决,就选择 解决冲突/使用他人版本,使用本地的版本解决冲突同理。

一般来说通过 Cocos Creator 开发的游戏 prefab 冲突时,优先考虑使用远端版本,然后本地再修改一次再提交。

.gitignore

如果有文件不需要纳入 Git 版本控制中,但是在项目调试时需要,那么可以编写仓库目录下的 .gitignore 文件。

符合 .gitignore 内规则的文件将会被 Git 忽略。

// 忽略 build 文件夹下的所有文件
build/

// 忽略当前目录下所有 temp 后缀的文件
*.temp

// 忽略所有 temp 后缀的文件
template.jsx

// 忽略 doc 目录下所有的 txt 后缀文件,但是 doc/server/a.txt 不会被忽略
doc/*.txt

// doc 目录下所有的 txt 后缀文件都会被忽略
doc/**/*.txt //

一般 .gitignore 会默认放在仓库根目录下,但是子目录中的 .gitignore 也会生效哦。

《Pro Git》

官方唯一指定参考书 《Pro Git》

关于 Git 的内部实现、原理、更加强大的分支功能等都有介绍,如果对 Git 有兴趣的话推荐阅读。

it 版本控制中,但是在项目调试时需要,那么可以编写仓库目录下的 .gitignore 文件。

符合 .gitignore 内规则的文件将会被 Git 忽略。

// 忽略 build 文件夹下的所有文件
build/

// 忽略当前目录下所有 temp 后缀的文件
*.temp

// 忽略所有 temp 后缀的文件
template.jsx

// 忽略 doc 目录下所有的 txt 后缀文件,但是 doc/server/a.txt 不会被忽略
doc/*.txt

// doc 目录下所有的 txt 后缀文件都会被忽略
doc/**/*.txt //

一般 .gitignore 会默认放在仓库根目录下,但是子目录中的 .gitignore 也会生效哦。

《Pro Git》

官方唯一指定参考书 《Pro Git》

关于 Git 的内部实现、原理、更加强大的分支功能等都有介绍,如果对 Git 有兴趣的话推荐阅读。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值