Git版本管理系列:(一)使用Git管理单分支

目录

Git‌ 是一个分布式版本控制系统(DVCS),用于跟踪文件的变更并协调多人协作开发‌,由 Linus Torvalds 于 2005 年创建。为什么要学习使用Git?因为软件开发中必不可少的是版本迭代以及团队协作,并且现在很多开源软件的下载也依赖于Git方法。因此,只要是个程序员就应该要掌握使用Git进行版本管理的方法,是绕不开必须学会的技能。

基础概念介绍

预计Git系列一共出三篇文章,分别是单分支的使用、多分支,以及连接远程仓库。本篇文章是开篇,介绍Git在单分支版本管理中的基础使用方法帮助新手快速入门Git,更全面的指令介绍请参考官方的手册。

Git是一个用来进行程序版本迭代管理的软件,什么叫版本管理?写程序的过程一般都是先写个初版,然后再不断地进行改进,如果没有Git那么就需要人为地进行手动管理,比如手动对之前版本的文件进行复制保存,如果要进行版本回退的话再手动去查找之前的存档,如果版本很多的话这个过程会很繁琐,复杂。Git的出现就是帮我们进行这个版本迭代的管理,并且能很轻松地和其他人一起进行同一个项目的开发。

Git进行版本迭代与管理的工作流程如上图所示。简单来说就是先将本地工作区的文件(修改过的)添加进暂存区,再将暂存区的文件提交到仓库内。仓库里装着最终确定存储的代码。

那为什么要有暂存区?直接把更改后的代码提交到仓库内不行吗?我们可以看到暂存区位于工作目录和本地仓库之间,起到了缓冲和筛选变更‌的作用‌。例如有时候我们代码只需要提交对某个文件的修改,而项目中的其他文件不需要更改,就可以选择性地将工作目录中的变更添加到暂存区中,再由暂存区提交到仓库。并且,暂存区是提交前的"准备区",开发者可以在这里检查和管理即将提交的变更‌,提高安全性。总之,暂存区是git的一个机制,遵守就好了

Git的使用就是围绕上图这个工作流开展的。

仓库的创建

要对项目进行版本管理首先需要创建一个仓库,Git中创建仓库最常用的两种方法如下:

  1. git init即在项目的文件夹下打开git bash,并在其中输入这条指令。git 将创建一个本地仓库,工程目录下将生成一个.git隐藏文件夹注意,千万不要乱动隐藏文件夹
  2. git clone xxxx 这是从远程仓库克隆的指令,比如从github等网站上克隆开源项目。使用这条指令能一键将远程仓库的项目完完整整地下载到本地。

创建隐藏目录

有时候项目文件夹下的有些文件并不需要进行同步管理,比如一些日志以及编译产生的中间文件等,这时候就需要对这些文件进行隐藏了,让它们不同步到代码仓库内。

git中主要通过.gitignore文件来决定文件是否同步到仓库。

.gitignore 文件的基本语法‌

‌1. 忽略单个文件‌:直接写入文件名,例如 secret.txt‌

2‌. 忽略目录‌:在目录名后加上斜杠 /,例如 node_modules/‌

3‌. 忽略特定类型的文件‌:使用通配符 *,例如 *.log 会忽略所有 .log 文件‌。

‌4. 忽略特定路径下的文件‌:在规则前加上路径,例如/temp/*会忽略根目录下 temp 目录中的所有文件‌。

‌5. 否定规则‌:在规则前加上 ! 表示不忽略匹配的文件或目录,例如 !important.log‌
如果想把已经提交到仓库中的某个文件忽略,具体做法如下:

  1. 确认该文件在仓库中git ls-files 如果输出的有文件的名字就说明已经提交到仓库里了。
  2. 将要忽略的文件名添加进.gitignore文件中,并添加进缓存区git add .gitignore
  3. 使用git rm -r --cached <文件/目录路径>将需要忽略的文件/目录从缓存区删除。
  4. 提交缓存区代码。

添加代码到暂存区

git add .add后面加需要添加的目录文件名等,这里的.代表把所有更新了的文件提交到暂存区,也可以自行指定。

提交代码到仓库

git commit -m "本次更新的内容",-m意思是添加版本更新的备注,理论上可以不写,但一般情况下都需要写,就跟贴了条形码的答题卡上依然要手写姓名班级一样。

提交记录查询

git log即可查询提交记录。但git log 不能查看回退过的记录,其展示的是目前有效的版本迭代。如果要查询所有的提交记录(包括回退,以及其他分支的提交记录),请使用git reflog

并且可以使用git log --name-only筛选出具体提交的文件名。

比较差异

git diff指令用来比较三个区之间的文件差异,包括文件的数目(宏观)以及具体到文件的内容(微观)。

  1. git diff默认比较工作区与暂存区之间的文件数目差异。
  2. git diff -- 文件1 文件2 文件n用来具体比较工作区与暂存区之间,这几个文件的内容差异。
  3. git diff <版本哈希值>用来比较工作区与指定版本之间的差异。
  4. git diff <版本哈希值> -- 文件1 文件2用来比较工作区与指定版本之间这几个文件的内容差异。

标签

代码每一次提交都意味着做出了新的修改,这是量变的过程。量变产生质变,标签就是用来标记程序开发质变的节点的版本别名。在git中常用标签来用附注标记程序的稳定版本。标签的命名遵循语义化版本(如 v<主版本>.<次版本>.<修订号>)‌。

  1. 添加标签
     标签分为轻量标签以及附注标签、并且也可以基于当前提交或者历史提交。
    *

    轻量标签添加:git tag <tagname> ,这种添加方式是基于当前提交的,如果要基于某个版本需要在后面添加上提交记录,例如:
    git tag v0.9 abc1234 ,abc1234是提交记录,使用git log 或者git reflog查看。轻量标签仅作为提交的指针,不存储额外信息‌。

    • 附注标签添加:git tag-a <tagname> -m <message>,例如git tag -a v1.0.0 -m "Release version 1.0.0",附注标签包含作者、日期和描述信息,适合正式版本‌。

  2. 删除标签
    git tag -d <tagname>这是删除本地的标签,git push origin --delete <tag_name>用于删除远程库内的标签。
  3. 查看标签
    列出所有标签:git tag
    查看标签详情:git show <tagname>

常用的操作就是这些,详细内容推荐一篇博客

文件删除

删除文件最常用的是bash指令中的rm指令,一般有rm -rf 文件/目录 ,f表示直接删除,r表示删除目录(默认rm只能删文件,需要加-r递归删目录)。git也有删除命令git rm ,主要是可以删除缓存区以及仓库内的文件和目录,bash指令只能用在工作区。
git rm <filename>:删除工作区与暂存区的文件(相当于rm加add操作,版本库中删除就直接提交删过的暂存区就好了)。
git rm --cached <filename>删除暂存区的某个文件,常用于把已经提交到仓库中的某个文件忽略,即错误地将某个文件添加到了暂存区,希望将其从版本控制中移除,但仍然保留在本地工作区中。

版本回退

版本回退主要使用git reset命令,回退的主要原理是修改HEAD指针的位置(HEAD指针默认指向当前工作的仓库版本)回退版本后的版本都会清除。

回退分三种:第一种hard,即强硬的回退,除了仓库版本会回退,工作区与暂存区的内容也会回退(即当前工作区的内容也会被还原到指定版本)。第二种soft,软回退,就把当前的仓库版本回退到指定版本,工作区与暂存区内容不变。第三种mixed(默认),即把仓库版本以及暂存区都进行回退,工作区内容保存。

  1. git reset --hard <指定版本哈希值>
  2. git reset --soft <指定版本哈希值>
  3. git reset --mixed <指定版本哈希值>

版本哈希值也可以使用HEAD^来指代上个版本,HEAD^^来指代上上个版本。另外还有撤销回退的操作:
git checkout -- <filename>该命令会将指定文件(filename)恢复到最近一次 git commit 或 git add 时的状态,丢弃工作区对该文件的所有未暂存修改。例如:
git checkout HEAD^ -- filename 恢复到上一次提交的版本‌
git checkout branchname -- filename 恢复为指定分支的版本‌

总结

本章涉及单分支下版本管理的各类简单操作基本覆盖百分之八十以上的使用场景。不要把git学习当成理论学习,权当查字典学习就好了,必须要不断实践才可能掌握的。附涉及命令总结:

bash 复制代码
git init #初始化仓库
git clone <url> #从远程仓库初始化本地仓库
git add . #提交所有文件到暂存区
git commit -m "message" #把暂存区文件提交到仓库

git tag #查看所有标签
git show <tagname> #查看某一标签详情
git tag <tagname> #为当前版本打上标签
git tag <tagname> <版本哈希> #为指定版本打上标签
git tag -a <tagname> -m "tag_message" <版本哈希> #为指定版本打上附注标签
git tag -d <tagname> #删除指定标签

git log #查看提交记录
git log --name-only#筛选提交记录名称
git reflog #查看所有更改记录

git diff #比较工作区和暂存区的文件数目差异
git diff -- filename1 filename2 #比较工作区和暂存区指定文件内容差异
git diff <版本哈希值> #比较工作区与指定版本文件数目差异
git diff <版本哈希值> -- filename1 filename2 #比较工作区与指定版本文件内容差异

git rm -rf files/folders #从工作区和缓存区删除文件或者文件夹
git rm --cached #删除暂存区内容
git rm --cached <filename> #删除暂存区文件

git reset --hard <版本哈希值> #硬回退到指定版本,工作区暂存区都回退
git reset --soft <版本哈希值> #软回退,只有仓库回退
git reset --mixed <版本哈希值> #默认回退,仓库和暂存区回退
git checkout --filename #将文件恢复到最近一次commit版本
git checkout HEAD^ -- filename #恢复到上一次提交的版本‌
git checkout branchname -- filename #恢复为指定分支的版本‌
相关推荐
Elastic 中国社区官方博客36 分钟前
如何在不同版本的 Elasticsearch 之间以及集群之间迁移数据
大数据·数据库·elasticsearch·搜索引擎·全文检索·logstash
坤小满学Java38 分钟前
【从0到1学Elasticsearch】Elasticsearch从入门到精通(上)
elasticsearch
2401_8784545338 分钟前
Themeleaf复用功能
前端·学习
星星火柴93644 分钟前
数据结构:哈希表 | C++中的set与map
数据结构·c++·笔记·算法·链表·哈希算法·散列表
与己斗其乐无穷2 小时前
刷题记录(3)C语言中的字符
c语言·学习
搬砖工程师Cola2 小时前
<C#>在 C# .NET 6 中,使用IWebHostEnvironment获取Web应用程序的运行信息。
开发语言·c#·.net
没有啥的昵称3 小时前
从源码安装ROS的serial包(替换github的方案)
c++
八了个戒4 小时前
「数据可视化 D3系列」入门第三章:深入理解 Update-Enter-Exit 模式
开发语言·前端·javascript·数据可视化
失去妙妙屋的米奇4 小时前
matplotlib数据展示
开发语言·图像处理·python·计算机视觉·matplotlib
夏天的阳光吖4 小时前
C++蓝桥杯实训篇(四)
开发语言·c++·蓝桥杯