Git的原理与使用(二)

目录

修改文件

版本回退

小测试

第一次修改提交

第二次修改提交 

第三次修改 

查看历史提交记录 

版本回退快的原因

撤销修改

位于工作区未add

已add未commit

已add且commit

删除文件

分支管理

理解分支 

创建分支

切换分支


修改文件

版本库是指maser

查看当前提交状态指令:git status

这里表示ReadMe被修改过了,但是还没提交 

显示版本库和工作区文件差异指令:git diff HEAD 文件名  

显示暂存区和工作区文件差异指令:git diff 文件名

  • a:表示修改前文件(a/ReadMe,改动前文件名是ReadMe)
  • b:表示修改后文件(b/ReadMe,改动后文件名仍然是ReadMe)
  • -:表示修改前
  • +:表示修改后
  • -1:展示改动前的第一行内容
  • +1,2:展示改动后从第一行开始到第二行的内容(1,2可被理解为行号的范围)

基本概念:工作区中文件的新增、修改或删除都是对工作区的修改

注意事项:Git追踪管理的是修改而不是整个文件

版本回退

基本概念:Git能管理历史版本文件,想要以前版本的文件就需要用到版本回退功能

指定退回某一次版本指令:git reset [选项] HEAD

本质是回退版本库的内容,工作区或暂存区是否回退由命令参数决定

常见选项:

  • --mixed:默认选项不用写,将暂存区内容退回为指定提交版本内容,工作区文件保持不变
  • --soft:将版本库回退到某个指定版本,不改变工作区和暂存区的内容
  • --hard:将暂存区和工作区的内容退回到指定版本
  • HEAD:可以直接写成commit id 表示指定退回的版本,HEAD表示当前版本,HEAD^表示上一版本,HEAD^^表示上上个版本......,也可以使用~数字表示,HEAD~0表示当前版本、HEAD~1表示上版本......

注意事项:

1、工作区有未提交的代码时不要用hard,否则无法找到未提交的代码

2、使用--hard将暂存区和工作区的内容退回到指定版本

2、hard还可以做后悔药(选择之前最新的commit id就能回退到原来的位置)

3、git reflog记录所有提交的指令

 4、git reflog得到的小串字符是原commit id的一部分,也可以通过它们进行回退

小测试

步骤:更新三个版本的ReadMe,并分别进行3次提交

第一次修改提交

第二次修改提交 

第三次修改 

查看历史提交记录 

        如果我们在提交完version3后,发现version3编写错误,想要退回version2,重新基于version2开始编写,即希望将工作区的内容退回到version2版本,故需要用到--hard参数:

        可以发现,此时ReadMede文件的内容已经退回到version2了,当前我们再次使用git log查看一下提交日志,发现最新的commit id是version2:

        如果我还想回到version3,但是此时version3的commit id我们已经无法通过git log找到了,Git为我们提供了一个git reflog指令帮我们记录了每一次命令:

        其中,1c7c46b是什么东西?它是version3的commit id的一部分,在版本回退的时候我们也可以使用commit id的一部分来代表目标版本:

版本回退快的原因

        Git内部有个指向当前分支(mastr)的HEAD指针,refs/heads/master文件中保存当前master分支的最新commit id,当我们回退时该指针指向的内容会根据我们的要求而改变:

撤销修改

问题:工作区写了很长时间代码,但是越来越写不下去自己写的太垃圾了,想要恢复到上一个版本

位于工作区未add

指令:git checkout -- 文件名

功能:将工作区的文件回退到上一次的版本

注意事项:--必须加,否则会变成另一种意思

已add未commit

指令:git reset HEAD 文件名

功能:将暂存区内容退回指定的版本内容,但工作区内容不变

        reset的回退还可以回退到当前版本,即跟版本库中内容保持一致,如果版本库中的内容是空,则工作区和暂存区中的内容也可以回到空

已add且commit

版本库中回撤到上一版本的前提条件是:commit之后没有push

push:将版本库中的内容提交到远程仓库(在实际使用时都是用远程仓库的,撤销修改的主要目的就是为了防止我们的劣质代码放入远程仓库)

删除文件

基本概念:在Git中删除也是一个修改操作,要让一个文件彻底消失要将它的暂存区中的内容也删

指令:git rm 文件名

功能:将文件从工作区和暂存区删除

        当您在 Git 中删除文件并提交这一更改时,实际上提交的是对该文件的删除操作。即使只提供一个简单的删除信息,Git 仍然能够识别并记录这个操作。

        当您执行 git commit -m "Remove file_name" 这样的命令后,Git 会创建一个新的提交记录,并将其中包含了指定文件被删除的信息。版本库中确实还保留着历史记录,但在最新提交中包含了对应文件被移除或者删除掉所做出更改

分支管理

理解分支 

基本概念:每次的提交会被串成一条时间线即分支,若只有一条分支,则它是主(master)分支

注意事项:

1、HEAD 指向当前工作目录状态(通常是某个 branch 的 tip),而 master 分支则表示项目历史记录中主要开发线上最后一次 commit 的位置

2、HEAD可以指向其它分支

创建分支

查看本地当前所有分支指令:git branch

*表示当前HEAD指向的是master分支,即当前工作分支 

新建分支指令:git branch 分支名 

此时dev分支和master分支指向同一个修改,这是因为dev分支是根据最新一次提交创建的

想要让dev分支指向一条另外的提交线,需要令HEAD指向dev分支 

切换分支

切换指令:git checkout 分支名

git checkout --表示撤销修改

接下来在dev分支下修改ReadMe文件,新增一行内容并进行一次提交:

现在dev分支完成工作,切换回master分支:

发现ReadMe文件中新增的内容不见了,但是在dev分支上该内容还在:

这是因为dev和master两者指向的提交是不一样的:

结论:因为我们是在dev分支上提交的,而master分支此时的提交点并未被改变,当切换至master分支时,HEAD就指向了master,当然看不见提交了

~over~

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-22 09:28:03       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-22 09:28:03       100 阅读
  3. 在Django里面运行非项目文件

    2024-03-22 09:28:03       82 阅读
  4. Python语言-面向对象

    2024-03-22 09:28:03       91 阅读

热门阅读

  1. RHCE 第二章 时间服务器

    2024-03-22 09:28:03       43 阅读
  2. docker基础(五)之docker run(第二弹)

    2024-03-22 09:28:03       41 阅读
  3. P1005 [NOIP2007 提高组] 矩阵取数游戏

    2024-03-22 09:28:03       40 阅读
  4. Ubuntu---之用户管理

    2024-03-22 09:28:03       43 阅读
  5. 在ubuntu22.04.4安装freeswitch1.10.10

    2024-03-22 09:28:03       42 阅读
  6. Lombok-@Singular 和 @Builder 组合

    2024-03-22 09:28:03       39 阅读
  7. 安卓利用CameraX 拍照获这张照片的exif信息

    2024-03-22 09:28:03       41 阅读
  8. php设计模式

    2024-03-22 09:28:03       40 阅读