共计 8651 个字符,预计需要花费 22 分钟才能阅读完成。
基本的Linux命令
cd
改变目录cd..
回退到上一个目录,直接cd进入默认目录pwd
显示当前所在的目录路径ls(ll)
都是列出当前目录中的所有文件,只不过ll(两个ll)列出的内容更为详细touch
新建一个文件如touch index.html
就会在当前目录下新建一个 index.html 文件rm
删除-个文件,rm index.html
就会把 index.html 文件删除- mkdir 新建一 个目录,就是新建一 个文件夹。
rm-r
删除一个文件夹,rm -r src
删除 src 目录mv
移动文件,mv index.html src index.html
是我们要移动的文件,src 是目标文件夹,当然这样写必须保证文件和目
标文件夹在同一目录下reset
重新初始化终端/清屏clear
清屏history
查看命令历史help
帮助exit
退出#
表示注释
Git基本理论
工作区域
Git本地有三个工作区域:工作目录( Working Directory)、暂存区(Stage/index)、资源库(Repository或Git Directory),如果在加上远程的git仓库(Remote Directory)就可以分为四个工作区域,文件在这四个区域之间的转换关系如下:
Workspace
:工作区,就是你平时存放项目代码的地方index/Stage
:暂存区,用于临时存放你的改动,事实上它只是一个文件,保存即将提交到文件列表信息Repository
:仓库区(或本地仓库),就是安全存放数据的位置,这里面有你提交到所有版本的数据,其中HEAD指向最新放入仓库的版本Remote
:远程仓库,托管代码的服务器,可以简单的认为是你项目组中的一台电脑用于远程数据交换
创建工作目录与常用指令
工作目录( WorkSpace)一般就是你希望Git帮助你管理的文件夹,可以是你项目的目录,也可以是一 个空目录,建议不要有中文
日常使用只要记住下图6个命令:
本地仓库搭建
# 在当前目录下新建一个Git代码库
$ git init
# 执行后可以看到,仅在项目目录下多出了.git目录,关于版本等所有信息都在这个目录里
克隆远程仓库
# 克隆一个项目和它的整个代码历史(版本信息)
$ git clone [url]
Git 文件操作
查看文件状态
# 查看指定文件状态
$ git status [filename]
# 查看所有文件状态
$ git status
# 添加所有文件到暂存区
$ git add .
# 提交暂存区中的内容到本地仓库 -m提交信息
$ git commit - m "[提交信息]"
gitee
git config --global user.name "用户名"
git config --global user.email "你的邮箱地址"
// 初始化仓库
git init
// 把本地文件放到暂存区
git add .
// 把本地文件放到本地仓库里面
git commit -m "提交信息"
// 链接远程仓库
git remote add origin 你新建的仓库地址
// 把本地仓库的文件推送到远程仓库 push
git push -u origin master
// 查看原始的fetch和push路径
git remote -v
// 更换新的仓库地址
git remote set-url origin https://github.com/xxx/xxx.git
// 查看所有提交历史以一行显示
git log --oneline -a
// 查看已暂存的和未暂存的修改
git diff
// git diff:比较工作区和暂存区的文件
// git diff --cached(--staged):比较暂存区和已提交的文件
// git diff HEAD:比较工作区和当前最近历史提交
// 列出所有配置信息
git config --list
// 修改默认编辑器
git config --global --replace-all core.editor "'编辑器路径.exe'"
// 中文乱码问题
// 文件名显示错误[\346\226\260\346]
git config --global core.quotepath false
// 输出日志乱码
git config --global i18n.commitEncoding utf-8
git config --global i18n.logOutputEncoding utf-8
// 配置环境变量:set LC_ALL=C.UTF-8
Git 基本概念
Git 中三个状态
- 工作区的文件被修改了,但还没有放到暂存区,就是已修改状态
- 如果文件已修改并放入暂存区,就属于已暂存状态
- 如果Git仓库中保存着特定版本的文件,就属于已提交状态
基本的 Git 工作流程
- 在工作区修改文件
- 将想要下次提交的更改进行暂存
- 提交更新,找到暂存区的文件,将快照永久性存储到Git仓库中
Git 基础
配置用户信息
# 用户名
git config --global user.name "Joe"
# 邮件地址
git config --global user.email "Joe______outlook.com"
如果使用了
--global
选项,那么该命令只需要运行一次,即可永久有效
Git 全局配置文件
通过 git config --global user.name
和 git config --global user.email
配置的用户名和邮箱地址,会被写入到 C:/Users/用户名文件夹/.gitconfig
中
这个文件夹是Git的全局配置文件,配置一次即可永久生效
检查配置信息
# 查看所有的全局配置
git config --list --global
# 查看指定的全局配置
git config user.name
git config user.email
获取帮助信息
# 想要打开 git config 命令的帮助手册
git help config
# 想要获取 git config 命令的快速参考
git help config -h
获取 Git 仓库的两种方式
- 将尚未进行版本控制的本地目录转换为Git仓库
- 从其他服务器克隆一个已存在的Git仓库
在现有目录中初始化仓库
git init
工作区中文件的4种状态
Git操作的终极结果:让工作区的文件都处于 “未修改” 的状态
检查文件的状态
可以使用 git status
命令查看文件处于什么状态
在状态报告中可以看到新建的 index.html
文件出现在 Untracked files
(未跟踪文件) 下面
未跟踪的文件意味着Git在之前的快照(提交)中没有这些文件;Git不会将之纳入跟踪范围,除非明确地告诉它 “我需要使用 Git 跟踪管理该文件”
以精简的方式显示文件状态
使用 git status
输出的状态报告很详细。但有些繁琐;如果希望已精简的方式显示文件的状态,可以使用以下两条完全等价的命令,其中 -s
是 --short
的简写形式
# 以精简的方式显示文件状态
git status -s
git status --short
未跟踪文件前面有红的 ??
标记:
跟踪新文件
使用 git add 跟踪文件的名字
git add index.html
此时在运行 git status
命令,会看到 index.html 文件在 Changes to be committed
这行的下面,说明已被跟踪,并处于暂存状态;已精简的方式显示文件的状态新添加到暂存区中的文件前面有绿色的 A 标记
提交更新
现在暂存区中有一个 index.html 文件等待被提交到Git仓库中进行保存;可以执行 git commit -m "提交描述信息"
命令进行提交
git commit -m "新建了index.html文件"
提交成功后,会显示如下信息:
提交成功后再次检查文件的状态,得到的提示如下:
证明工作区中的所有文件都处于 “未修改” 的状态,没有任何文件需要被提交
对已提交文件进行修改
目前,index.html 文件已经被 Git
跟踪,并且工作区和 Gi
t仓库中的 index.html 文件内容保持一致;当我们修改了工作区中的 idnex.html 的内容之后,再次运行 git status
和 git status -s
命令,会看到如下的内容:
文件 index.html 出现在 “Changes not staged for commit” 这行下面,说明已跟踪文件的内容发生了变化,还没有放到暂存区
暂存已修改的文件
目前,工作区的 index.html 文件已修改,如果要暂存这次修改,需要再次运行 git add
命令,这个命令是个多功能的命令,主要有如下 3 个功效:
- 可以用它开始跟踪新文件
- 把已跟踪的。且已修改的文件放到暂存区
- 把有冲突的文件标记为已解决状态
提交已暂存的文件
再次运行 git commit -m "提交描述消息"
命令,即可将暂存区中记录的 index.html 的快照,提交到 Git
仓库中进行保存
撤销对文件的修改
撤销对文件的修改指的是:把对工作中对应的文件的修改 ,还原成 Git
仓库中所保存的版本
操作的后果:所有的修改会消失,且无法恢复!危险性比较高,谨慎操作!
git checkout -- 指定修改的文件名
撤销操作的本质是:用Git仓库中保存的文件,覆盖工作区指定的文件
向暂存区中一次性添加多个文件
git add .
取消暂存的文件
如果想要从暂存区中移除对应的文件,可以使用如下命令:
# 移除指定文件
git reset HEAD 要移除的文件名称
# 移除所有文件
git reset HEAD .
跳过使用暂存区域
Git 标准的工作流程是 工作区 → 暂存区 → Git仓库,但有时候怎么做略显繁琐,此时可以跳过暂存区,直接将工作区的修改提交到Git仓库,这时候Git工作流程简化为了 工作区 → Git仓库
Git 提供了一个跳过使用暂存区域的方式,只要在提交的时候这样写 git commit -a -m "提交描述信息"
,Git 就会自动把所有已经跟踪过的文件暂存起来一并提交,从而跳过 git add
步骤
git commit -a -m "提交描述信息"
移除文件
- 从 Git 仓库和工作区中同时移除对应的文件
- 只从 Git 仓库中移除指定的文件,但保留工作区中对应的文件
# 从 Git 仓库和工作区中同时移除 index.js 文件
git rm -f index.js
# 只从 Git 仓库中移除 index.css 但保留工作区中的 index.css 文件
git rm --cached index.css
忽略文件
有些文件无需纳入 Git 管理,也不希望它们总出现未跟踪文件列表;在这种情况下,可以创建一个名为 .gitignore
的配置文件,列出要忽略的文件的匹配模式文件 .gitigonre
的格式规范如下
- 以
#
开头的是注释 - 以
/
结尾的是目录 - 以
/
开头防止递归 - 以
!
开头表示取反 - 可以使用 glob 模式 进行文件的文件夹的匹配(glob简化了的正则表达式)
glob
模式
- 星号
*
匹配零个或多个任意字符 [abc]
匹配任何一个列在方括号中的字符(此案例匹配一个a或匹配一个b或匹配一个c)- 问号
?
只匹配任意一个字符 - 在方括号中可以使用短划线分隔两个字符,表示所有在这两个字符范围内的都可以匹配(比如[0-9]表示匹配0到9所有的数字)
- 两个星号
**
表示匹配任意中间目录(a/**/z 可以匹配a/z、a/b/z或a/b/c/z等)
.gitignore 文件例子
# 忽略所有的 .a 文件
*.a
# 但跟踪所有的 lib.a 即使在前面忽略了 .a 文件
!lib.a
# 只忽略当前目录下的 TODO 文件 而不忽略 subdir/TODO
/TODO
# 忽略任何目录下名为 build 的文件夹
build/
# 忽略 doc/notes.txt 但不忽略 doc/server/arch.txt
doc/*.txt
# 忽略 doc/ 目录及其所有子目录下的 .pdf 文件
doc/**/*.pdf
查看提交历史
# 按时间先后顺序列出所有的提交历史,最近的提交排在最上面
git log
# 只展示最新的两条提交历史,数字可以按需进行填写
git log -2
# 在一行上展示最近两条提交的历史信息,并自定义输出格式
# %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>
Git 基础小结
- 初始化
Git
仓库命令
⚪git init
- 查看文件状态命令
⚪git status
或git status -s
- 一次性将文件加入暂存区命令
⚪git add .
- 将暂存区的文件提交到Git仓库的命令
⚪git commit -m "提交消息描述"
Github
什么是开源
开源许可协议
开源并不意味着完全没有了限制,为了限制使用者的使用范围和保护作者的权力,每个开源项目都应该遵守开源许可协议(Open Source License)
常见的五种开源协议
- BSD(Berkeley Software Distribution)
- Apache Licence 2.0
- GPL(GNU General Public License)
具有传染性的一种开源协议,不允许修改后和衍生的代码做为闭源的商业软件发布和销售
使用GPL的最著名的软件项目上:Linux
- LGPL(GNU Lesser General Pubilc License)
- MIT(Massachusetts Institute of Technology,MIT)
是目前限制最少的协议,唯一的条件:在修改后的代码或者发行包中,必须包括原作者的许可信息
使用MIT的软件项目有:jQuery、Node.js
远程仓库的两种访问方式
- HTTPS:零配置,但是每次访问仓库时,都需要重复输入账号的密码才能访问成功
- SSH:需要进行额外的配置,但是配置成功后,每次访问仓库时,不需要重复输入账号密码
基于HTTPS将本地仓库上传到Github
基于SSH将本地仓库上传到Github
- SSH key 的作用:实现本地仓库和Github之间的免登录的加密传输
- SSH key 的好处:免登录身份认证。数据加密传输
- SSH key 由两部分组成,分别是:
- id_rsa(私钥文件,存放于客户端的电脑中即可)
- id_rsa.pub(公钥文件,需要配置到Github中)
生成SSH key
- 打开 Git Bash
2 .粘贴以下命令ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
,并将 your_email@example.com 替换为注册 Github 账号时填写的邮箱 - 连续敲击回车3次,即可在 C:\Users\用户名文件夹.ssh 目录中生成 id_rsa 和 id_rsa.pub 两个文件
生成的SSH key 配置到 Github 中
- 使用记事本打开
id_ras.pub
文件,复制里面的文本内容 - 在浏览器登录Github,点击头像 → Setting → SSH and GPG Keys → New SSH key
- 将
id_rsa.pub
文件中的内容,粘贴到 Key 对应的文本框中 - 将 Title 文本框中任意填写一个名称,来标识这个 Key 从何而来
检测 Github 的 SSH key 是否配置成功
打开 Git Bash ,输入以下命令并回车执行
ssh -T git@github.com
上述命令执行成功后,可能看到以下提示信息
输入 yes 之后,如果能看到类似于下面的提示消息,证明 SSH Key 已经配置成功了
将远程仓库克隆到本地
打开Git Bash,输入以下命令并回车执行
git clone 远程仓库的地址
Git 分支
在进行多人协作开发的时候,为了防止相互干扰,提高协同合作开发的体验,建议,每个开发者都基于分支进行项目功能的开发,例如:
master || main 主分支
在初始化Git仓库的时候,Git默认已经帮我们创建一个名字叫做master || main 的分支,通常把这个分支叫做主分支
主分支的作用是:用来保存和记录整个项目已完成的功能代码
因此,不允许程序员直接在主分支上修改代码,因为这样做的风险太高,容易导致整个项目崩溃
功能分支
由于程序员不能直接在主分支上进行功能的开发,所以就有了功能分支的概念
功能分支指的是专门用来开发新功能的分支,它是临时从主分支上分叉出来的,当新功能开发且测试完毕后,最终需要合并到主分支上,如图所示:
本地分支操作
查看分支列表
使用以下命令,可以查看当前Git仓库中所有的分支列表:
git branch
运行结果如下所示:
分支名字前面的
*
号表示当前所处的分支
创建新分支
使用以下命令,可以基于当前分支,创建一个新的分支,此时,新分支中的代码和当前分支完全一样
git branch 分支名称
切换分支
使用以下命令,可以切换到指定的分支上进行开发
git checkout 切换的分支名称
速创建和切换分支
使用以下命令,可以创建指定名称的新分支,并立即切换到新分支上
# -b 表示创建一个新分支
# checkout 表示切换到刚才新建的分支上
git checkout -b 分支名称
git checkout -b 分支名称
是下面两条命令的简写形式:
git branch 分支名称
git checkout 分支名称
合并分支
功能分支的代码开发测试完毕之后,可以使用以下的命令,将完成的代码合并到主分支上:
# 1. 切换到 main 分支
git checkout main
# 2. 在 main 分支上运行 git merge 命令,将 login 分支的代码合并到 main 分支上
git merge login
假设要把C分支的代码合并到A分支上,则必须先切换到A分支上,在运行 git merge 命令,来合并C分支
删除分支
当把功能分支的代码合并到主分支上以后,就可以使用以下命令,删除对应的功能分支:
git branch -d 分支名称
遇到冲突时的合并分支
如果在两个不同的分支中,对同一个文件进行了不同的修改,Git 就没法干净的合并它们;此时,需要打开这些包含冲突的文件然后手动解决冲突
# 假设:在把 reg 分支合并到 master 分支期间,代码发生了冲突
git checkout master
git merge reg
# 打开包含冲突的文件,手动解决冲突之后,再执行以下命令
git add .
git commit - m "解决了分支合并冲突的问题"
将本地分支推送到远程仓库
如果是第一次将本地分支推送到远程仓库,需要运行以下命令:
# -u 表示把本地的分支和远程分支进行关联,只在第一次推送的时候需要带 -u 参数
git push -u 远程仓库的别名 本地分支名称:远程分支名称
# 实际案例
git push -u origin payment:pay
# 如果希望远程分支的名称和本地分支名称保持一致,可以对命令进行简化
git push -u origin payment
第一次推送分支需要带 -u 参数,此后可以直接使用 git push 推送代码到远程分支
查看远程仓库中所有的分支列表
git remote show 远程仓库名称
跟踪分支
跟踪分支指的是:从远程仓库中,把远程分支下载到本地仓库中
# 从远程仓库中,把对应的远程分支下载到本地仓库。保持本地分支和远程分支名称相同
git checkout 远程分支名称
# 示例:
git checkout pay
# 从远程仓库中,把对应的远程分支下载到本地仓库,并把下载的本地分支进行重命名
git checkout -b 本地分支名称 远程仓库名称/远程分支名称
# 示例:
git checkout -b payment origin/pay
拉取远程分支的最新的代码
把远程分支最新的代码下载到本地对应的分支中:
# 从远程仓库,拉取当前分支最新的代码,保持当前分支的代码和远程分支代码一致
git pull
删除远程分支
删除远程仓库指定的分支:
# 删除远程仓库中,指定名称的远程分支
git push 远程仓库名称 --delete 远程分支名称
# 示例:
git push origin --delete pay
总结
- Git基本使用命令
git init
git add .
git commot -m "提交描述消息"
git status 和 git status -s
- Github创建和维护远程仓库
# 配置 Github SSH 访问
# 将本地仓库上传到 Github
- Git分支基本使用
git checkout -b 新分支名称
git push -u origin 新分支名称
git checkout 分支名称
git branch
变基
变基: 将本分支上引入的补丁和修改,在新 base 上再应用一次。
变基的特点
- 变基和合并的最终结果没有任何区别,但是变基使得历史更加整洁。
- 变基原则:不要对在你的仓库外有副本的分支执行变基。
- 变基与合并:变基是将一系列提交按照原有次序依次应用到另一分支上,而合并是把最终结果合在一起
变基命令
项目分叉
可以提取在 C4 中引入的补丁和修改,然后在 C3 的基础上再应用一次
# 将当前分支变基到 master
git checkout experiment
git rebase master
# 人工解决冲突
# 将文件添加到暂存区
git add *
# 继续变基过程
git rebase --continue
原理:首先找到这两个分支(即当前分支 experiment、变基操作的目标基底分支 master)的最近共同祖先 C2,然后对比当前分支相对于该祖先的历次提交,提取相应的修改并存为临时文件,然后将当前分支指向目标基底 C3, 最后以此将之前另存为临时文件的修改依序应用。
回到 master 分支,进行一次快进合并
# 主分支快进
git checkout master
git merge experiment
一般这样做的目的是为了确保在向远程分支推送时能保持提交历史的整洁。