1. Git基础
1.1 版本管理
1.1.1 什么是版本管理
版本管理是一种记录文件变化的方式,以便将来查阅特定版本的文件内容。
1.1.2 人为维护文档版本的问题
- 文档数量多且命名不清晰导致文档版本混乱
- 每次编辑文档需要复制,不方便
- 多人同时编辑同一个文档,容易产生覆盖
1.2 Git 是什么
Git是一个版本管理控制系统(缩写VCS),它可以在任何时间点,将文档的状态作为更新记录保存起来,也可以在任何时间点,将更新记录恢复回来。
1.3 Git 安装
在安装的过程中,所有选项使用默认值即可。
1.4 Git 基本工作流程
git仓库 | 暂存区 | 工作目录 |
---|---|---|
用于存放提交记录 | 临时存放被修改文件 | 被Git管理的项目目录 |
1.5 Git 的使用
1.5.1 Git 使用前配置
在使用 git 前,需要告诉 git 你是谁,在向 git 仓库中提交时需要用到。
- 配置提交人姓名:
git config --global user.name 提交人姓名
- 配置提交人姓名:
git config --global user.email 提交人邮箱
- 查看git配置信息:
git config --list
注意 - 如果要对配置信息进行修改,重复上述命令即可。
- 配置只需要执行一次。
我们除了可以在命令行中设置这些配置信息以外,还可以通过更改配置文件来更改配置信息。具体做法是打开C盘,找到用户,在用户目录下找到当前系统使用的用户目录。假设当前使用的用户是 YAOWEN
,点击该目录就会发现有一个.gitconfit
文件,将 C:\Users\YAOWEN
目录下新产生的 .gitconfig
文件拖拽至 VScode编辑器中,可以看到内容如下:
[user]
name = yaowen
email = yaowen@qq.com
更改配置信息只需更改上述文件并保存即可。
1.5.2 提交步骤
在项目文件夹 GitDemo
下打开 git 命令行程序
,在 git 命令行程序
中输入以下命令:
-
git init
初始化git仓库
可以看到GitDemo
文件夹下多了一个半透明的.git
文件夹,该文件夹就是一个git
仓库。
-
git status
查看文件状态
No commits yet
表示在当前仓库中还没有任何提交。Untracked files 表示没有被跟踪的文件,也就是没有被git管理的文件。下面的index.html显红就是一个没有被git管理的文件。 -
git add 文件列表
追踪文件
此时index.html就被跟踪,提交到暂存区中去了。接下来就需要把暂存区中的文件提交到git仓库中去。 -
git commit -m 提交信息
向仓库中提交代码
-
git log
查看提交记录
commit 9b5b7370fbfce26be6c91cc9dba3c79a3ba9efe4 (HEAD -> master)
表示当前这次提交的提交ID,是当前这一次提交的唯一标识。Author: yaowen <yaowen@qq.com>
、Date: Sun Dec 20 20:58:55 2020 +0800
分别为提交作者和提交时间。第一次提交
为前面写的提交说明。
1.5.3 撤销
(1)用暂存区中的文件覆盖工作目录中的文件: git checkout 文件
应用场景:当我们在开发项目中的某一个功能,在功能开发一半的时候,将工作目录中已修改的文件添加到了暂存区中,然后回到工作目录中继续开发。过了一会儿发现,后来开发的代码有些问题,需要将代码恢复到功能开发一半时的状态,这时就可以拿暂存区中的文件覆盖工作目录中的文件,这样工作目录中的文件就恢复到功能开发一般是的状态了。
注意:我们用暂存区中的文件覆盖了工作目录中的文件之后,暂存区中的文件不会消失,仍旧保存在暂存区中,依然被 git 所管理。
举例:前面我们将 index.html 提交到 git 缓存区
中之后,我们继续返回自己的项目文件夹中修改项目文件夹中的index.html文件,假设我们修改了许多之后发现有严重问题,这时我们想将 index.html 文件恢复到提交到git缓存区前的状态,也就是最近一次修改之前的状态,就需要用暂存区中的文件覆盖项目工作目录中的文件了。
例如提交到git缓存区前的状态:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>GIT</title>
</head>
<body>
第一次正式使用GIT
</body>
</html>
修改之后 index.html 的状态
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>GIT</title>
</head>
<body>
第一次正式使用GIT
我修改了文件
</body>
</html>
这时我们想将 index.html 文件恢复到提交到 git缓存区 前的状态,使用以下命令
再查看项目工作目录中 index.html 文件,我们发现恢复到提交到 git缓存区
前的状态了。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>GIT</title>
</head>
<body>
第一次正式使用GIT
</body>
</html>
(2)将文件从暂存区中删除:git rm --cached 文件
应用场景:例如在工作目录中有一些测试文件,这些测试文件是不想让 git
管理的,因为它们只是一些临时文件,用完就删除了。我们有时候可能会不小心将这些测试文件添加到暂存区中,这时我们应该将它们从暂存区中删除。因为如果不进行删除,它们就会被后续的操作提交到 git仓库
当中。
注意:在命令执行完成之后,虽然这些被删除的文件在暂存区中没有了,也不被 git 所管理了,但是在工作目录中还是存在着这些文件。
举例:在GitDemo这个文件夹下新建一个test.html文件。现在我们假设我们不小心将这个文件添加到了暂存区中。
现在我们使用命令将缓存区中的test.html文件删除,之后再查看缓存区中该文件的状态,发现该文件回到了为跟踪列表中。注意我们的工作目录中还是存在该文件的,只不过该文件已经不被git所管理了。
(3)将 git仓库
中指定的更新记录恢复出来,并且覆盖暂存区和工作目录:git rest --hard commitID
举例:我们首先将list.html文件和test.html文件一起提交到git仓库中。完成提交后我们使用命令 git status
查看暂存区中的状态,返回结果nothing to commit, working tree clean
表明在工作目录中和暂存区中都没有要提交的文件,工作目录中是很干净的,说明了我们把这两个文件提交到了git仓库中了。
现在我们使用 git log
命令查看git仓库中有哪些提交历史记录。从下图看到,在仓库中一共有两次提交。
现在我想做的事情是将第一次提交恢复出来,用第一次提交的文件覆盖暂存区和工作目录中的文件。使用命令git rest --hard commitID
,具体操作如下:
上述操作之后,我们回到VScode编辑器中,发现GitDemo文件夹下只有index.html这个文件了,而这个index.html文件是我们当初第一次提交的文件。这就说明我们已经把第一次提交的文件恢复出来了。
接下来我们再使用 git log
查看提交的历史记录,发现在历史提交记录中只剩下第一次提交了。这是因为我们刚才把第一次提交恢复出来了,在第一次提交后面的所有提交都被 git
这个程序删除了。
2. Git进阶
2.1 分支
为了便于理解,大家暂时可以认为分支就是当前工作目录中代码的一份副本。
使用分支,可以让我们从开发主线上分离出来,以免影响开发主线。
2.1.1 分支细分
-
主分支(master):第一次向 git 仓库中提交更新记录时自动产生的一个分支。
-
开发分支(develop):作为开发的分支,基于 master 分支创建。
-
功能分支(feature):作为开发具体功能的分支,基于开发分支创建
功能分支 -> 开发分支 -> 主分支
2.1.2 分支命令
-
查看分支
git branch
-
创建分支
git branch 分支名称
。(当前我们在哪一个分支上进行的操作,就是基于哪一个分支创建分支,相当于哪一个分支创建副本)下面基于master
分支创建develop
分支。
-
切换分支
git checkout 分支名称
。 (在切换分支之前,当前分支上的工作一定要提交到git仓库
中,要保持当前分支上的工作区是完全干净的状态,否则就会出现问题。)
接下来我们演示在切换分支之前,当前分支上的工作没有提交到
git仓库
中,会出现什么样的问题。我们现在切换到编辑器当中,在GitDemo这个文件夹下,我们新建一个develop.html文件。注意,我们现在处在的分支是develop分支。接下来我们把develop.html添加到暂存区当中。
现在我们相当于在develop分支上做了修改,我们先不把这个修改进行提交,直接切换到master分支上,看会出现什么样的后果。
现在我们已经切换到master主分支上,观察GitDemo这个文件夹。我们发现develop.html这个文件竟然跑到了master分支上了。前面说过,分支与分支之间在开发的过程中是没有联系的,所以在develop分支上创建的develop.html文件不应该出现在其他分支上(这里指的是master主分支),但显然这个文件现在已经跑到了master分支上了,这就是有问题的。
现在我们切换回develop分支上,在develop分支上将develop.html文件提交到git仓库当中去。
现在我们已经把develop.html这个文件提交到了git仓库
当中去了。接下来我们再切换回master主分支上,然后再来观察GitDemo这个文件夹,发现develop.html这个文件已经看不到了。因为我们现在所处的分支是master主分支上,而develop.html这个文件是在开发分支上创建的,所以在这我们是看不到的。
接下来我们又切换回develop分支,看develop.html这个文件是否存在。
注意观察,我们看到现在develop.html这个文件就已经回来了。我们现在看到的状态才是正常状态。因为分支与分支在开发的过程中就是应该没有联系的,所以我们在开发分支上创建的文件在主分支上就不应该再被看到了,而应该在开发分支上再被看到。
-
合并分支
git merge 来源分支
。 (使用场景:如果在当前分支上的工作已经完成,就可以将当前分支合并到其他分支上去了,即合并当前分支上的工作成果。)举例:现在我们要将开发分支合并到主分支上。注意,由于是开发分支被合并到主分支上,所以我们要先切换到主分支上去,站在主分支的角度上合并开发分支。
切换到编辑器当中,我们看到我们现在确实是在主分支上,但是在主分支上我们也能看到develop.html这个文件。这是因为我们把开发分支上的文件合并到了主分支上,所以我们在主分支上才能看到develop.html这个文件。这里需要注意的是,虽然开发分支已经被合并到了主分支上,但是开发分支依然是存在的。合并完成后,我们还是可以切换回开发分支,在开发分支上继续进行开发。
我们看到开发分支上已经没有develop.html这个文件了。
-
删除分支
git branch -d 分支名称
。(分支被合并后才允许删除)(-D 强制删除)如果某个分支上的工作已经完成,并且这个分支已经不需要继续存在了,这个时候我们就可以删除这个分支了。
需要注意的是,如果我们要删除的分支没有被合并,默认情况下这个分支是不允许被删除的。这个git程序对分支的保护机制,防止开发人员误删文件。如果这个分支是真的没有必要合并,就是不想要了,我们可以强制删除它。现在举例演示上述情况。我们来创建一个test分支,并切换到test分支上去,在test分支当中新建一个文件。
接着我们把test.html文件添加到暂存区当中,并且提交到git仓库当中。
现在我们相当于在test分支上进行了编辑,并且把编辑的结果提交到了git仓库
当中。接着我们再切换回master分支,然后再使用命令git branch -d test
删除test分支。(注意,如果我们要在现在所处的test分支上删除test分支,这种做法是不被允许的。我们要必须先切换到其他分支上,然后才能对当前分支进行删除操作。)
从上图看到,在命令行工具当中已经给了我们提示error: The branch 'test' is not fully merged.
If you are sure you want to delete it, run 'git branch -D test'.
所以如果想要强制删除test分支,必须按照它的提示去做,如下图:
2.2 暂时保存更改
前面提到,在切换分支之前,必须要将当前分支上所有的改动进行提交才能切换到其他分支上,否则就会出现问题。但在实际开发过程中,经常会遇到这样的情况。我正在开发一个新功能,这时老板跑过来告诉我,我之前开发的一个功能存在一个严重的bug,必须要立即修复,但是在当前分支上开发的新功能还没有开发完成,我不想提交然后切换到新的分支中修改bug。
遇到这种问题,我们就需要git提供的储藏功能了。我们可以将这个储藏功能想象成一个剪切板,它可以提取分支上所有的改动,并将改动保存起来,然后我们就得到一个干净的工作副本,也就是说一个不存在任何改动的工作目录,接下来我们就可以随意切换分支了。当我们将其他功能的bug修改完成以后,再切换回这个分支,此时我们可以将刚才储藏的改动再恢复回来,然后继续开发新功能。
在git中,可以暂时提取分支上所有的改动并存储,让开发人员得到一个干净的工作副本,临时转向其他工作。
使用场景:分支临时切换
-
存储临时改动:
git stash
-
恢复改动:
git stash pop
。一旦将剪切板中的改动恢复出来,在剪切板中就不存在这些改动了。注意,git提供的这个储藏功能是独立于分支的,也就是说在其他分支上也可以执行这个命令。如果在其他分支上执行这个命令,就会将改动恢复到其他分支上。所以在执行命令之前,一定要搞清楚当前所在的分支是什么。现在我们演示命令的使用。切换到git命令行程序当中,目前我们只有一个分支,即主分支。我们创建一个develop分支,并切换到该develop分支上去。
接下来切换到VScode编辑器当中,在开发分支上新建一个dev.html文件。接着将dev.html文件添加到暂存区当中,之后查看当前工作区的状态。
现在我们看到在develop这个分支并不是一个干净的工作区,这个时候我们是不能切换分支的。如果这个时候切换分支,dev.html这个文件就会被携带到新切换到的那个分支上去。之前提到,我们必须要将当前分支上的文件进行提交,才能切换分支。但有的时候我们就不想提交,因为这个工作还没有完成。这时我们就可以使用git stash
这个命令先将改动剪切到git给我们提供的剪切板中。
这时候我们就可以切换到主分支上去了。
切换到编辑器当中,我们看到在GitDemo这个文件夹下已经没有了dev.html这个文件了。
假设我们在主分支上的工作已经完成了。我们切换回develop分支,使用git stash pop
命令把剪切板当中的改动再恢复回来。
切换到编辑器中当中,GitDemo文件夹下dev.html就回来了。
3. Github
在版本控制系统中,大约90%的操作都是在本地仓库中进行的:暂存,提交,查看状态或者历史记录等等。除此之外,如果仅仅只有你一个人在这个项目里工作,你永远没有机会需要设置一个远程仓库。
只有当你需要和你的开发团队共享数据时,设置一个远程仓库才有意义。你可以把它想象成一个 “文件管理服务器”,利用这个服务器可以与开发团队的其他成员进行数据交换。
3.1 注册
-
访问github首页,点击 Sign up 连接。(注册)
-
填写用户名、邮箱地址、GitHub登陆密码
-
选择计划
-
填写 GitHub 问题
-
验证邮箱
-
GitHub 个人中心
3.2 多人协作开发流程
- A在自己的计算机中创建本地仓库
- A在github中创建远程仓库
- A将本地仓库推送到远程仓库
- B克隆远程仓库到本地进行开发
- B将本地仓库中开发的内容推送到远程仓库
- A将远程仓库中的最新内容拉去到本地
3.2.1 A在自己的计算机中创建本地仓库
3.2.2 A在github中创建远程仓库
3.2.3 A将本地仓库推送到远程仓库
3.2.4 B克隆远程仓库到本地进行开发
3.2.5 B将本地仓库中开发的内容推送到远程仓库
3.2.6 A将远程仓库中的最新内容拉去到本地
3.3 创建仓库
-
填写仓库基本信息
-
将本地仓库推送到远程仓库
-
git push 远程仓库地址 分支名称
-
git push 远程仓库地址别名 分支名称
-
git push -u 远程仓库地址别名 分支名称
, -u 记住推送地址及分支,下次推送只需要输入git push即可 -
为远程仓库地址取别名
git remote add 远程仓库地址别名 远程仓库地址
-
3.4 拉取操作
3.4.1 克隆仓库
克隆远端数据仓库到本地:git clone 仓库地址
3.4.2 拉取远程仓库中最新的版本
拉取远程仓库中最新的版本:git pull 远程仓库地址 分支名称
3.5 解决冲突
在多人同时开发一个项目时,如果两个人修改了同一个文件的同一个地方,就会发生冲突。冲突需要人为解决。
3.6 跨团队协作
- 程序员 C fork仓库
- 程序员 C 将仓库克隆在本地进行修改
- 程序员 C 将仓库推送到远程
- 程序员 C 发起pull reqest
- 原仓库作者审核
- 原仓库作者合并代码
3.7 ssh免登陆
https协议仓库地址:https://github.com/itcast-frontEnd/git-demo.git
生成秘钥:ssh-keygen
秘钥存储目录:C:\Users\用户\.ssh
公钥名称:id_rsa.pub。公钥要存储在github账户当中。
私钥名称:id_rsa
3.8 GIT忽略清单
将不需要被git管理的文件名字添加到此文件中,在执行git命令的时候,git就会忽略这些文件。
git忽略清单文件名称:.gitignore
将工作目录中的文件全部添加到暂存区:git add .