个人网站 可以做论坛吗,怎样用dw做网站导航条,服务器网站配置,下载app1 Git相关概念
1.1
以下所谈三个区#xff0c;文件并不只是简单地在三个区转移#xff0c;而是以复制副本的方式转移 使用 Git 管理的项目#xff0c;拥有三个区域#xff0c;分别是
Working area工作区#xff08;亦称为 工作树Working Tree#xff09;、stage area …1 Git相关概念
1.1
以下所谈三个区文件并不只是简单地在三个区转移而是以复制副本的方式转移 使用 Git 管理的项目拥有三个区域分别是
Working area工作区亦称为 工作树Working Tree、stage area 暂存区(亦称为 index 索引)、Git 仓库
对应地Git 中的文件有三种状态
modified 已修改 若工作区的文件被修改了但还没有放到暂存区就是 modified 状态。staged 已暂存 若被修改的文件已经从工作区到了暂存区就是 staged 状态因此我们也可以说文件处于暂存区 文件是 staged 状态。此外Git 会为 staged 状态的文件打上标记以使其包含在下次 commit 的列表中committed 已提交 表示文件已经 “复制一份” 到了本地 Git 仓库中
1.2 HEAD、工作树Working Tree、分支Branch、索引
Working Tree 实际就是 working area
Branchbranch可以有多个其本质上是一个指向 commit 对象的可变指针
HEADHEAD只能有一个其本质上是一个指向 正在工作中的本地 branch 的可变指针
简单来讲就是你现在在哪儿HEAD 就指向哪儿
更具体来说HEAD指针指向我们所在的 branch当我们在某个 branch 上创建新的 commit 时branch 指针总是会指向当前 branch 的最新 commit
所以HEAD指针 ——– branch 指针 ——– 最新 commit
例如当前我们处于 master 分支所以HEAD这个指针指向了master分支指针 2. 命令
2.1 add 命令
add是个多功能的命令主要有如下 3 个功效
① 可以用它开始跟踪新文件并放到暂存区
② 把已跟踪的、且已修改的文件放到暂存区
③ 把有冲突的文件标记为已解决状态
此外当存在多个文件需要添加到暂存区时是采用
git add . git commit 默认会将暂存区所有文件一并 commit
2.2 commit
Git 标准的工作流程是工作区 → 暂存区 → Git 仓库但有时候这么做略显繁琐此时可以跳过暂存区直接将工作区中的修改提交到 Git 仓库这时候 Git 工作的流程简化为了工作区 → Git 仓库
Git 提供了一个跳过使用暂存区域的方式 只要在提交的时候给 git commit 加上 -a 选项Git 就会自动把所有已经跟踪过的文件暂存起来一并提交从而跳过 git add 步骤
git commit -a -m 日志信息2.3 status
git status 命令无法直接显示 committed 文件的状态它主要关注的是当前工作目录和staging area 中文件的状态。
当执行 git status 时会显示以下信息
已修改但未 add 到 staging zone 的文件已 add 到staged zone 但未 commit 到 Git 仓库的文件untracked 文件即不在版本控制下的新文件
对于已经 commit 的文件如果它们没有新的未 commit 的改动git status 将不会报告它们的存在因为它默认那些文件干净的。
2.8 log和reflog
git log //查看所有版本记录
#显示内容过多会自动进入多屏显示控制方式空格向下翻页 、b 向上翻页 、q 退出git log --prettyoneline //每个历史压缩到一行内显示此时只显示 hash 值和备注git log --oneline //与上面的区别是 hash 值只显示一部分git reflog //显示历史只显示一行,并且显示指针(要移动到版本多少步)3. 删除操作
删除也分几种情况。
2.11.1 手动删除本地文件
首先我么应把删除也视为一种【修改】。
因此如果文件已经纳入 Git 管理我们右键删除了文件后能在 Git中查询到记录并且为了完成删除我们需要 add 和 commit这个删除操作
比如我们直接右键删除文件此时用status命令应查到 add commit 完成删除操作并且能在日志查询到该记录
2.11.2 用命令删除
#从 Git 仓库、暂存区、工作区中同时移除对应的文件即 index.js
git rm -f index.js#只从 Git 仓库和暂存区中移除指定的文件但保留工作区中的文件即 index.css 文件
git rm --cached index.cssD 代表已删除代表 untracked即只存在于工作区等待 add
4. 版本控制
版本控制其实无非就是对commit、修改、删除的一种回退并且回退这三者的操作是一致的
4.1 reset 命令 reset 命令是无痕的。 这句话意思是当我们使用 reset 命令回退版本后既无法通过 log 命令查询这次回退的本身的记录也无法查询回退跳过的记录
例如 在下面的例子中Git 仓库中已经对 html 和 txt 文件都完成了同步。 此时我们使用 --hard 进行全局回退当回退完成后以外部视角来看既看不出使用 reset 命令进行过回退也不知道曾经存在过 有 txt 文件的一个分支 –soft 实际应用场景 修改 commit 信息commit的代码是正确的但是想修改 commit 附带的信息可以使用 git reset --soft HEAD^ 命令来重置分支指针并修改提交信息然后重新提交因为工作区和暂存区还是最新的代码。
合并 commit之前的 commit 都是正确的每次 commit 一句诗依次 commit 了四次这种情况下工作区、暂存区、Git 仓库都是4句诗。但是我们想合并四次 commit 为一次。由于工作区和暂存区都保存了正确的四句诗我们用 --soft 将 Git仓库回退到0句诗再 commit 一次暂存区这样就将四句诗合并到一次 commit 了。
–mixed 实际应用场景 **取消暂存区的修改**如果你不小心将修改添加到了暂存区可以使用 git reset HEAD 命令将指定文件的修改从暂存区移除然后重新add commit 。此时该命令与git restore --staged 作用类似 举例来说Git 仓库中有12 号诗工作区错误写成了 124号诗并且还 add 到了暂存区。此时mixed 模式将Git 仓库和工作区回退到2号阶段Git本来就是 2 号因此不发生改变然后再将工作区改为123号并 add commit这样最终工作区、暂存区、Git 仓库都同步为了正确的123
撤销部分 commit如果你只想撤销部分 commit 可以使用 git reset --mixed HEAD~n 命令将最近的 n 次 commit reset 为指定commit然后手动 add 需要保留的修改到暂存区最后 commit。
–hard 实际应用场景
撤销错误的提交如果你提交了错误的代码可以使用 git reset --hard HEAD^ 命令来撤销提交并删除所有的修改然后重新提交正确的代码。 回退到历史版本如果你想回退到某个历史版本并且不需要保留任何修改可以使用 git reset --hard 命令来重置当前分支到指定的提交。
4.2 restore 对于第4/5条简单演示如下
创建了一个 txt 文件并且已经同步到 Git 仓库成为第二个版本 此时目标是 仅在工作区中 删除 txt 文件 使用restore -s HEAD~1指定回复上一个版本的 txt 文件覆盖到工作区而显然上个版本并不存在 txt 文本因此自然就删除了该版本工作区中的 txt 文本且不回退 Git 仓库。
4.3 应用
4.3.1 工作区、暂存区、Git 仓库已经同步的情况下误删除了本地文件即工作区文件
目的是恢复工作区文件显然用 restore 命令的1、2、4、5都可以
例如。先将 txt文件 add 并 commit然后右键删除本地文件此时
#该命令仅撤销工作区的修改由于三库已经同步又仅仅误删了工作区的文件因此用不带参数的restore
git restore a.txt4.3.2 修改了工作区中的文件且 add 到了暂存区但是想要撤销这个add
目的是撤销暂存区的修改但Git仓库和工作区保持不变此时用3还可以用以前的reset
例如不小心在文件中写了 “老板是个大煞笔”并且已经 add 到暂存区了如果再继续commit 的话第二天就面临失业的风险 Changes to be committed 代表该文件在暂存区中等待 commit
1git restore --staged 首先人家已经给了提示use “git restore --staged …” to unstage 意思就是这句命令可以撤销 add 这个操作 执行带有 --staged 参数的命令后再查看状态Changes not staged for commit 代表该文件在工作区中等待 add 已经成功撤销暂存区中的内容。
2git reset HEAD 【file name】 前述已经提到这种方法只能撤销暂存区的修改与我们的需求完全一致
git reset HEAD index.txt4.3.3 删除了工作区中的文件且最终 commit 到了 Git 仓库但是想要撤销这个 commit
其实就是全局回退restore 命令已经无法实现了
利用上述提到的 reset --hard 实现
5. 忽略文件与版本号
忽略文件 一般我们总会有些文件无需纳入 Git 的管理也不希望它们总出现在未跟踪文件列表。 在这种情况下我们可以创建一个名为 .gitignore 的配置文件列出要忽略的文件的匹配模式。
文件 .gitignore 的格式规范如下
① 以 # 开头的是注释
② 以 / 结尾的是目录
③ 以 / 开头防止递归
④ 以 ! 开头表示取反
⑤ 可以使用 glob 模式进行文件和文件夹的匹配glob 指简化了的正则表达式
星号 * 匹配零个或多个任意字符 [abc] 匹配任何一个列在方括号中的字符 此案例匹配一个 a 或匹配一个 b 或匹配一个 c 问号 ? 只匹配一个任意字符 两个星号 ** 表示匹配任意中间目录比如 a/**/z 可以匹配 a/z 、 a/b/z 或 a/b/c/z 等 在方括号中使用短划线分隔两个字符 表示所有在这两个字符范围内的都可以匹配比如 [0-9] 表示匹配所有 0 到 9 的数字
版本号
每一次Commit对应一个 40 位长的版本号在对更改内容使用 SHA -1 加密算法后得到的。 这样根据版本号可以避免内容被篡改。
其次, 根据版本号的前两位在.git/objects 文件夹中可以找到本次 Commit 的记录。
6.分支操作