准备工作
版本管理软件
- 作用
- 记录代码的版本,可以随时回退
- 实现多人协作,可以很轻松的合并代码
- 分类
- 集中式,典型代表 SVN
- 分布式,典型代表
Git
安装
略
配置用户名和邮箱
Git软件在工作的时候,需要知道你是谁?所以需要设置一个用户名和邮箱。
这个用户名和邮箱,最好使用你的github账号或码云账号,当然随便填也可以。
具体做法:
- 任何文件夹,空白处,右键 --> Git Bash Here
- 依次执行下面两行代码
# --global 会将配置项保存到用户配置
$ git config --global user.name "xxx"
$ git config --global user.email "xxx"
$ 不是命令命令的一部分,你只需要从 “git config …” 这里开始复制(或抄写)
Git初始化
目的是学习,所以,随便创建一个项目文件夹,打开项目文件夹
注意:一定要在项目文件夹
,右键–>Git Bash Here。
至于项目中有没有文件无所谓。
执行下面的命令:
# 初始化,表示使用Git管理我们的项目。这个命令只需要执行一次(注意空格)
git init
-
执行
git init
命令之后,会在项目文件夹中生成一个隐藏的.git
文件夹 -
Git 管理项目的每一次记录,都在
.git
文件夹里面保存着。所以这个文件夹不能删除 -
对于一个项目来说,
git init
只需要执行一次 -
没有初始化,就使用Git将会报如下错误
fatal: not a git repository (or any of the parent directories): .git
初体验
初始化之后,就可以使用Git来管理你的项目了。
-
假设我们开始开发了,项目中新增了很多文件,如上图。
-
用Git保存项目中的代码
git add . git commit -m '提交说明(此次提交了什么代码,功能是什么,其实就是注释)'
-
新增、删除或修改了代码(随便新增、删除或修改点代码),用Git保存修改后的代码
git add . git commit -m '提交说明'
-
新增、删除或修改了代码(随便新增、删除或修改点代码),用Git保存修改后的代码
git add . git commit -m '提交说明'
-
查看提交日志
# 查看详细日志记录 git log # 查看简略版的记录 git log --oneline # 清屏 clear
-
切换版本,在历史版本中穿梭
# 上述查看提交日志的时候,会看到每次提交的版本号,然后执行下面的命令即可完成版本穿梭 git checkout 版本号 # 如果只回退一个文件 git checkout 版本号 文件名
-
回到最后的提交状态
git checkout master
> 穿梭到历史的某个版本后,打开你的代码看看,是不是很神奇呢?
- 易错点
- 请注意,每个词之间有空格
- -m 是连在一起的
- “提交说明” 是字符串,要加引号,注意别用中文的引号。
三个区域
下面三个区域,是Git虚拟的区域,看不到,摸不着。
- 工作区
- 工作区,指的是使用Git管理后的文件,这些文件显示在磁盘上,供我们使用或修改的区域。所以,粗略的说,项目文件夹就是工作区。
- 暂存区域
- 执行
git add .
之后,文件由工作区,添加到了暂存区。 暂存区保存了下次将提交的文件列表信息。
- 执行
- Git 仓库区、本地仓库
- 执行
git commit -m '提交说明'
之后,代码会被提交到仓库区。仓库区是 Git 中最重要的部分,代码只有提交到仓库,才会形成一次历史记录,即才会形成一个版本。
- 执行
工作区新建的文件和Git没有任何关系;文件被添加到暂存区,才叫做被Git管理过
记录每次更新到仓库
添加文件到暂存区
新文件,只有添加到暂存区,才叫做被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 "提交日志"
撤销操作
撤销操作,只能恢复暂存区或工作区,与最近一次提交的代码一致。
# 恢复暂存区的指定文件到工作区
git checkout [file]
# 恢复暂存区的所有文件到工作区
git checkout .
# 恢复某个commit的指定文件到暂存区和工作区
git checkout [commit版本号] [file]
# 重置暂存区的指定文件,与上一次 commit 保持一致,但工作区不变
git reset [file]
# 重置暂存区与工作区,与上一次commit保持一致。该命令后不能加文件或文件夹
git reset --hard
回退到历史
上述操作,只能将代码撤销到与最近一次commit保持一致。如果想回退全部或某个文件到历史版本,就需要使用 checkout
命令了。
# 首先使用git log 或 git log --oneline 查看提交记录,获取版本号。
# 回退全部文件到历史版本
git checkout 版本号
# 回退指定文件到历史的某个版本
git checkout 版本号 文件名 [文件名.....]
学习了分支之后,才会讲如何修改历史。
目前,如果回到历史,并且修改了代码,那么只能add . 然后 commit 。
远程仓库
远程仓库说明
目前,我们的操作都是一个人开发,如果涉及到多人开发呢?大家的代码如何合并到一起呢?这个时候就需要公网上的一台服务器了,大家可以把代码提交到这台服务器上,也可以从服务器上拉取所有的代码。这个公网上的服务器就叫做远程仓库。
好在这个世界上有个叫 GitHub 的神奇的网站,从名字就可以看出,这个网站就是提供Git仓库托管服务的,所以,只要注册一个GitHub账号,就可以免费获得Git远程仓库。
实际上,除了GitHib,还有很多第三方远程仓库托管服务:
- GitHub(这个网站有时很难打开)
- 码云(gitee)(打开速度快)
- coding
- Gitlab
创建远程账号
略
配置SSH
在本地命令行,执行下面的命令,可以生成SSH秘钥(包含一个公钥一个私钥)
ssh-keygen -t rsa -C "你的邮箱地址"
# 执行完这个命令之后,后面有一些询问,我们直接一路回车即可
最后生成的秘钥在:
Windows:
C:\Users\用户名\.ssh
mac:
你的用户名那个文件夹中。 按shift+Commend+. 可以显示隐藏文件,然后就可以看到 .ssh文件夹了
找到 .ssh/id_rsa.pub
,用vscode打开,复制里面全部的内容,配置到远程仓库
- GitHub右上角的三角号
- Settings
- 左侧有 SSH and GPG keys
- 在显示的界面中,点击右上角的 New SSH key,然后完成添加公钥操作
新建远程仓库
将本地仓库中的代码推送到远程仓库(1)
只针对远程仓库是空的仓库。
- 创建一个
空的
远程仓库 - 复制 ssh 地址
- 终端中执行
git remote add origin ssh地址
,表示添加远程仓库地址到本地 - 首次推送
git push -u origin master
,刷新一下远程仓库,看看是否推送成功了
将本地仓库中的代码推送到远程仓库(2)
只针对,远程仓库一开始有东西的情况。
推送的是本地仓库的代码。工作区和暂存区的代码不会被推送到远程仓库
-
复制远程仓库的 ssh 地址
-
本地仓库中,执行
# 添加远程仓库地址,让我们的本地仓库和远程仓库建立关联 # origin 可以自定义 git remote add origin 远程仓库的ssh地址
-
首次推送之前,需要先拉取远程仓库的代码(README.md)到本地
git pull origin master --rebase
-
完成首次推送
# 如果远程没有本地的 分支,第一次推送,需要加 -u git push -u origin master
-
后续继续开发
# 改动了代码,先添加到暂存区 git add . # 提交到本地仓库 git commit -m 'xxxx' # 推送到远程仓库 git push
注意事项
- 什么时候需要先拉取,然后在推送
- 本地的提交记录中不包含远程的提交,需要先拉取,然后在推送
- 如果提示 “Are you sure you want to continue connecting (yes/no/[fi…])”
- 输入yes,回车
演示了一下,如何把一个本地仓库推送到码云和github
如果你想这么做,两个仓库最好都是空的仓库。当然非空的也行。
- 添加码云的远程仓库地址
git remote add origin ssh地址
- 添加github的远程仓库地址
git remote add origin2 ssh地址
- 后续推送
git push origin master
– 表示推送到码云git push origin2 master
– 表示推送到github
- 如果忘记了origin表示什么,origin2表示什么
- 可以使用
git remote -v
来查看远端的信息
- 可以使用
克隆远程仓库到本地
-
实际开发中,有些时候,我们需要把一个远程仓库克隆到本地
- 开发项目的时候,可以先创建远程仓库,然后克隆到本地,再进行开发
- 下载别人的代码的时候,可以选择克隆
- 多人合作开发的时候,需要克隆合作伙伴的代码到本地
-
克隆命令
git clone 远程仓库的ssh地址
克隆,相当于下载。
-
如果克隆的是自己的仓库,那么修改完代码,可以直接
add
、commit
、push
多人协作
- 可以先创建远程仓库
- 【可选】我先把基础的代码推送到远程仓库
- 合作者,需要把远程仓库的代码,克隆到你的计算机中
- 管理员邀请合作者共同来开发
- 合作者,需要同意
- 然后,管理员和合作者,都可以向远程仓库推送代码
- 推送之前,
必须先拉取
。 - 拉取之后,如果有冲突,解决冲突,必须add、commit一次。
- 最后推送。
- 推送之前,
如果遇到:
这表示,拉取远程的代码到本地,然后和本地的代码合并,出现这个窗口并非是有冲突,而是让我们写点说明来解释为什么需要合并。
解决办法有如下两个(一个简单粗暴,一个复杂):
- 直接关闭窗口,然后从新
git bash here
- 如果你真的想写点解释,点击 “i” ,进入编辑模式,按上下左右键,调整光标的位置,然后修改里面黄色的内容,注意字数不能太多。按esc,退出编辑模式,继续按 “:wq” ,表示保存,并退出的意思。
后续,可以push。
分支管理
什么是分支
随着git提交的次数越来越多,就会形成由各个版本连接而成的一条提交线。如下图:
由Git提交而形成的提交线,称为分支。默认的分支是主分支,叫做 master
,前面的学习,一直是在 master
分支上提交。
我们也可以创建其他分支,新创建的分支,相当于
是原分支的一个拷贝。
实际开发中
- 为了保证代码的安全性,不允许在主分支上进行开发
- 需要创建其他分支,在其他分支上进行开发,这样不会影响主分支上的代码
- 其他分支开发完成后,可以选择将其他分支代码合并到主分支上
- 分类
- 主分支(master / dev)
- 主题分支(一般用于开发新功能、新的模块)
- hotfix分支(用于解决bug)
创建其他分支
# 查看所有分支
git branch
git branch -f # 可以查看到所有分支(包括远程分支)
# 创建分支
git branch 分支名
# 比如
git branch dev
# 切换分支到dev
git checkout dev
# 切换到master分支
git checkout master
# 也可以创建并直接切换分支
git checkout -b dev
切换分支之前,需要把当前分支的工作全部提交,否则不允许切换到其他分支。
实际开发中,鼓励多使用分支。
快进模式合并两个分支
快进模式合并
- 两个分支A和B
B分支包含A分支的所有版本
,在合并的时候,叫做快进模式合并。- 快进模式合并,相当于使用B分支的代码覆盖A分支的代码;同时版本也会更新到A分支
两个分支合并,比如把 B 分支 合并到A分支上
- 需要先切换到A分支
- 然后执行
git merge B
,表示把B分支的代码合并到A分支上。
# 切换到A分支
git checkout A
# 把B分支的代码合并到A分支
git merge B
合并模式合并两个分支
合并模式
- 两个分支A和B
- A分支有独立的提交,B分支也有独立的提交,在合并的时候,叫做合并模式的合并。
- 合并模式,有可能会产生冲突;如果出现冲突,需要解决冲突,然后需要
添加
、提交
一次,从而完成合并。
两个分支合并,比如把 B 分支 合并到A分支上
- 需要先切换到A分支
- 然后执行
git merge B
,表示把B分支的代码合并到A分支上。 - 如果看到
CONFLICT
,则表示有冲突,需要打开有冲突的文件,手动解决冲突
,然后添加、提交即可。
# 切换到A分支
git checkout A
# 把B分支的代码合并到A分支
git merge B
如果有冲突,会显示如下提示:
手动打开有冲突的文件,解决冲突,保存文件。(手动解决)
再次添加(add操作)提交(commit),即可完成合并。
其他相关命令
# 查看所有分支(本地分支)
git branch
# 查看所有分支(包括远程分支)
git branch -f
# 删除分支(需要先切换到其他分支,然后在执行删除)
git branch -d 分支名
# 创建并直接切换分支
git checkout -b dev
如果要切换分支,必须把当前分支的代码全部提交到本地仓库。