image-2020041723245728

# Git

# 版本管理简介

# 项目的版本

  • 版本和我们平常说的软件、游戏等的版本是一个意思,比如 1.2.8 版本、比如 第1版,比如webstorm2020。
  • 所以,版本指的就是代码编写进度当中的一些节点。
  • 比如一个项目:
    • 搭建好目录结构 --- 第1版本
    • 完成登录页面布局 --- 第2版本
    • 完成登录功能 --- 第3版本
    • 完成分类页面布局 --- 第4版本
    • ...........

# 管理版本

  • 【记录】记录代码开发的过程,每一次代码的变化。
  • 【回退】将代码回退到之前的版本
  • 【查看】查看所有的版本
  • 【协作】配合远程仓库,实现多人协作

# 使用版本管理软件的必要性

工作场景一:项目的需求不断的变化,改来改去,也可能需要改回原来的代码。

  • 使用版本管理软件
    • 可以对代码每次的改动做记录,记录一次,叫做形成一个版本。
    • 可以轻松的将代码回退到任意一个版本。(可以使用之前版本中的代码、文件)
    • 电脑关机了,版本也不会丢失。

工作场景二:多个合作开发,代码不好合并。

  • 使用版本管理软件 + 远程仓库,可以解决多人合作的问题。

# 版本管理软件的作用

  • 记录代码的版本,可以随时回退。
  • 配合远程仓库,实现多人协作,可以很轻松的合并代码

# 版本管理软件分类

  • 集中式,典型代表 SVN
  • 分布式,典型代表 Git ---- 我们选择讲解Git。

# Git软件安装

  • 双击,然后一直下一步安装即可。
  • 不要安装到含有中文的路径中。比如,不要安装到 “D:/软件/学习/Git”
  • 安装完毕,绝对不可以剪切(移动)到其他文件夹。
  • 比如安装到 D:/aa/bb/cc 文件夹,千万不要重命名路径中的任何一个文件夹
  • 安装完毕,鼠标在任何文件夹空白位置右键,如果出现 Git Bash Here,则表示安装成功。(或者点击“Git Bash Here” --> 输入 git --version 回车,如果看到版本号,则表示安装成功)
  • Mac用户,使用自带的终端。输入“git --version”,回车,如果看到版本号,则表示安装成功

Mac用户需要额外配置一下:访达 -> 服务 -> 服务偏好设置 -> 勾选“新建位于文件夹位置的终端窗口”

# 告诉Git,你是谁?

Git软件在工作的时候,需要知道你是谁?所以需要设置一个用户名和邮箱。

这个用户名和邮箱,最好使用你的github (opens new window)账号或码云 (opens new window)账号(如果你有账号的话),当然随便填也可以。

具体做法:

  1. 任何文件夹,空白处,右键 --> Git Bash Here
  2. 依次执行下面两行命令
git config --global user.name "xxx"
git config --global user.email "xxx"

配置之后,可以通过下面的命令来检查是否配置成功了

# 查看所有的全局配置项
git config --list --global

# 查看单个的配置项,比如查看用户名
git config user.name

# 初体验

# 使用Git记录代码的每一次变更

  • 创建一个项目文件夹,随便创建一个即可。
  • 在项目文件夹里面的空白处,右键 --> Git Bash Here,打开黑窗口。
    • 在黑窗口中,输入 git init 然后按回车,表示执行这条命令。
    • 这一步是Git初始化。初始化之后,表示Git软件可以管理这个项目了
    • 对于一个项目来说,初始化工作只需要做一次。
  • 写代码测试
    • 随便写点代码
    • 执行命令 git add .
    • 执行命令 git commit -m '提交说明'
    • 执行完这两个命令,表示使用Git把当前代码及文件的改动记录起来了
  • 重复这个过程,多使用Git记录几次

# 查看了所有的历史记录

查看提交日志

  • git log
  • git log --oneline
  • git log --reflog 或者 git log --oneline --reflog 查看所有的版本

image-2020071115609455

# 体验在历史版本中穿梭

  • git reset --hard 版本号 --- 通过它,让代码整体,可以在历史版本中穿梭

目前还有很多知识没有学习,所以,穿梭到历史之后,不要改代码,先体验一下穿梭的感觉。

# 穿梭到历史之后,如何查看所有的版本号

穿梭到历史版本之后,通过 git log 查看不到之后的版本号。

需要加 --reflog 选项,才能查看所有的版本号

  • git log --reflog
  • git log --reflog --oneline

# Git初始化详解

目的是学习,所以,随便创建一个项目文件夹,打开项目文件夹

注意:一定要在项目文件夹,右键-->Git Bash Here。

至于项目中有没有文件无所谓。

执行下面的命令:

# 初始化,表示使用Git管理我们的项目。这个命令只需要执行一次(注意空格)
git init

  • 执行 git init 命令之后,会在项目文件夹中生成一个隐藏的 .git 文件夹
  • .git 文件夹里面保存着当前项目文件的更改记录。所以这个文件夹不能删除
  • 对于一个项目来说,git init 只需要执行一次
  • 切记,不要项目套项目。

# 查看提交日志详解

查看日志的命令:

git log

image-2020102313347036

查看简略版的信息(前7位版本号 及 提交说明):

git log --oneline
git log --pretty=oneline

如果回到历史版本,还想查看完整的历史记录,需要使用 --reflog 选项。

git log --reflog --oneline

只查看最近的两次提交

git log -2
git log -2 --pretty=oneline

# Git工作时维护的几个区域

  • 工作区
    • 工作区,指的是使用Git管理后的文件,这些文件显示在磁盘上,供我们使用或修改的区域。所以,粗略的说,项目文件夹就是工作区。
  • 暂存区
    • 执行 git add .之后,文件由工作区,添加到了暂存区。 暂存区保存了下次将提交的文件列表信息。
  • Git 仓库区、本地仓库
    • 执行 git commit -m '提交说明' 之后,代码会被提交到仓库区。仓库区是 Git 中最重要的部分,代码只有提交到仓库,才会形成一次历史记录,即才会形成一个版本。
  • 远程仓库
    • Git服务器上的仓库,比如,码云或者github网站上创建的的仓库,叫做远程仓库。远程仓库用于存储代码和发布项目,多人协作也需要远程仓库。

image-20210113104147694

# 添加提交命令

# 添加文件到暂存区

新文件,只有添加到暂存区,才叫做被Git管理。否则和Git没什么关系,即使文件在项目文件夹。

# 添加指定文件到暂存区
git add 文件名

# 以空格隔开可以一次 add 多个文件
git add [file1] [file2] ...

# 添加指定目录到暂存区,包括子目录
git add [dir] [file] [dir] [file] [file] ...

# 添加当前目录的所有文件到暂存区,包括子目录
git add .


默认空文件夹,是不能添加,不能提交的

# 提交文件到仓库

提交到仓库的文件,是暂存区中的文件。

# 提交暂存区到仓库区
git commit -m [message]

# 提交暂存区的指定文件到仓库区
git commit [file1] [file2] ... -m [message]

# 提交工作区和暂存区自上次commit之后的变化,直接到仓库区。
# 新文件,从未被Git管理过,是不能直接提交到仓库区的
git commit -a -m "提交日志"


image-2020041100145919

# 撤销

撤销,是把暂存区的代码撤销到工作区;或者把最后一次提交的代码撤销到暂存区和工作区

  • 暂存区 ---> 工作区:git checkout 文件
  • 本地仓库 ---> 暂存区:git reset 文件
  • 本地仓库 ---> 暂存区/工作区:git reset --hard

# 查看文件的状态

# 查看文件的状态
git status

# 查看简略版信息
git status -s
git status --short

  • 已提交(nothing to commit)
    • 表示没有什么东西可以提交了;即,所有的内容都已经提交过了
    • 有的文档也把这个状态叫做 未修改,意思是自上次提交过后,代码还没有修改过
  • 未跟踪(新增的文件)
  • 已暂存(新增的文件,添加到暂存区之后的状态)
  • 已修改(文件曾经被Git记录过了(无论是刚刚添加到暂存区,还是曾经被提交到仓库过),然后在工作区对他进行了修改)

精简模式(git status -s)为例:

# 未跟踪的结果 --- 新增文件,然后查看状态
?? xxx.html 
?? css/main.css

# 已暂存的结果 --- 新增文件,然后执行add命令
A xxx.html
A css/main.css

# 已修改(并且已经暂存了) --- 新增文件,执行了add命令暂存了它,然后又修改了文件
AM xxx.html
AM css/main.css

# 已修改(红色字体的M) --- 文件已经被提交到仓库了,然后又修改了它
M xxx.html
M css/main.html

# 已修改(绿色字体的M) --- 文件已经被提交到了仓库,然后又修改了它,修改完毕又暂存了它
M xxx.html
M css/main.html

#####  如果查看到文件有上述三种状态,表示还有文件没有提交,需要提交这些文件 #####

# 已提交(未修改)
On branch master
nothing to commit .....

初学者,只需要区分:代码是否都被提交到仓库了,即可。

# 分支

分支就是当前项目的一个副本(可以理解为把当前项目复制了一份,可以这样理解,但是要知道内部实现并非如此)。

初始化之后,默认是在master分支上进行操作的,master分支也叫做主分支。

实际开发中,正规的公司,都不允许直接在master分支上开发。需要创建分支,在分支上开发,最后将代码合并回master。

# 分支常用命令

# 查看所有本地分支
git branch

# 创建新分支
git branch 分支名
# 比如,创建一个叫做login的分支
git branch login

# 切换分支
git checkout 分支名
# 比如,切换到login分支
git checkout login
# 比如,切换到master分支
git checkout master

# 删除分支(删除时,必须先切换到其他分支)
git branch -d 分支名
git branch -D 分支名  强制删除分支

# 创建并直接切换分支
git checkout -b 分支名

体验:

  • 创建并切换到dev分支上;在dev分支上,写点代码,提交一下。
  • 切换分支,查看两个分支的不同。

切换分支之前,必须把当前分支的代码全部提交到仓库。

# 快进合并(fast-forward)

特点:一个分支包含另一个分支的全部提交记录。

如果需要把dev分支的代码合并到master分支

  • 切换到master
  • 执行 git merge add ,即可把add分支的代码合并到master

合并之后,add和master分支的代码就回一样了。

# 三方合并(thirdparty merge)

  • 两个分支,比如是master和dev,特点是都有新的提交

  • 也就是说,一个分支不包括另一个分支的全部提交记录

  • 这种模式的合并,有可能会有冲突

  • 合并方法,和前面一样

    • 假设把dev的代码合并到master分支,切换到master git checkout master

    • 执行 git merge dev ,表示将dev分支的代码合并到当前(master)分支

    • 然后就会出现如下两个画面中的一种

      • 画面一:两个分支修改的代码不在同一个文件的同一行代码,出现下面的画面。

      image-2020071114803953

      • 画面二:两个分支修改了同一个文件的同一行代码,出现下面的画面。

      image-2020071117098994

出现上述画面一,表示已经合并完成了,但是需要提交一次;

出现的框是让我们输入提交说明;

需要执行下面的操作:

  • i ,进入 “插入” 模式,就可以对画面中的文字进行修改了(直接输入也行)
  • 按 “上下左右” 键,调整光标的位置,可以删除里面的内容,写自己的提交说明
  • 上述画面中的 # Please enter..... 表示注释,可以不用理会
  • Esc 键,退出 “插入” 模式
  • 直接输入 “:wq”,退出这个画面,从而完成合并。(一定是英文的冒号)

出现上述画面二,表示正在合并中,但是遇到冲突了;

需要在代码中解决掉冲突,然后保存代码;

最后,需要提交一次;

  • 打开有冲突的文件
  • 去掉分割线,保存代码,表示解决了冲突
  • 保存代码,执行 git add .git commit -m '提交说明' 从而完成这个合并。

# 远程仓库

# 注册码云或github账号

码云和github都提供仓库的托管服务。

区别是码云是国内的服务器,打开速度较快;github是国外的服务器,打开速度不能保证。

码云:https://gitee.com/

github:https://github.com/

自行去这两个网站注册账号,最好使用相同的邮箱 分别到码云和github上注册账号。

如果你不会在Github上注册,没关系,上课的时候,老师演示。

# 配置码云或github的SSH秘钥

我们向码云或github网站推送代码的时候,最好使用SSH的方案,这个方案需要提前配置好秘钥。下面是具体的配置方法。

任何文件夹位置,空白处右键,选择右键菜单中的 “Git Bash Here”,执行下面的命令,可以生成SSH秘钥(包含一个公钥一个私钥)

ssh-keygen -t rsa -C "你的邮箱地址"
# 比如
ssh-keygen -t rsa -C "tangfengpo@163.com"
# 执行完这个命令之后,后面有一些询问,我们直接一路回车即可

注意,回车执行命令,然后继续回车,回车....直至生成完毕~

最后生成的秘钥在:

Windows:
C:\Users\用户名\.ssh

mac:
你的用户名那个文件夹中。 按shift+Commend+.  可以显示隐藏文件,然后就可以看到 .ssh文件夹了

找到 .ssh/id_rsa.pub,用vscode打开,复制里面全部的内容,配置到远程仓库,做法如下:

  • GitHub右上角的三角号
  • Settings
  • 左侧有 SSH and GPG keys
  • 在显示的界面中,点击右上角的 New SSH key,然后完成添加公钥操作
  • 码云的配置方式和Github一样。

# 创建远程仓库

  • 码云
    • 右上角的 “+” ,选择新建仓库
    • 填写仓库名,选择公开
    • 点击创建按钮,创建。
  • github
    • 右上角的 “+” ,选择 “New repository”
    • 填写仓库名称
    • 点击创建按钮,创建。

# 推送代码到远程【首次】

  • 进入本地项目文件夹,右键 --> Git Bash Here,打开终端窗口。
  • 远程仓库地址有两个(https、ssh地址),一定要选择ssh地址。
  • 添加远程仓库地址(git remote add 远程仓库地址别名 完整的远程仓库SSH地址
  • 首次推送代码到远程仓库(git push -u origin master

只能把本地仓库的代码推送到远程仓库;不能把工作区的、暂存区的代码推到远程。

确保你的本地仓库有内容,别推送空的本地仓库。注意是本地仓库,不是工作区。

首次使用SSH,会出现如下画面,输入 “yes”,回车即可。后面就不会再有了。

image-2020081970633759

# 再次及后续推送

  • 工作区编写代码
  • 执行 add 命令,将代码添加到暂存区
  • 执行 commit 命令,将代码提交到本地仓库。(因为只有本地仓库的代码才能推送到远程)
  • 执行 git push 命令,将这次改动推送到远程仓库。

# 常见问题

  • 执行完“git remote add origin ssh地址”报错:fatal:remote origin already exists.
    • 叫做 origin 的远程地址以及存在了。不能再使用这个名字了。
    • 执行 git remote -v 查看所有的远程地址。
    • 可以选择性的 删除 远程地址。执行 git remote remove 别名,比如 git remote remove origin
  • 首次推送的时候,提示输入账号密码
    • 因为添加远程地址的时候,填错了,填成了 https 地址了。应该换成 ssh 地址。
    • 可以选择改过来,也可以使用https地址。下次做项目,再使用ssh地址也可以。

git remote add 那里,地址复制错了,能改吗?

# 查看所有可用的源(可用的远程地址)
git remote -v
# 删除一个源
git remote remove 远程仓库地址别名
# 然后重新添加新的地址
git remote add 远程仓库地址别名 SSH地址

我电脑上有两个本地项目(仓库),能推送到一个远程仓库吗?

没人这么干!!!!!!!!两个项目放一起,会出现混乱或者覆盖的呀!!!

推送总是不成功?

  1. 检查一下SSH秘钥配置好了吗

  2. 看看什么错误,直接把前因后果告诉老师吧~~~

  3. 实在不行,重新创建一个仓库试试,从头再来。

# 多人协作

# 管理员角色

  • 创建远程仓库 或 创建本地仓库之后推送到远程仓库
    • 初始化一个项目,git init
    • 添加初始的代码到暂存区 git add .
    • 提交初始的代码到本地仓库 git commit -m "提交了初始的代码"
  • 推送到远程仓库
    • git remote add origin SSH地址
    • git push -u origin master
  • 邀请成员
  • 开发(add / commit / pull / push)
    • 编辑自己的代码
    • 把修改后的代码,添加到暂存区 git add .
    • 把修改后的代码,推送到本地仓库 git commit -m "xxx"
    • 如果有人在你之前推送了,则推送之前需要先拉取,将拉取下来的代码和你的代码合并 git pull origin master
    • 合并如果有冲突,需要解决冲突,别忘记提交一次
    • 最后推送 git push origin master

# 成员角色

  • 同意邀请
  • 克隆项目到本地(注意路径)
    • 执行 git clone SSH地址 ,将项目克隆到本地。然后关闭黑窗口。
    • 进入项目文件夹,重新 git Bash Here 打开黑窗口,这样可以保证路径正确。
  • 开发(add / commit / pull / push)
    • 编辑自己的代码
    • 把修改后的代码,添加到暂存区 git add .
    • 把修改后的代码,推送到本地仓库 git commit -m "xxx"
    • 如果有人在你之前推送了,则推送之前需要先拉取,将拉取下来的代码和你的代码合并 git pull origin master
    • 合并如果有冲突,需要解决冲突,别忘记提交一次
    • 最后推送 git push origin master

# 附录

# Git忽略和移除文件

# 移除文件

只把文件从仓库中移除

git rm --cached 文件

把文件从工作区和仓库中同时移除

git rm -f 文件

# Git忽略文件

在项目中,创建 .gitignore 文件,它就是git的忽略文件,记录了哪些文件不被Git管理。

如果有的文件已经被Git管理了,而又想设置为忽略文件,则需要使用 git rm --cached 文件 将文件从仓库中移除才有效。

被成功忽略的文件,不会被添加到暂存区,不会被提交到本地仓库,不会被推送到远程仓库。这就是忽略的意思。

# 展示 .gitignore 的写法

# 忽略当前目录中的 test 文件夹
/test

# 忽略任何目录中的 test 文件夹
test/

# 忽略任何目录中的 png 图片
/**/*.png

# 分支和远程相关命令

# 推送分支

git push -u 仓库别名 本地分支:远程分支

# 比如,有个本地分支叫做 reg,推送到远程之后叫做 register
git push -u origin reg:register

# 如果本地分支和远程分支同名,可以省略 :远程分支
# 比如,有个本地分支叫做dev,推送到远程也叫做dev
git push -u origin dev


# 查看远程分支

git remote show 仓库别名

# 比如,查看一个叫做码云的远程仓库的分支
git remote show mayun

# 使用下面的命令也可以查看所有的分支,a表示all,所有的意思
git branch -a

# 跟踪(下载/检出)分支

git checkout 远程分支名

# 比如有个远程分支,叫做user,把他下载到本地也叫做user
git checkout user

# 比如有个远程分支,叫做user,把他下载到本地叫做user2
git checkout -b user2 origin/user

# 删除远程分支

git push origin --delete 分支名

# VSCode中的Git

点点鼠标,即可完成日常开发。

工作也基本够用了。

当你看到这里的时候,其实你可以不用马上记住那么多命令的。