Git的进阶学习
Posted codeplayer1999
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Git的进阶学习相关的知识,希望对你有一定的参考价值。
Git的学习进阶
详情可参考:Git 实用教程(小甲鱼)
***
目录
- 初次使用Git前的配置
- 理论基础
- Git入门实战
- 查看Git状态
- 添加版权协议
- 快照回滚
- 快照比较
- 修改最后一次提交
- 删除文件
- 重命名文件
- Git分支
- 匿名分支
- checkout和reset
- 延伸阅读
初次使用Git前的配置
*注意:如果在Git的配置中出现问题,建议参考ssh本地配置和本地缓存设置
- 在命令行模式里输入以下命令
git config --global user.name "用户名"
git config --global user.email "邮箱"
- 检验配置信息
git config --list
Git原生态的命令行模式和Git的界面模式区别: 大多数界面模式只实现Git的常用命令,而命令行模式拥有Git的所有命令
理论基础
与SVN记录的是每一次版本变动的内容不同,Git是将每个版本独立保存
- Git的工作流程
- 在工作目录中添加,修改文件
- 将需要进行版本管理的文件放入暂存区域
- 将暂存区域的文件提交到Git仓库
- Git管理的文件的三种状态:已修改(modified)、已暂存(staged)、已提交(committed)
Git入门实战
- 打开Git自带的命令行( 原B站小甲鱼教程使用的是电脑自带的命令行,但是个人发现Git自带的比较好,比如touch命令,Windows系统自带的好像不支持 )中,新建文件夹
mkdir 文件夹名
- 在命令行中进入该文件夹,在命令行中输入初始化信息
cd 文件夹名
git init
- 新建README.md文件,作为该项目的说明文件( 如果使用的是Windows系统自带的命令行,可能以下命令是不支持的 )
touch README.md
- 打开该文件
vi README.md
- 输入说明信息
This is a project!
- 将编辑模式(输入i)更改为命令行模式(先按Esc键,再输入:wq回车即可),此操作为回退到Git界面
- 将README.md文件放入暂存区域,再将文件提交到Git仓库
git add README.md
git commit -m "add a readme file"
查看Git状态
git status
添加版权协议
- 添加协议(文件名为LICENSE)
- 打开协议,操作即打开文件
- 输入MIT协议 内容,并回退到Git界面
- 查看Git状态,提示有未暂存文件
- 将文件放入暂存区域
git add LICENSE
- 查看Git状态,没有显示有未暂存文件
- 可撤回操作命令,以下命令表示撤回最近一次操作
git reset HEAD
- 查看Git状态,再次提示有未暂存文件
- 再次将文件放入暂存区域,同时再将其提交到Git仓库
- 查看Git状态,提示没有未提交文件
- 修改协议,增加个人版权信息,操作即打开文件,修改文件内容,完成后,回退到Git界面
- 查看Git状态,提示由于修改,导致文件与已提交至Git仓库的文件的内容不一致
- 覆盖文件内容命令,以下命令表示将以已提交至Git仓库的文件为依据,覆盖刚才的修改操作
git checkout -- LICENSE
- 重新打开协议文件,修改的个人版权信息被覆盖,即和已提交至Git仓库的文件一致
- 再次修改协议文件,并放入暂存区域
- 查看Git状态,提示文件已修改
- 再次修改协议文件,与上一次修改的内容不一致
- 再次查看Git状态,出现两种提示信息;表示此时出现两个版本的协议文件。一个存放在工作区域,另一个存放在暂存区域。此时,如果直接执行commit操作,提交的是步骤15所修改的文件;而如果先执行add操作,再执行commit操作,提交的是步骤17所修改的文件。此处可采用后者操作
- 查看历史提交,即查看commit信息,其中显示的黄色内容为SHA校验和,不同commit的校验和是不一致的,可以将其作为每次commit的唯一ID
git log
快照回滚
- 快照(术语,一个快照指的是一个版本),以下指令中HEAD(指针)指的是当前快照,HEAD~指的是上个快照。该指令的意思是将快照回滚到上一个快照
git reset HEAD~
补充 以下第一个指令是回滚两个快照;第二个指令是回滚三个快照;第三个指令也是回滚三个快照
~~~
git reset HEAD~~
git reset HEAD~~~
git reset HEAD~3
~~~
- reset命令的选项
- 以下命令是仅仅移动HEAD的指向,将其指向上一个快照
git reset --soft HEAD~
- 以下命令是指移动HEAD的指向,将其指向上一个快照;同时,将HEAD移动后指向的快照回滚到暂存区域( 该命令为默认命令,即可以省略[--mixed],效果不变 )
git reset --mixed HEAD~
- 以下命令是移动HEAD的指向,将其指向上一个快照;同时,将HEAD移动后指向的快照回滚到暂存区域;另外,将暂存区域的文件还原到工作目录( 具有危险性,会将最新修改或添加的文件覆盖掉甚至删除掉 )
git reset --hard HEAD~
- 回滚指定快照
以下指令是回滚到指定的快照ID号,输入的ID号只需输入5个以上即可; 该命令不仅可以回滚到过去, 也可以回滚到未来 (可以理解为取消之前的回滚操作, 如果涉及的文件在之前的回滚中被删除了,要加上[--hard],才能恢复 )
git reset 指定的版本快照ID号
git reset --hard 指定的版本快照ID号
- 回滚个别文件
注意 以下指令只是回滚个别文件,但HEAD( 指针 )不会回滚
git reset 版本快照 文件名/路径
快照比较
- 创建新的文件夹( 文件夹名为project2 )
- 进入文件夹,初始化Git
- 新建README.md文件和README2.md,并在文件中输入一定内容
- 将两个文件放入暂存区域,同时提交到Git仓库
git add README.md README2.md
git commit -m "add two file"
- 随意修改README.md和README2.md,以便接下来的比较操作
- 比较暂存区域和工作目录,输入以下指令
git diff
补充 当文件内容过多,单页显示不了全部时,可使用vim的快捷键:
输入键盘的【J】键,表示显示下一行
输入键盘的【K】键,表示显示上一行
输入键盘的【F】键,表示显示以单页内容向下移动
输入键盘的【B】键,表示显示以单页内容向上移动
输入键盘的【D】键,表示显示以半页内容向下移动
输入键盘的【U】键,表示显示以半页内容向上移动
输入小写的【g】,跳转到文件顶部
输入大写的【G】,跳转到文件底部
输入【数字+g/G】,跳转到文件顶部向下或者文件底部向上指定数字的那一行
输入键盘的【H】键,进入帮助文档,会给出所有的快捷键操作提示
输入键盘的【Q】键,即可退出文档
输入【?关键词】,表示从下往上搜索文件内容是否含有指定的关键词
输入【/关键词】,表示从上往下搜索文件内容是否含有指定的关键词,如同一关键词出现多次,输入小写【n】,跳转到下一个关键词;上一个则为大写【N】
- 比较随意的两个历史快照,输入以下指令
git diff 快照ID1 快照ID2
- 比较当前工作目录和Git仓库中的历史快照,输入以下指令
git diff 快照ID
- 比较当前工作目录和最新提交的快照,输入以下指令
git diff HEAD
- 比较暂存区域和Git仓库快照,输入以下指令
git diff --cached [快照ID]
补充 通常[--]后输入的是单词全写,[-]后输入的是单词首字母简写
修改最后一次提交
实际应用场景一:版本刚一提交(commit)到仓库,突然想起漏掉两个文件还没有添加(add)
实际应用场景二:版本刚一提交(commit)到仓库,突然想起版本说明写的不够全面,无法彰显本次修改的重大意义
解决方式 执行以下指令,进入修改文件内容,Git就会“更正”最近的一次提交,而不会添加一次新的提交记录
~~~
git commit --amend
git commit --amend -m "修改说明但不进入修改界面"
~~~
删除文件
- 随意删除一个文件,以便接下来的删除恢复操作
- 恢复文件,输入以下指令
git checkoout -- 文件名
- 删除文件,输入以下指令,该指令删除的只是工作目录和暂存区域的文件,也就是取消跟踪,在下次提交时不纳入版本管理
git rm 文件名
注意
- 期间删除的文件如果有提交到Git仓库的快照,是不会被删除的,需要再使用reset才能清楚该快照记录
git rm 文件名
git reset --soft HEAD~
- 如果新建一个文件,同时将文件放入暂存区域( 不提交到Git仓库 ),再次在工作区域中修改该文件。此时查看Git状态,将会出现两个版本信息。 如果此时采用指令删除文件,将不确定删除哪个版本的 如果确定要删除,需要使用以下指令暴力删除
git rm -f 文件名
- 删除暂存区域而保留工作区域的文件,使用以下指令
git rm --cached 文件名
重命名文件
不太正确的重命名方式 直接修改文件名将会Git出现错误提示( 提示删除原名文件同时添加重命名文件 ),此时重新改回旧文件名,又不会有错误提示了
正确的重命名方式 输入以下指令进行文件重命名
~~~
git mv 旧文件名 新文件名
~~~
上述指令等价于以下指令
~~~
ren/mv 旧文件名 新文件名
git rm 旧文件名
git add 新文件名
~~~
Git分支
其他版本控制系统的分支:克隆一份全新的目录以同样拥有5个分支来说,SVN是同时复制5个版本的文件,也就是说重复5次同样的动作,而Git只是获取文件的每个版本的元素,然后只载入主要的分支(master)。从小甲鱼的经验,克隆一个拥有仅一万个提交(commit),5个分支,每个分支有大约1500个文件的SVN,耗时近1小时,而Git只用区区1分钟
- 创建分支,通过以下指令
git branch 分支名
- 查看HEAD指向情况
git log --decorate
- 切换分支
git checkout 分支名
- 查看HEAD指向情况(精简版)
git log --decorate --oneline
- 以图形化形式查看分支情况
git log --decorate --oneline --graph --all
- 合并分支
git merge 分支名
注意 当自动合并分支失败时,可能是分支之间出现内容冲突,即分支之间相同的文件其内容不一致,导致无法合并,需要打开冲突文件手动解决冲突,然后再输入合并分支的指令
- 创建分支,同时切换到该分支
git checkout -b 分支名
- 删除分支
git branch -d 分支名
匿名分支
- 新建一个文件夹
- 在这个文件夹中,新建三个文件,分三次依次放入暂存区域,同时三次提交到Git仓库中
- 输入以下指令,Git会自动创建匿名分支HEAD
git checkout HEAD~
匿名分支 匿名分支是Git自动创建的,当切换到其他分支时,那么即便匿名分支中新建的文件提交到Git仓库中,也不会被保存,也就是消失了找不到了
匿名分支的作用 可以作为文件提交的实验性尝试,当一些文件提交存在风险的时候,可以先新建匿名分支,在这里的文件提交都不会对项目整体产生任何影响,确定文件内容可以使用时,再为匿名分支命名即可
checkout和reset
- checkout指令作用
- 从历史快照(或者暂存区域)中拷贝文件到工作目录中
- 切换分支(主要功能)
恢复文件区别:reset指令只将指定文件恢复到暂存区域[--mixed],而checkout指令会同时覆盖暂存区域和工作目录。因而, 在恢复文件方面,reset命令要比checkout命令更安全
注意 当使用 git reset --hard HEAD~ README.md 指令来同时覆盖工作目录时,会使用不了(这种情况下reset不被允许使用[--soft]或[--hard]选项)- 恢复快照区别:
- 对于 reset --hard 命令来说,checkout命令更安全。因为checkout命令在切换分支前会先检查一下当前的工作状态,如果不是“clean”的话,Git不会允许切换;而 reset --hard 命令则直接覆盖所有数据。
- 在如何更新HEAD指向,reset指令移动HEAD所在分支的指向,而checkout命令只是移动HEAD自身来指向另一个分支
延伸阅读
以上是关于Git的进阶学习的主要内容,如果未能解决你的问题,请参考以下文章
我的C语言学习进阶之旅解决 Visual Studio 2019 报错:错误 C4996 ‘fscanf‘: This function or variable may be unsafe.(代码片段