版本管理git及其命令介绍-附带详细操作

前言

在版本管理时代之前,人们写软件的方式如下图1所示
在这里插入图片描述
图1 无版本管理的代码

其坏处就是软件版本随着时间越来越多,每个版本修改了什么内容,修改了哪些文件,如果没有详细记录也不知道。这样久会导致如果我们想回退到某个版本内容的时候就无法做到。git的出现就时为了解决这些问题的。在git出现之前,其实还有比较出名的SVN,当然SVN现在也有很多公司在用。

SVN与git的区别:SVN是集中式的管理方式,即就服务器一个仓库,git是分布式的管理方式,除了服务器仓库,本地也有一个仓库。而且这个本地仓库也可以与其他用户交互。当然本地仓库也可以与中央服务器交互。

版本管理的好处主要有以下几个方面

  • 版本管理有一个中央服务器,可以保存所有代码、文档
  • 每一次的修改都可以提交到版本库,修改有记录,可追踪
  • 不害怕某个同事离职了,代码没有入库
  • 本地的代码流失后,可以从版本库检出
  • 多人协作,每个同事完成的工作提交到版本库,方便进行集成
  • 当我们要开发需求或修复PR时,可以从版本库上拉出分支管理
  • 如果构建失败了,可以自动revert掉某次提交
  • 在大的企业,每次提交都可能触发一次构建,实时检查代码的质量

git原理

git区域

git主要有4个区域,如下图2所示
在这里插入图片描述
图2 git区域

  • 工作区,就是你平时存放项目代码的地方
  • Index / Stage: 暂存区,用于临时存放你的改动,事实上它只是一个文件,保存即将提交到文件列表信息
  • Repository: 仓库区(或版本库),就是安全存放数据的位置,这里面有你提交到所有版本的数据。其中HEAD指向最新放入仓库的版本
  • Remote: 远程仓库,托管代码的服务器,可以简单的认为是你项目组中的一台电脑用于远程数据交换
    引入Index/Stage的目的时因为我们可能经常的操作有些误操作,会将一些文件的记录就保存到了Repository,不过其实没有Index/Stage也是可以的,因为提交给Repository也可以回滚,如果有SVN的使用经验,Index/Stage就类似于SVN的选择要提交文件的页面。

工作流程

工作流程如下图在这里插入图片描述
图3 git工作流程

1、在工作目录中添加、修改文件;
2、将需要进行版本管理的文件add到暂存区域;
3、将暂存区域的文件commit到git仓库;
4、本地的修改push到远程仓库,如果失败则执行第55、git pull将远程仓库的修改拉取到本地,如果有冲突需要修改冲突。回到第三步
因此,git管理的文件有三种状态:已修改(modified),已暂存(staged),已提交(committed)

文件四种状态

在这里插入图片描述
图4 git 文件状态

  • Untracked: 未跟踪, 此文件在文件夹中,但并没有加入到git库,不参与版本控制, 通过git add 状态变为Staged。
  • Unmodify: 文件已经入库且未修改, 即版本库中的文件快照内容与文件夹中完全一致,这种类型的文件有两种去处,如果它被修改, 而变为Modified,如果使用git rm移出版本库, 则成为Untracked文件。
  • Modified:文件已修改,仅仅是修改,并没有进行其他的操作,这个文件也有两个去处,通过git add可进入暂存staged状态,使用git checkout 则丢弃修改,返回到unmodify状态, 这个git checkout即从库中取出文件,覆盖当前修改
  • Staged:暂存状态,执行git commit则将修改同步到库中,这时库中的文件和本地文件又变为一致,文件为Unmodify状态。

git 操作

我们以windows 版本来演示git的操作,linux下命令一致。

配置git

当安装完 Git 应该做的第一件事就是设置你的用户名称与邮件地址。 这样做很重要,因为每一个 Git 的提交都会使用这些信息,并且它会写入到你的每一次提交中,不可更改,使用这些信息是为了别人可以看到这次提交是由什么人提交,这样就可以直接找到相应的人。使用如下命令配置用户名和邮箱

 git config --global user.name “liqiang” 配置用户名git config --global user.email 552191868@qq.com配置邮箱git config -l  查看配置信息

在这里插入图片描述
图5 git 配置

常用命令

git init

安装git之后,我们在D盘的git目录下创建3个目录,远程仓库remote,和2个本地仓库(local-a,local-b).,我们先进入remote目录,然后右键Git Bash Here,创建一个远程的仓库。使用命令git init 创建 或者 git init --bare创建。使用git init 创建的仓库可以存储具体的代码,使用git init --bare创建的仓库不存储具体的代码,一般在远程服务器创建为裸仓库即可。创建远程仓库之后如下图6所示
在这里插入图片描述
图 6 创建远程服务器裸仓库

git clone

git clone 命令用于从远程服务器仓库拷贝到本地,并且后续可以通过在本地添加文件之后,并上传到服务器。进入到local-a目录,然后使用git clone命令从remote目录中拷贝文件如图7所示,同理,进入到local-b目录,使用git clone 将远程目录拷贝到本地。
在这里插入图片描述
图7 使用git clone将远程仓库拷贝到本地

git status

git status可以查看当前仓库文件的各自状态,在下面命令中进行说明。

git log

git log可以查看提交的版本信息,本地仓库的版本,远程仓库的版本等信息,在后续的命令中进行讲解。

git add

git add 是将工作区的代码提交给暂存区

git add . :将当前文件夹下的所有添加或者更新文件都一并提交

我们在本地目录local-a中添加一个main.c源文件,并添加一行内容。随后保存,然后使用git add . 将工作区的main.c提交给暂存区,并使用git status 查看文件状态 如图8所示
在这里插入图片描述
图8 git add将文件添加到暂存区,并使用git status查看状态

git commit

git commit 将暂存区提交给本地仓库

git commit main.c -m “first commit” 
将main.c文件提交给本地仓库,提交的日志信息为first commit

我们使用上述命令将暂存区的main.c提交到本地仓库,并使用git log查看当前的提交信息。如图9 所示.
在这里插入图片描述
图9 使用git commit提交和git log查看状态
我们对git log命令中的一些信息进行说明如下:
HEAD:本地仓库当前最新的提交指针
master:当前提交的分支(后续会说明分支的作用)
Author:里面包含用户名和邮箱信息(在git config中已经进行了描述)
Date:本次的提交时间
提交的信息:如first commit就是本次提交的日志信息
Hash字符串(40位):每次提交都使用hash算法生成的唯一 字符串,用来唯一描述某次提交。可以使用前面几位来描述某次提交。

git push

使用git add和git commit之后,代码已存储到本地仓库,但是其他用户却不能查看到最新的代码信息,使用git push命令,可以将代码推送到远程服务器。使用如下命令

git push origin master: 其中origin代表远程仓库的简写,master代表要提交本地仓库的master分支到远程仓库。

在这里插入图片描述
图10 推送代码到远程服务器
对于图10来说,使用git log 可以看到这次的日志信息比上次多了 origin/master,其实这是在本地查看到远程服务器的状态信息,这里HEAD->master,origin/master在同一行里,说明远程服务器和本地仓库的版本状态是一样的。通常如果进行了多次git commit,而没有git push到远程仓库,那么就会发现HEAD->master一般是提前于origin/master的,origin/master表示远程仓库也是使用的master分支。

git pull

可以使用git pull从远程服务器拉取代码,在我们的例子中,repo-a的代码已经更新到远程仓库中,如果repo-b想从远程服务器中获取到最新代码,使用git pull即可。
在这里插入图片描述
图11 从远程服务器拉取代码

git reflog

不像git log那样,git reflog不会显示那么完整的信息,但是使用git reflog会将自己每次提交的日志记录都记录下来了,即使使用git命令将提交信息进行了合并(后续会讲到),图12显示了git reflog的使用。
在这里插入图片描述
图12 git reflog的使用

有时候我们需要我们提交日志的内容,比如想把前几次的内容进行合并位一次提交,或者将值卡提交的版本删除,主要就是为了更容易阅读每次提交版本所做的工作。主要有git commit --amend 和git rebase命令

git commit --amend

可以修改提交记录,让提交版本的log更好看,比如我们之前提交的日志不足以说明提交的信息情况,如果想修改,则可以使用这条命令,提前可以使用git log查看日志状态,修改过后(vim修改,会vim操作就可以),然后再次使用git log就可以查看日志已经修改。
git commit --amend还可以将这次源文件修改之后和上次进行合并,既是说这次修改代码之后,不需要提交版本。我们将local-a的代码在提交1次,最终的状态如下所图13所示。
在这里插入图片描述
图13 提交2次记录到本地服务器

我们使用 git commit --amend命令之后,如图14所示
在这里插入图片描述
图14 git commit --amend
使用vim将second commit 2 修改为second commit ,然后保存,再次使用git log,就可以看到上次提交的日志信息已经被修改为second commit,但是使用git reflog命令却显示了3次修改。如图15所示
在这里插入图片描述
图15 显示git commit --amend修改后的日志情况

git rebase

使用git commit --amend只能对最近一次的日志进行修改,如果相对多次提交记录进行修改,需要使用git rebase 命令,get rebase操作是在操作本地仓库,用于将多次日志进行合并,git rebase -i 开始hash值,结束hash值也可以使用git rebase -i,如果不带hash值, 那么就是默认从最新版本到没有提交到远程服务器之前的办吧 。在修改之前,提交版本如图16所示
在这里插入图片描述
图16 提交了4次版本的本地仓库
如图16所示,我们使用git log可以看到有4次提交版本到本地仓库,但是只有第一次提交到远程服务器,如果我们使用git rebase -i 命令,会出现如图17所示。
在这里插入图片描述
图17 git rebase -i整理界面
git rebase 有很多命令可供操作(如注释说明),以下做个简单的说明
pick ( p ): 使用该条提交,不进行任何修改,比如我们这里退出vim,不进行任何修改,那么相当做不对任何操作。
r: 使用r命令修改第三次提交和第4次提交的日志,但是不修改提交的内容,这个命令的作用就是用于让别人更容易看懂每次提交代码的作用,有时候我们提交过后,才发现日志对本次代码的用途说明的不是很清楚,我们就可以使用这个命令。如图18所示
在这里插入图片描述
图 18 使用r命令修改第3次和第4次提交日志
然后保存vim会自动提出修改第3次和第4次的日志信息,保存为我们想修改的日志信息即可。然后使用git log查看,如图19所示。
在这里插入图片描述
图19 所用 git rebase的r命令修改提交的日志
e: e命令不仅会修改提交的日志,还会记录提交时的代码状态,比如我们使用e修改第4次提交的内容,如图20所示
在这里插入图片描述
图20 使用e命令修改日志和代码
然后在图20使用wq保存vim之后,出现如图21所示
在这里插入图片描述
图21 e命令修改之前的提示
图21说明了e命令可以对代码进行修改,并且git会记录这次提交之前的源文件的状态,修改代码之后,在使用git commit --amend 修改本次要提交的日志,然后使用git rebase --continue完成本次提交的修改,但是如果需要一次性修改多条提交,需要重复多次,以便完成所有的修改操作。
对于git rebase的其他命令,如果有兴趣,请自行查阅相关资料,这里就不过多说明了。

有时候,我们需要进行git的逆向操作,即将暂存区的内容回退到工作区,或者将本地服务器的版本回退到上一个版本等等。

git restore

使用git restore -S . 命令将暂存区的内容回滚到工作区,如图22所示
在这里插入图片描述
图22 暂存区回滚到工作区

git reset

我们使用local-b仓库来讲解,我们将local-a仓库的所有更新到服务器(git push origin master),然后在local-b使用git pull像远程服务器拷贝最新的内容,初始状态如图23所示。
在这里插入图片描述
图23 ,local-b的初始状态

我们将main.c的内容删除3行,保留hello world和return 0 2行内容。然后使用git add 和git commit 将内容提交到本地服务器,使用git reflog命令,然后查看main.c和状态如图24所示
在这里插入图片描述
图24 ,使用 git reset之前的状态
git reset --hard head~1该命令直接硬件回滚到HEAD~1(79983ed), 把上次提交(head~0)的内容直接给抹掉,就好像从来没有提交过一样。即没有在服务器上有过记录。
我们查看main.c和使用git log查看状态,就好像前面所做的操作没有一样,如图25所示
在这里插入图片描述
图25 硬件回滚到前一个版本

git reset --soft head~1:回退到index暂存区,将内容回到HEAD 1版本,使用git status可以看到main.c的内容还没有提交到本地服务器,如图26所示
在这里插入图片描述
图26 ,回退到暂存区
git reset head~1的全写是:git reset --mixed head~1 ,这里是直接退到workspace了。内容没有提交到服务器,但是本地workspace还是存在最近一次提交的内容。

解决冲突

在日常开发中,难免会遇到多个开发者同时修改同一个文件,而且修改文件的同一个地方,那么就不可避免的出现冲突,我们这里先说明冲突的git状态,然后在说明如何解决冲突。
有2个本地仓库,其中一个本地仓库修改源文件之后提交给服务器(git push),另一个本地仓库去下载(git pull),并修改了其中一个文件,并提交到本地(git commit),然后提交到服务器(git push).第一个本地仓库也去修改源文件,并提交到暂存区(index),然后去git commit到本地仓库。然后使用git pull拉取服务器上的文件操作,就会发生冲突(修改了同一个源文件导致)。
首先我们将local-a的main.c代码更新到远程服务器(git push),随后local-b去拉取代码(git pull),然后local-a和local-b同时去更新main.c,然后local-a提交到服务器(git push),local-b提交到本地服务器,然后使用git pull去拉取到本地,这时候就出现冲突了,如图27所示
在这里插入图片描述
图27,local-b出现冲突
使用vim打开main.c,如图28所示,然后并修改如图29之后,提交就能解决冲突。
在这里插入图片描述
图28,冲突版本的代码

图28 ,冲突信息,<<<<<<<<< HEAD 到=============是自己本地修改的信息,============到>>>>>>>>> 3e4d20…是远程服务器的版本信息,然后我们想让远程的自己的代码一起使用,我们保留这2份代码即可。
在这里插入图片描述
图29 修改后的代码
然后修改完成后,按照正常操作即可。

标准工作流程

git 分支

在企业开发中,不可能只在一个分支上进行开发,比如前面提到的master分支。在说明工程流程之前,先说下一般有哪些分支,分支如图30所示
在这里插入图片描述
图30 企业git分支情况

master:主分支,通常用于线上版本
hotfix:热更新版本,可以线上更新的版本
release:开发完成之后,并测试通过之后,积极发布的版本
develop:开发分支版本,一般由主程进行管理
feature:功能模块版本
bug:存在bug的版本分支

查看分支

git branch:用于查看当前处于什么分支,不过一般不需要,因为在命令中就已经显示了当前处于什么分支

创建和切换分支

一般刚建的仓库仅仅只有master分支,我们创建develop分支:git branch develop,并且切换到develop分支,如图31所示。
在这里插入图片描述
图31 创建和切换分支

切换到develop分支之后,在打开main.c,发现里面的内容和master分支一致。然后我们修改main.c的部分内容。并git add ,git commit ,并git push 到服务器,然后我们切换到master分支,会发现develop修改的内容并没有更新到master分支,这就是说,master分支一般作为稳定的线上版本,develop修改的内容不会影响到master分支。
git checkout -b bug/timer: 首选切换到bug/timer,-b参数表示如果没有bug/timer分支,则先创建该分支。

合并分支

前面提到,develop用于开发版本,修改的内容不会及时更新到master分支,但是我们确实想将develop分支的内容更新到master分支该怎么办呢,那么使用git merge develop将develop分支合并到master分支(要保证当前处于master分支)

正常流程

通常主程会生成一个develop分支,然后弄创建一些功能模块和BUG的分支,交由不同的人员去开发,开发完成之后,检查功能模块和BUG分支是否合格,如果合格,就将其合并到develop分支,有时候我们需要查看当前有哪些分支,可以使用 git branch --all ,还有很多关于分支的命令,如下所示
在这里插入图片描述

git帮助

git --help:会线上帮助命令,假如我们想知道git branch 支持的参数,可以使用git branch --然后按tab键就可以知道git branch的所有支持的参数。

.gitignore

有时候我们不想提交一些文件,那么可以将这些忽略的文件列表写入到这个文件中,比如我们想忽略所有的exe文件,我们可以在文件里面写 *.exe即可。

总结

本文说了git的一些常见用法,基本上这些命令能解决工作上的大多数问题,如果想更加深入的学习git,需要自行参考git语法。这里就不说了,希望本文能够帮助初学git的人有一个帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/664321.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MCU方案选型和进口替代,点击查看~

一、MCU简介 MCU&#xff08;微控制单元&#xff09;俗称单片机&#xff0c;可被认为是CPU的缩减版本&#xff0c;把CPU的频率与规格进行缩减处理&#xff0c;并将RAM、ROM、时钟、A/D转换、定时/计数器、UART 、DMA等电路单元&#xff0c;甚至包括USB接口、LCD驱动电路都整合…

缓存框架jetcache

在实际应用中&#xff0c;并不是单一的使用本地缓存或者redis&#xff0c;更多是组合使用来满足不同的业务场景。 jetcache组件实现了优雅的组合本地缓存和远程缓存。 支持多种缓存类型&#xff1a;本地缓存、分布式缓存、多级缓存。 官网地址&#xff1a;https://github.com…

《向量数据库指南》——Milvus Cloud丝滑入库是影响开发体验的第一步

除了查询之外,“插入”应该是使用最多的一个数据库操作,所有后续的工作也是建立在数据成功插入的基础上。丝滑的入库体验,是影响开发体验的第一步,也是至关重要的一步。 Milvus Cloud 社区对于“插入”的讨论,主要集中在数据插入的实践经验上: “插入的速度怎么优…

各版本的Qt Creator的下载地址

2024年2月3日&#xff0c;周六上午 Index of /official_releases/qtcreatorhttps://download.qt.io/official_releases/qtcreator/ 如果想下载测试中的最新版Qt Creator的快照可以去这个地址 Index of /snapshots/qtcreatorhttps://download.qt.io/snapshots/qtcreator/

浅谈智慧消防在铁路系统中的应用与发展

摘要&#xff1a;文章从基于物联网技术的“智慧消防”概念入手&#xff0c;探讨了智慧消防物联网技术在铁路工程中的应用&#xff0c;分析了在实际应用过程中存在的部分难点&#xff0c;并提出了新型物联网无线组网、智能传感器技术、图形可视化技术及安全隐患预测与评估的技术…

寒假作业2月2号

第一章 命名空间 一&#xff0e;选择题 1、编写C程序一般需经过的几个步骤依次是&#xff08;C &#xff09; A. 编辑、调试、编译、连接 B. 编辑、编译、连接、运行 C. 编译、调试、编辑、连接 D. 编译、编辑、连接、运行 2、所谓数据封装就是将一组数据和与这组数据有关…

情人节送什么好?情人节送什么数码礼物?这总有你喜欢的那款!

​情人节礼物选择繁多&#xff0c;但许多人钟爱数码产品。以下是我为您精心挑选的几款实用且深受男女生喜爱的数码产品。它们不仅功能出色&#xff0c;还能为您的节日增添一份特别的惊喜。 一、南卡OE MIX蓝牙耳机 南卡OE MIX无疑是在情人节礼物预算千元以内的首选。它配备了重…

文旅行业解决方案

顶层规划设计 系统化地为目的地、政府、景区、游客等提供基于全流程服务和管理的智慧文旅应用体系 智慧产品矩阵 整合腾讯产品矩阵和先进技术&#xff0c;持续研发创新产品&#xff0c;实现各文旅场景智慧化及产业协同式发展 文创孵化平台 用科技文化助力中华文明复兴&…

MySQL的ACID、死锁、MVCC问题

1 ACID ACID代表原子性&#xff08;atomicity&#xff09;、一致性&#xff08;consistency&#xff09;、隔离性&#xff08;isolation&#xff09;和持久性&#xff08;durability&#xff09;。一个确保数据安全的事务处理系统&#xff0c;必须满足这些密切相关的标准。 原…

【Spring实战】33 Spring Boot3 集成 Nacos 配置中心

文章目录 1. 配置中心定义2. 解决哪些问题3. 常用的配置中心4. 使用示例1&#xff09;没引入 Nacos 配置中心2&#xff09;引入依赖3&#xff09;配置Nacos连接信息4&#xff09;在 Nacos 上配置属性5&#xff09;在 Spring Boot 中使用配置6&#xff09;启动服务&验证7&am…

spring boot学习第九篇:操作mongo的集合和集合中的数据

1、安装好了Mongodb 参考&#xff1a;ubuntu安装mongod、配置用户访问、添删改查-CSDN博客 2、pom.xml文件内容如下&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns…

奠定基础:用于机器学习的微积分、数学和线性代数

一、说明 机器学习是一个引人入胜的领域&#xff0c;它使计算机能够从数据中学习并做出预测或决策&#xff0c;而无需明确编程。然而&#xff0c;在幕后&#xff0c;有一个坚实的数学和线性代数基础&#xff0c;构成了机器学习算法的支柱。在本文中&#xff0c;我们将探讨在深入…

C++多线程3

生产者消费者模型 OS经典问题&#xff0c;生产者消费者模型,empty和full还有mutex对应到C上如何处理看代码即可 #include <iostream> #include <thread> #include <mutex> #include <condition_variable> #include <queue> using namespace st…

数据中心机房建设的关键痛点及解决方案

随着信息技术的飞速发展&#xff0c;数据中心机房已成为企业信息系统的核心。然而&#xff0c;在机房系统的建设过程中&#xff0c;投资及运行维护成为项目管理的关键痛点。合理的投资决策和高效的运维管理是确保机房系统经济性和可靠性的重要因素。本文将探讨机房系统建设的投…

那些不输于乙游男主人设的国漫男主

最近乙游的势头越来越猛&#xff0c;新宠旧爱一起上阵&#xff0c;叫人应接不暇。在二次元的世界里&#xff0c;乙游男主们凭借着超凡的魅力&#xff0c;成为了无数少女心中的理想对象。他们或冷酷、或温柔、或阳光、或神秘&#xff0c;每一个角色都有着独特的性格和故事。 乙游…

NLP_统计语言模型的发展历程

文章目录 统计语言模型发展的里程碑&#xff1a; 上半部分是语言模型技术的进展&#xff1b;下半部分则是词向量&#xff08;词的表示学习&#xff09;技术的发展。其中&#xff0c;词向量表示的学习为语言模型提供了更高质量的输入信息&#xff08;词向量表示&#xff09; 1…

性能测试常用术语

之前在性能测试过程中&#xff0c;对于某些其中的术语一知半解&#xff0c;导致踩了很多坑。这篇博客&#xff0c;就常见的一些性能测试术语进行一次浅析。。。 负载 对被测系统不断施加压力&#xff0c;直到性能指标超过预期或某项资源使用达到饱和&#xff0c;以验证系统的处…

玩美移动为花西子海外官网打造AR虚拟试妆决方案

全球领先的增强现实&#xff08;AR&#xff09;及人工智能&#xff08;AI&#xff09;美妆科技领导者及玩美系列APP开发商——玩美移动&#xff08;纽交所代码&#xff1a;PERF&#xff09;于近日宣布携手知名美妆品牌花西子&#xff0c;在其线海外官方网页提供多项彩妆虚拟试妆…

C语言搭配EasyX实现贪吃蛇小游戏

封面展示 内部展示 完整代码 #define _CRT_SECURE_NO_WARNINGS #include<easyx.h> #include<stdio.h> #include<mmsystem.h> #pragma comment (lib,"winmm.lib") #define width 40//宽有40个格子 #define height 30//长有40个格子 #define size 2…

ubuntu22.04安装部署02:禁用显卡更新

一、查看可用显卡驱动 ubuntu-drivers devices 二、查看显卡信息 # -i表示不区分大小写 lspci | grep -i nvidia nvidia-smi 三、查看已安装显卡驱动 cat /proc/driver/nvidia/version 四、锁定显卡升级 使用cuda自带额显卡驱动&#xff0c;居然无法&#xff0c;找到如何锁…