1. git基础概念
Git
是一个开源的分布式版本控制系统特点:项目越大越复杂,协同开发者越多,越能体现出 Git 的高性能和高可用性!
1.1 git安装
git安装
配置用户信息
git config --global user.name "itheima"
git config --global user.email "itheima@itcast.cn"
复制代码
检查配置信息
# 查看所有的全局配置项
git config --list --global
# 查看指定的全局配置项
git config user.name
git config user.email
复制代码
1.2 git特性
① 直接记录快照(完整备份),而非差异比较
- Git 快照是在原有文件版本的基础上重新生成一份新的文件,类似于备份。为了效率,如果文件没有修改,Git 不再重新存储该文件,而是只保留一个链接指向之前存储的文件。
- 缺点: 占用磁盘空间较大
- 优点: 版本切换时非常快
- 特点: 空间换时间
② 近乎所有操作都是本地执行
-
断网后依旧可以在本地对项目进行版本管理
-
联网后,把本地修改的记录同步到云端服务器即可
1.3 git区域|状态
git三个区域: 工作区、暂存区、Git
仓库
git三种状态:
-
已修改
modified
- 表示修改了文件,但还没将修改的结果放到暂存区
-
已暂存
staged
- 表示对已修改文件的当前版本做了标记,使之包含在下次提交的列表中
-
已提交
committed
- 表示文件已经安全地保存在本地的 Git 仓库中
注意:
- 文件只要被放到暂存区过了,就处于【被跟踪状态】
- 工作区有【被跟踪】和【未被跟踪】的两种状态
- 只要文件修改过,就在工作区了,需要重新提交到暂存区
- 只有【被跟踪】的文件,才能通过
git commit -a -m'备注'
绕过暂存区
,将工作区
的文件提交到仓库
2. git基本操作
2.1 系统操作
安装权限
sudo
复制代码
命令快捷键
上箭头--上个命令
下箭头--下个命令
复制代码
切换路径
// 切换到下一级
cd 文件名
// 切换到上一级文件夹
cd ../文件名
复制代码
显示隐藏的文件
// 快捷键
shift+command+.
复制代码
2.2 git操作
初始化仓库
git init
复制代码
查看当前项目的状态
git status
// 以精简的方式显示文件状态 -s是--short的简写
git status -s
红色【??】--未跟踪的文件
红色【M】--已修改,但还没放到暂存区中
绿色【M】--已修改,且已放到暂存区中
绿色【A】--新增文件,已放到暂存区
【D】--删除标记
复制代码
将文件添加到本地仓库的暂存区
中
// 添加单个文件
git add 文件名(包含后缀)
// 添加所有文件
git add .
复制代码
将暂存区
的文件生成一个版本放到仓库
里
git commit -m'备注'
// 将`工作区`的文件直接提交到`仓库`(绕过暂存区)
git commit -a -m'备注'
复制代码
撤销对文件的修改(撤销后文件在工作区)
#注意:撤销了之后,文件无法恢复
git checkout -- index.html
复制代码
取消暂存的文件
git reset HEAD 文件名
复制代码
移除文件
1. 从git仓库和工作区中 同时移除文件
// 将工作区的文件删除,且在暂存区中 标记该文件为 删除【绿D】(在仓库里还没有真正被删除)
git rm -f 01.js
// 生成新的版本,并将暂存区 标记为 删除【绿D】的文件删除后,从此该文件真正被删除
git commit -m'删除了01.js文件'
2. 只从git中移除 在工作区中保留文件
git rm --cached 02.js
复制代码
.gitignore忽略文件
有些文件无需纳入
Git
的管理,也不希望它们总出现在未跟踪文件列表。
① 以 # 开头的是注释
② 以 / 结尾的是目录
③ 以 / 开头防止递归
④ 以 ! 开头表示取反
⑤ 可以使用 glob 模式进行文件和文件夹的匹配(glob 指简化了的正则表达式)
- 星号 * 匹配零个或多个任意字符
[abc]
匹配任何一个列在方括号中的字符 (此案例匹配一个 a 或匹配一个 b 或匹配一个 c)- 问号 ? 只匹配一个任意字符
- 两个星号 ** 表示匹配任意中间目录(比如 a/**/z 可以匹配 a/z 、 a/b/z 或 a/b/c/z 等)
- 在方括号中使用短划线分隔两个字符, 表示所有在这两个字符范围内的都可以匹配(比如 [0-9] 表示匹配所有 0 到 9 的数字)
查看提交历史
# 按时间先后顺序列出所有的提交历史,最近的提交在最上面
git log
# 只展示最新的两条提交历史,数字可以按需进行填写
git log -2
# 在一行上展示最近两条提交历史的信息
git log -2 --pretty=oneline
# 在一行上展示最近两条提交历史信息,并自定义输出的格式
# &h 提交的简写哈希值 %an 作者名字 %ar 作者修订日志 %s 提交说明
git log -2 --pretty=format:"%h | %an | %ar | %s"
复制代码
回退到指定的版本
# 【查看当前和之前的版本】在一行上展示所有的提交历史
git log --pretty=oneline
# 使用 git reset --hard 命令,根据指定的提交 ID 回退到指定版本
git reset --hard <CommitID>
# 【查看所有版本】在旧版本中使用 git reflog --pretty=oneline 命令,查看命令操作的历史
git reflog --pretty=oneline
# 再次根据最新的提交 ID,跳转到最新的版本
git reset --hard <CommitID>
复制代码
3. 开源
-
开源是指不仅提供程序还提供程序的源代码
-
闭源是只提供程序,不提供源代码
3.1 开源许可协议
Open Source License,为了限制使用者的使用范围和保护作者的权利
BSD
(Berkeley Software Distribution)Apache Licence 2.0
GPL
(GNU General Public License) (⭐⭐⭐)- 具有传染性的一种开源协议,不允许修改后和衍生的代码做为闭源的商业软件发布和销售
- 使用
GPL
的最著名的软件项目是:Linux
LGPL
(GNU Lesser General Public License)MIT
(Massachusetts Institute of Technology, MIT) (⭐⭐⭐)- 是目前限制最少的协议,唯一的条件:在修改后的代码或者发行包中,必须包含原作者的许可信息
- 使用 MIT 的软件项目有:
jquery
、Node.js
4. gitee
查看远程仓库的提交历史:项目->统计->提交
4.1 将本地仓库提交到远程仓库
注意:
- 如果文件没有修改,生成新的版本,就不能推到远程仓库中
- 如果工作区更改了,要先提交到本地仓库,才能提交到远程仓库
4.1.1 基于HTTPS
1. 关联远程仓库
git remote add 别名 远程仓库地址
git remote add origin HTTPS信息
git remote add originSSH SSH信息
- 查看origin
git remote
- 查看HTTPS信息
git remote get-url origin master
- 查看SSH信息
git remote get-url originSSH master
2. 首次提交到远程仓库
git push -u origin master
非首次提交
git push
如果都存在,默认是通过https提交,如果要通过ssh提交
git push -u originSSH master
3. 删除已经建立的联系
git remote remove origin
复制代码
4.1.2 基于SSH key
(推荐)
SSH key
的作用:实现本地仓库和 Github
之间免登录的加密数据传输。
SSH key
的好处:免登录身份认证、数据加密传输。
SSH key
由两部分组成,分别是:
① id_rsa
(私钥文件,存放于客户端的电脑中即可)
② id_rsa.pub
(公钥文件,需要配置到 Github
中)
生成公钥
找到ssh文件夹下的id_rsa.pub文件
$open ~/.ssh
复制代码
生成 sshkey
ssh-keygen -t rsa -C "xxxxx@xxxxx.com"
// 注意:这里的 xxxxx@xxxxx.com 只是生成的 sshkey 的名称,并不约束或要求具体命名为某个邮箱。
复制代码
查看 ~/.ssh/id_rsa.pub
文件内容,
cat ~/.ssh/id_rsa.pub
复制代码
将公钥复制添加到远程仓库中(gitee/github)
4.2 将远程仓库克隆到本地
作用
- 创建项目文件夹,并‘解压’当前下载的版本,放到项目文件夹中
- 创建本地仓库会克隆远程仓库的
所有版本
历史 - 为本地仓库添加了远程仓库
地址origin
-当前下载使用的额地址
git clone 远程仓库的地址
复制代码
5. GIT本地分支
5.1 master 主分支
作用:用来保存和记录整个项目已完成的功能代码。
因此,不允许程序员直接在
master
分支上修改代码,容易导致整个项目崩溃。
5.2 功能分支
专门用来开发新功能的分支,它是临时从
master
主分支上分叉出来的,当新功能开发且测试完毕后,最终需要合并到master
主分支上
5.3 分支命令操作
注意:
只要文件修改了,就需要提交到缓存区于仓库
查看分支列表
分支名字前面的 * 号表示当前所处的分支。
git branch
复制代码
创建新分支
基于当前分支,创建一个新的分支,不会切换分支
,此时,新分支中的代码和当前分支完全一样
git branch 分支名称
复制代码
切换分支
注意:
切换分支时,会切换工作区代码
git checkout 分支名称
复制代码
创建并切换分支
# -b 表示创建一个新分支
# checkout 表示切换到刚才新建的分支上
git checkout -b 分支名称
复制代码
合并分支
注意:
要先切换分支,再合并
# 1. 切换到 master 分支
git checkout master
# 2. 在master 分支上运行 git merge 命令,将 login 分支的代码合班到 master 分支
git merge login
复制代码
删除本地仓库的分支
需要在主分支
上删除
git branch -d 分支名称
复制代码
解决分支合并时的冲突问题
如果在两个不同的分支中,对同一个文件进行了不同的修改,Git 就没法干净的合并它们。 需要打开这些包含冲突的文件然后手动解决冲突。
# 假设:在把 login 分支合并到 master 分支期间
git checkout master
git merge login
# 打开包含冲突的文件,手动解决冲突之后,再执行如下命令
git add .
git commit -m "解决了分支合并冲突的问题"
复制代码
5.4 远程仓库分支操作
将本地分支推送到远程仓库
# -u 表示把本地分支和远程分支进行关联,只在第一次推送的时候需要带 -u 参数
git push -u 远程仓库的别名 本地分支名称:远程分支名称
# 实际案例
git push -u origin payment:pay
git push -u origin login// 本地分支名字与远程分支名字一样
# 如果希望远程分支的名称和本地分支名称保持一致,可以对命令进行简化
git push -u origin payment
复制代码
**注意:**第一次推送分支需要带 -u 参数,此后可以直接使用 git push
推送代码到远程分支。
查看远程仓库中所有的分支列表
git remote show 远程仓库名称
复制代码
跟踪分支(⭐⭐⭐)
从远程仓库中,把远程分支下载到本地仓库中。
# 示例
git checkout pay
# 从远程仓库中,把对应的远程分支下载到本地仓库,并把下载的本地分支进行重命名
git checkout -b 本地分支名称 远程仓库名称/远程分支名称
# 示例
git checkout -b payment origin/pay
复制代码
拉取远程分支的最新的代码
# 从远程仓库,拉取当前分支最新的代码,保持当前分支的代码和远程分支代码一致
git pull
复制代码
删除远程仓库的分支
# 删除远程仓库中,制定名称的远程分支
git push 远程仓库名称 --delete 远程分支名称
# 示例
git push origin --delete login
复制代码