分布式版本控制

每个人都拥有全部的代码!不会因为服务器损坏或者网络问题,造成不能工作的情况。

所有版本信息仓库全部同步到本地的每个用户,这样就可以在本地查看所有版本历史,可以离线在本地提交,只需在联网时push到相应的服务器或其他用户那里。由于每个用户那里保存的都是所有的版本数据,只要有一个用户的设备没有问题就可以恢复所有的数据,但这增加了本地存储空间的占用。

分布式版本控制原理图

Git时目前世界上最先进的分布式版本控制系统。

因为Git Bash我们在日常中是使用最多的,而Git Bash基础命令风格是基于Linux系统的,所以这里我们先介绍一些基本的Linux命令

基本Linux命令

  1. cd:改变目录

  2. cd ..:回到上一级目录

  3. pwd:显示当前所在的目录的路径

  4. ls:列出当前目录中的所有文件

  5. ll:同上也是列出当前目录中的所有文件,但是相比于ls列出的内容会更为详细。

  6. touch:新建一个文件。eg:touch index.js就会在当前目录下新建一个index.js的文件。

  7. rm:删除一个文件。eg:rm index.js就会在将当前目录下的index.js文件删除。

  8. mkdir:新建一个目录,就是新建一个文件夹。

  9. rm-r:删除一个文件夹,eg:rm-r src删除src目录

`rm

-rf /` 切勿在Linux电脑中尝试此命令,f是递归删除的意思,这里的含义就是将根目录下的所有文件夹全部删掉。

  1. mv移动文件,eg:mv index.html src 命令前面的index.html文件是我们要移动的文件。src是目标文件夹,文件和目标文件夹必须在同一目录下。

  2. reset:重新初始化终端/清屏。

  3. clear:清屏。

  4. history:查看命令历史。

  5. help:帮助

  6. exit:退出

  7. #:表示注释

Git的必要配置

查看不同级别的配置文件

1
2
3
4
5
# 查看系统config
$ git config --system --list

# 查看当前用户(global)配置
$ git config --global --list

设置用户名和邮箱

1
2
$ git config --global user.name "xxxxx" #用户名
$ git config --global user.email 2604932485@qq.com #邮箱

查看用户名和邮箱

Git基本理论

Git本地有三个工作区域:工作目录(Working Directory)、暂存区(Stage/Index)、资源库(Repository或Git Directory)。如果在加上远程的git仓库(Remote Directory)就可以分为四个工作区域,文件在这四个区域之间的转换关系如下:

四个区域的转换关系

基本工作流程

  1. 在工作目录中添加、修改文件
  2. 将需要进行版本管理的文件放入暂存区(git add .
  3. 将暂存区域的文件提交到git仓库(git commit
  4. 将本地仓库推送到远程git仓库(git push

因此,git管理的文件有三种状态:已修改(modified),已暂存(staged),已提交(committed)

Git项目搭建

  • 本地搭建仓库
  • 远程克隆仓库

本地搭建仓库

  1. 创建一个写的仓库,我们先在git终端中使用cd命令进入我们想要创建仓库的目录,然后我们使用如下命令将一个当前目录(正常的的文件夹)初始化成git仓库
1
2
# 将当前目录文件夹初始化为一个git仓库
$ git init
  1. 执行后可以看到,在当前目录中多出了一个.git目录,关于版本等的所有信息都在这个目录里面。

克隆远程仓库到本地

  1. 使用git clone命令将远程服务器上的仓库完全镜像一份到本地
1
2
# 克隆一个项目和他的整个代码历史(版本信息)
$ git clone [url]

按绿色按钮可以获得当前项目的git clone 命令的url

Git文件操作

版本控制就是对文件的版本控制,要对文件进行修改、提交等操作,首先要知道文件当前在什么状态,不然可能会提交了现在还不想提交的文件,或者要提交的文件没有提交上。

文件的4种状态

  • Untracked:未跟踪,此文件在文件夹中,但并没有加入到git库中,不参与版本控制。通过git add状态变为Staged
  • Unmodify:文件已经入库(history状态),未修改,即版本库中的文件快照内容与文件夹中完全一致,这种类型的文件有两种去处,如果它被修改,而变为Modified,如果使用git rm移出版本库,则成为Untracked文件
  • Modified:文件已修改,仅仅是修改,并没有进行其他的操作,这个文件也有两个去处,通过git add可进入Staged状态,使用git checkout则丢弃修改过,返回到unmodify状态,这个git checkout即从库中取出文件,覆盖当前修改!
  • Staged:暂存状态,执行git commit则将修改同步到库中,这时库中的文件和本地文件又变为一致,文件为Unmodify状态。执行git reset HEAD filename取消暂存,文件状态变为Modified

查看文件的状态

1
2
3
4
5
6
7
# 查看指定文件状态
$ git status [filename]

# 查看所有文件的状态
$ git status


上传提交文件

1
2
3
4
# 添加所有文件到暂存区
$ git add .
# 提交暂存区中的内容
$ git commit -m "xxx" # -m 后跟着的是提交信息

回滚

1
2
3
4
5
# 对于尚未提交的处于暂存区中的文件,如果要撤销修改
$ git checkout [filename]
# 对于已经提交的一次commit,如果要撤销这次提交
$ git reset HEAD^1

下面我们举一个完整的案例,就是将一个空的文件夹初始化成一个git仓库,然后新建一个test.txt文件并将其加入到仓库中的整个过程。

我们采用本地初始化仓库的方式,首先在电脑桌面上新建文件夹ex1,然后右键该文件夹进行git bash

可以发现git init后该文件夹中多出来一个隐藏文件夹,然后我们在该文件夹下新建一个test.txt文件。

然后进入git终端,clear后执行下面的命令,结果如下图

现在我们的文件成功进入了暂存区,下面进行提交操作,结果如下

可以发现最后查看状态的时候已经显示working tree clean。所以证明提交成功!

忽略文件——.gitgnore

有些时候我们不想把某些文件纳入版本控制中,比如数据库文件,临时文件,设计文件等

这时我们可以在主目录下建立".gitgnore"文件,此文件有如下规则

  1. 文件中的空行或以开始的行都会被忽略。
  2. 可以使用Linux通配符。

星号(*)代表任意多个字符,问号(?)代表一个字符,方括号([abc])代表可选字符范围,大括号({string1,string2,…})代表可选的字符串等。

  1. 如果名称的最前面有一个感叹号(!),表示例外规则,将不被忽略。
  2. 如果名称的最前面是一个路径分隔符(/),表示要忽略的文件在此目录下,而子目录中的文件不忽略
  3. 如果名称的最后面是一个路径分隔符(/),表示要忽略的是此目录下该名称的子目录,而非文件(默认文件或目录都忽略)
1
2
3
4
5
6
# 为注释
*.txt # 忽略所有.txt结尾的文件
!lib.txt # 但是lib.txt除外
/temp # 仅忽略项目根目录下的temp文件夹,不包括其他目录temp
build/ # 忽略build目录下的所有文件
doc/*.txt # 会忽略 doc/notes.txt 但不包括 doc/server/arch.txt

创建远程仓库

以GitHub为例,其实非常的简单,只需要跟着GitHub的步骤一步一步进行设置就可以成功创建一个仓库了。

填写好仓库名以及仓库描述后,点击创建仓库。GitHub会提供下面的代码,让你将本地的仓库关联到远端这个新创建的仓库。(关联已有仓库代码用最下面三行代码)

初始化远程仓库代码

最常用的两个命令:

1
2
3
4
# 推送当前分支最新的提交到远程
$ git push
# 拉取远程分支最新的提交到本地
$ git pull

Git分支

Git分支示意图

Git分支中常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 列出所有本地分支
$ git branch

# 列出所有远程分支
$ git branch -r

# 新建一个分支,但依然停留在当前分支
$ git branch [branch-name]

# 新建一个分支,并切换到该分支(已当前分支为基础)
$ git checkout -b [branch]

# 单纯地切换到某个分支
$ git checkout [branch-name]

# 合并指定分支到当前分支
$ git merge [branch]

# 放弃这次合并
$ git merge --abort

# 删除分支
$ git branch -d [branch-name]

# 删除远程分支
$ git push origin --delete [branch-name]
$ git branch -dr [remote/branch]

多个分支如果并行执行,就会导致我们的代码不冲突,也就是同时存在多个版本!

如果同一个文件在合并分支时都被修改了,则会引起冲突:解决的办法是我们可以修改冲突文件后重新提交!选择要保留他的代码还是你的代码!

master主分支一般非常稳定,用来发布新的版本,一般情况下不允许在上面进行开发,工作一般情况下在新建的dev分支上工作,工作完成后,比如要发布,则可将dev分支合并到主分支master上来。

Vscode 插件推荐

  • GitLens — Git supercharged
  • Git History Diff

本站由 @anonymity 使用 Stellar 主题创建。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。