DayNode(Git)

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 仓库
截屏2021-07-07 下午3.18.32.png
git三种状态:

  • 已修改 modified

    • 表示修改了文件,但还没将修改的结果放到暂存区
  • 已暂存 staged

    • 表示对已修改文件的当前版本做了标记,使之包含在下次提交的列表中
  • 已提交 committed

    • 表示文件已经安全地保存在本地的 Git 仓库中

注意:

  • 文件只要被放到暂存区过了,就处于【被跟踪状态】
  • 工作区有【被跟踪】和【未被跟踪】的两种状态
  • 只要文件修改过,就在工作区了,需要重新提交到暂存区
  • 只有【被跟踪】的文件,才能通过git commit -a -m'备注'绕过暂存区,将工作区的文件提交到仓库

2. git基本操作

常见git命令.jpg

2.1 系统操作

安装权限

sudo
复制代码

命令快捷键

上箭头--上个命令
下箭头--下个命令
复制代码

切换路径

// 切换到下一级
cd 文件名

// 切换到上一级文件夹
cd ../文件名
复制代码

显示隐藏的文件

// 快捷键
shift+command+. 
复制代码

2.2 git操作

截屏2021-07-07 下午2.41.58.png

初始化仓库

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 的数字)

忽略清单.png

查看提交历史

# 按时间先后顺序列出所有的提交历史,最近的提交在最上面
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. 开源

开源和闭源.png

  • 开源是指不仅提供程序还提供程序的源代码

  • 闭源是只提供程序,不提供源代码

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 的软件项目有:jqueryNode.js

4. gitee

查看远程仓库的提交历史:项目->统计->提交

4.1 将本地仓库提交到远程仓库

00管理本地仓库中的远程地址.png

00远程分支操作.png
注意:

  • 如果文件没有修改,生成新的版本,就不能推到远程仓库中
  • 如果工作区更改了,要先提交到本地仓库,才能提交到远程仓库

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(推荐)

截屏2021-07-08 下午2.44.08.png

00远程仓库的两种验证方式.png

03使用公钥私钥验证整份的原理.png
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 将远程仓库克隆到本地

作用

  1. 创建项目文件夹,并‘解压’当前下载的版本,放到项目文件夹中
  2. 创建本地仓库会克隆远程仓库的所有版本历史
  3. 为本地仓库添加了远程仓库地址origin-当前下载使用的额地址
git clone 远程仓库的地址
复制代码

03.4【非常重要】使用ssh方式与远程仓库交流整体逻辑图.png

5. GIT本地分支

01【重要】分支图解.png

5.1 master 主分支

作用:用来保存和记录整个项目已完成的功能代码

因此,不允许程序员直接在 master 分支上修改代码,容易导致整个项目崩溃。

5.2 功能分支

专门用来开发新功能的分支,它是临时从 master 主分支上分叉出来的,当新功能开发且测试完毕后,最终需要合并到 master 主分支上

功能分支.png

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 远程仓库分支操作

05三种与远程仓库交互的方式.png

将本地分支推送到远程仓库

04远程仓库提交.png

# -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
复制代码
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享