Git的进阶学习

Posted codeplayer1999

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Git的进阶学习相关的知识,希望对你有一定的参考价值。

Git的学习进阶

详情可参考:Git 实用教程(小甲鱼)
***

目录

  1. 初次使用Git前的配置
  2. 理论基础
  3. Git入门实战
  4. 查看Git状态
  5. 添加版权协议
  6. 快照回滚
  7. 快照比较
  8. 修改最后一次提交
  9. 删除文件
  10. 重命名文件
  11. Git分支
  12. 匿名分支
  13. checkout和reset
  14. 延伸阅读

初次使用Git前的配置

*注意:如果在Git的配置中出现问题,建议参考ssh本地配置本地缓存设置

  • 在命令行模式里输入以下命令
git config --global user.name "用户名"
git config --global user.email "邮箱"
  • 检验配置信息
git config --list

Git原生态的命令行模式和Git的界面模式区别: 大多数界面模式只实现Git的常用命令,而命令行模式拥有Git的所有命令

理论基础

与SVN记录的是每一次版本变动的内容不同,Git是将每个版本独立保存

  • Git的工作流程
  1. 在工作目录中添加,修改文件
  2. 将需要进行版本管理的文件放入暂存区域
  3. 将暂存区域的文件提交到Git仓库
  • Git管理的文件的三种状态:已修改(modified)、已暂存(staged)、已提交(committed)

Git入门实战

  1. 打开Git自带的命令行( 原B站小甲鱼教程使用的是电脑自带的命令行,但是个人发现Git自带的比较好,比如touch命令,Windows系统自带的好像不支持 )中,新建文件夹
mkdir 文件夹名
  1. 在命令行中进入该文件夹,在命令行中输入初始化信息
cd 文件夹名
git init
  1. 新建README.md文件,作为该项目的说明文件( 如果使用的是Windows系统自带的命令行,可能以下命令是不支持的
touch README.md
  1. 打开该文件
vi README.md
  1. 输入说明信息
This is a project!
  1. 将编辑模式(输入i)更改为命令行模式(先按Esc键,再输入:wq回车即可),此操作为回退到Git界面
  2. 将README.md文件放入暂存区域,再将文件提交到Git仓库
git add README.md
git commit -m "add a readme file"

查看Git状态

git status

添加版权协议

  1. 添加协议(文件名为LICENSE)
  2. 打开协议,操作即打开文件
  3. 输入MIT协议 内容,并回退到Git界面
  4. 查看Git状态,提示有未暂存文件
  5. 将文件放入暂存区域
git add LICENSE
  1. 查看Git状态,没有显示有未暂存文件
  2. 可撤回操作命令,以下命令表示撤回最近一次操作
git reset HEAD
  1. 查看Git状态,再次提示有未暂存文件
  2. 再次将文件放入暂存区域,同时再将其提交到Git仓库
  3. 查看Git状态,提示没有未提交文件
  4. 修改协议,增加个人版权信息,操作即打开文件,修改文件内容,完成后,回退到Git界面
  5. 查看Git状态,提示由于修改,导致文件与已提交至Git仓库的文件的内容不一致
  6. 覆盖文件内容命令,以下命令表示将以已提交至Git仓库的文件为依据,覆盖刚才的修改操作
git checkout -- LICENSE
  1. 重新打开协议文件,修改的个人版权信息被覆盖,即和已提交至Git仓库的文件一致
  2. 再次修改协议文件,并放入暂存区域
  3. 查看Git状态,提示文件已修改
  4. 再次修改协议文件,与上一次修改的内容不一致
  5. 再次查看Git状态,出现两种提示信息;表示此时出现两个版本的协议文件。一个存放在工作区域,另一个存放在暂存区域。此时,如果直接执行commit操作,提交的是步骤15所修改的文件;而如果先执行add操作,再执行commit操作,提交的是步骤17所修改的文件。此处可采用后者操作
  6. 查看历史提交,即查看commit信息,其中显示的黄色内容为SHA校验和,不同commit的校验和是不一致的,可以将其作为每次commit的唯一ID
git log

快照回滚

  • 快照(术语,一个快照指的是一个版本),以下指令中HEAD(指针)指的是当前快照,HEAD~指的是上个快照。该指令的意思是将快照回滚到上一个快照
git reset HEAD~

补充 以下第一个指令是回滚两个快照;第二个指令是回滚三个快照;第三个指令也是回滚三个快照
~~~
git reset HEAD~~
git reset HEAD~~~
git reset HEAD~3
~~~

  • reset命令的选项
  1. 以下命令是仅仅移动HEAD的指向,将其指向上一个快照
git reset --soft HEAD~
  1. 以下命令是指移动HEAD的指向,将其指向上一个快照;同时,将HEAD移动后指向的快照回滚到暂存区域( 该命令为默认命令,即可以省略[--mixed],效果不变
git reset --mixed HEAD~
  1. 以下命令是移动HEAD的指向,将其指向上一个快照;同时,将HEAD移动后指向的快照回滚到暂存区域;另外,将暂存区域的文件还原到工作目录( 具有危险性,会将最新修改或添加的文件覆盖掉甚至删除掉
git reset --hard HEAD~
  • 回滚指定快照
    以下指令是回滚到指定的快照ID号,输入的ID号只需输入5个以上即可; 该命令不仅可以回滚到过去, 也可以回滚到未来 (可以理解为取消之前的回滚操作, 如果涉及的文件在之前的回滚中被删除了,要加上[--hard],才能恢复
git reset 指定的版本快照ID号
git reset --hard 指定的版本快照ID号
  • 回滚个别文件
    注意 以下指令只是回滚个别文件,但HEAD( 指针 )不会回滚
git reset 版本快照 文件名/路径

快照比较

  1. 创建新的文件夹( 文件夹名为project2
  2. 进入文件夹,初始化Git
  3. 新建README.md文件和README2.md,并在文件中输入一定内容
  4. 将两个文件放入暂存区域,同时提交到Git仓库
git add README.md README2.md
git commit -m "add two file"
  1. 随意修改README.md和README2.md,以便接下来的比较操作
  2. 比较暂存区域和工作目录,输入以下指令
git diff

补充 当文件内容过多,单页显示不了全部时,可使用vim的快捷键:

输入键盘的【J】键,表示显示下一行
输入键盘的【K】键,表示显示上一行
输入键盘的【F】键,表示显示以单页内容向下移动
输入键盘的【B】键,表示显示以单页内容向上移动
输入键盘的【D】键,表示显示以半页内容向下移动
输入键盘的【U】键,表示显示以半页内容向上移动
输入小写的【g】,跳转到文件顶部
输入大写的【G】,跳转到文件底部
输入【数字+g/G】,跳转到文件顶部向下或者文件底部向上指定数字的那一行
输入键盘的【H】键,进入帮助文档,会给出所有的快捷键操作提示
输入键盘的【Q】键,即可退出文档
输入【?关键词】,表示从下往上搜索文件内容是否含有指定的关键词
输入【/关键词】,表示从上往下搜索文件内容是否含有指定的关键词,如同一关键词出现多次,输入小写【n】,跳转到下一个关键词;上一个则为大写【N】

  1. 比较随意的两个历史快照,输入以下指令
git diff 快照ID1 快照ID2
  1. 比较当前工作目录和Git仓库中的历史快照,输入以下指令
git diff 快照ID
  1. 比较当前工作目录和最新提交的快照,输入以下指令
git diff HEAD
  1. 比较暂存区域和Git仓库快照,输入以下指令
git diff --cached [快照ID]

补充 通常[--]后输入的是单词全写,[-]后输入的是单词首字母简写

修改最后一次提交

实际应用场景一:版本刚一提交(commit)到仓库,突然想起漏掉两个文件还没有添加(add)
实际应用场景二:版本刚一提交(commit)到仓库,突然想起版本说明写的不够全面,无法彰显本次修改的重大意义

解决方式 执行以下指令,进入修改文件内容,Git就会“更正”最近的一次提交,而不会添加一次新的提交记录
~~~
git commit --amend
git commit --amend -m "修改说明但不进入修改界面"
~~~

删除文件

  1. 随意删除一个文件,以便接下来的删除恢复操作
  2. 恢复文件,输入以下指令
git checkoout -- 文件名
  1. 删除文件,输入以下指令,该指令删除的只是工作目录和暂存区域的文件,也就是取消跟踪,在下次提交时不纳入版本管理
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分钟

  1. 创建分支,通过以下指令
git branch 分支名
  1. 查看HEAD指向情况
git log --decorate
  1. 切换分支
git checkout 分支名
  1. 查看HEAD指向情况(精简版)
git log --decorate --oneline
  1. 以图形化形式查看分支情况
git log --decorate --oneline --graph --all
  1. 合并分支
git merge 分支名

注意 当自动合并分支失败时,可能是分支之间出现内容冲突,即分支之间相同的文件其内容不一致,导致无法合并,需要打开冲突文件手动解决冲突,然后再输入合并分支的指令

  1. 创建分支,同时切换到该分支
git checkout -b 分支名
  1. 删除分支
git branch -d 分支名

匿名分支

  1. 新建一个文件夹
  2. 在这个文件夹中,新建三个文件,分三次依次放入暂存区域,同时三次提交到Git仓库中
  3. 输入以下指令,Git会自动创建匿名分支HEAD
git checkout HEAD~

匿名分支 匿名分支是Git自动创建的,当切换到其他分支时,那么即便匿名分支中新建的文件提交到Git仓库中,也不会被保存,也就是消失了找不到了
匿名分支的作用 可以作为文件提交的实验性尝试,当一些文件提交存在风险的时候,可以先新建匿名分支,在这里的文件提交都不会对项目整体产生任何影响,确定文件内容可以使用时,再为匿名分支命名即可

checkout和reset

  • checkout指令作用
  1. 从历史快照(或者暂存区域)中拷贝文件到工作目录中
  2. 切换分支(主要功能)
  • 恢复文件区别:reset指令只将指定文件恢复到暂存区域[--mixed],而checkout指令会同时覆盖暂存区域和工作目录。因而, 在恢复文件方面,reset命令要比checkout命令更安全
    注意 当使用 git reset --hard HEAD~ README.md 指令来同时覆盖工作目录时,会使用不了(这种情况下reset不被允许使用[--soft]或[--hard]选项)

  • 恢复快照区别:
  1. 对于 reset --hard 命令来说,checkout命令更安全。因为checkout命令在切换分支前会先检查一下当前的工作状态,如果不是“clean”的话,Git不会允许切换;而 reset --hard 命令则直接覆盖所有数据。
  2. 在如何更新HEAD指向,reset指令移动HEAD所在分支的指向,而checkout命令只是移动HEAD自身来指向另一个分支

延伸阅读

以上是关于Git的进阶学习的主要内容,如果未能解决你的问题,请参考以下文章

我的C语言学习进阶之旅解决 Visual Studio 2019 报错:错误 C4996 ‘fscanf‘: This function or variable may be unsafe.(代码片段

转载从0开始学习 GitHub 系列之「Git 进阶」

大数据攻城狮之进阶技能-Github的使用

Git的进阶学习

我的OpenGL学习进阶之旅NDK开发中find_library查找的系统动态库在哪里?

我的OpenGL学习进阶之旅NDK开发中find_library查找的系统动态库在哪里?