使用Git进行版本控制

参考:《Python编程从入门到实践》

  • 前言
  • 1、安装、配置 Git
    • 1.1 在Linux系统中安装Git
    • 1.2 在OS X系统中安装Git
    • 1.3 在Windows系统中安装Git
    • 1.4 配置Git
  • 2、创建项目
  • 3、忽略文件
  • 4、初始化仓库
  • 5、检查状态
  • 6、将文件加入到仓库中
  • 7、执行提交
  • 8、查看提交历史
  • 9、第二次提交
  • 10、撤销修改
  • 11、检出以前的提交
  • 12、删除仓库

前言

版本控制软件让你能够拍摄处于可行状态的项目的快照。修改项目(如实现新功能)后,如果项目不能正常运行,可恢复到前一个可行状态。
通过使用版本控制软件,你可以无忧无虑地改进项目,不用担心项目因你犯了错而遭到破坏。对大型项目来说,这显得尤其重要,但对于较小的项目,哪怕是只包含一个文件的程序,这也大有裨益。
在本文中,你将学习到如何安装Git,以及如何使用它来对当前开发的程序进行版本控制。Git 是当前最流行的版本控制软件,它包含很多高级工具,可帮助团队协作开发大型项目,但其最基本的功能也非常适合独立开发人员使用。Git通过跟踪对项目中的每个文件的修改来实现版本控制,如果你犯了错,只需恢复到保存的前一个状态即可。
说明:笔者使用的是CentOS 7的64位 Linux环境

1、安装、配置 Git

Git可在所有操作系统上运行,但其安装方法因操作系统而异。

1.1 在Linux系统中安装Git

要在Linux系统中安装Git,执行如下命令:

CentOS:
$ sudo yum install git
Ubuntu:
$ sudo apt-get install git

安装完成后可以通过下述命令查看安装的版本:

git --version

1.2 在OS X系统中安装Git

OS X系统可能自带Git,因此在安装前先执行命令:‘git --version’。如果在输出中查看到具体的版本号,说明系统已经安装了Git;如果看到的是提示安装或升级Git的信息,根据屏幕显示的提示信息操作即可。
也可以访问链接:https://git-scm.com/ ,单击链接Downloads,再点击适合你所用的系统的安装程序。

1.3 在Windows系统中安装Git

访问:https://gitforwindows.org/,单击Download。

1.4 配置Git

Git跟踪谁修改了项目,哪怕参与项目开发的人只有一个。为此,Git需要知道你的的用户名和电子邮件地址。用户必须提供用户名,但是可以使用虚构的电子邮件地址:

$ git config --global user.name "wsy"
$ git config --global user.email "username@example.com"

如果忘了这一步,在首次提交时,Git将提示用户提供这些信息

2、创建项目

  • 在所用系统中创建一个名为 git_practice 的文件夹作为项目目录;
  • 在项目目录下创建空文件:module.py
  • 在项目目录下创建一个简单的python程序:hello_world.py 作为需要跟踪的项目文件,输入以下内容:
import moduleprint('Hello Git world!')

注:这里之所以需要创建一个空的module.py文件是因为在程序hello_world.py要引用他,这样在程序运行后就会生成一个__pycache__文件夹,这个文件夹我们后续不需要让Git跟踪它,所以要对它做忽略操作。

关于__pycache__文件夹:python解释器会对 *.py 文件进行编译,并且将编译结果保存到__pycache__目录下。在下次执行工程时,如果发现这个 *.py 没有被修改过,那么就会跳过编译这一步,直接执行在__pycache__中已经完成编译的.pyc文件。而且,只有被导入的module才会生成对应的 *.pyc文件,生成的 *.pyc 文件的命名规则是: ‘module.interpreter_version.pyc’。这样做的好处是,如果需要执行比较大的工程文件,那么会节约很多时间。

整个创建流程如下:
在这里插入图片描述

3、忽略文件

上面说过,扩展名为 .pyc 的文件是根据 .py 文件自动生成的,因此无需让Git跟踪它们。这些文件存储在 pycache 目录中。

为了让Git忽略__pycache__目录,执行下属操作:

  • 在项目目录下创建一个名为 .gitignore 的特殊文件,该文件以句点打头,且没有扩展名;
  • .gitignore 中添加下面一行内容:
__pycache__/

这让Git忽略__pycache__目录中的所有文件。使用 .gitignore 可避免项目混乱,开发起来更容易。

注:如果你使用的编译器是 python2.7,请将这行内容改为 *.pyc。因为python2.7不会自动创建目录 pycache,它将每个.pyc文件都存储在相应.py文件所在目录中。其中的星号(*)让Git忽略所有扩展名为.pyc的文件。

流程如下:
在这里插入图片描述

4、初始化仓库

至此,我们创建了一个目录,其中包含一个python文件和一个 .gitignore 文件,下面可以初始化一个Git仓库了。为此,打开一个终端窗口,切换到文件夹 git_practice,并执行如下命令:

git init

如下:
在这里插入图片描述输出表明,Git在git_practice中初始化了一个空仓库。仓库里是程序中被Git主动跟踪的一组文件。Git用来管理仓库的文件都存储在隐藏的 *.git/中,用户无需与该目录打交道,但是千万不能删除该目录,否则将丢失项目的所有历史记录

5、检查状态

执行其它操作前,先执行下述命令来看一下项目的状态:

git status

在这里插入图片描述
在Git中,分支(master)是项目的一个版本。从上述输出可以看出,目前项目位于分支master上。用户每次查看项目状态时,输出都将指出你位于分支master上。接下来的输出表明,我们将进行初始提交。提交是项目在特定时间点的快照。
接着,Git指出了项目中未被跟踪的文件,因为到目前为止我们还没有告诉它要跟踪哪些文件,从这里就可以看出,被我们忽略掉的__pycache__目录就不被跟踪。
最后,输出提示我们“提交为空,但是存在尚未跟踪的文件”,并告知如何建立跟踪,即使用 git add。
所以下面的任务就是将文件加入到仓库中。

6、将文件加入到仓库中

下面将上述指出的文件加入到仓库中,并再次检查状态。
可以通过下述两种方法进行添加:

1、逐个文件添加
git add .gitignore
git add hello_world.py
git add module.py2、整体添加
git add .

命令 git add . 将项目中未被跟踪的所有文件都加入到仓库中,不需要一个文件一个文件的添加,这对于改动文件较多的项目来说很方便。它不提交这些文件,而只是让Git开始关注它们。下面我们再检查项目状态时,发现Git找出了需要提交的一些修改,且标出了新添加到仓库中的文件。
也可以理解为,通过 git add 将文件从工作目录添加到了一个暂存区
在这里插入图片描述

7、执行提交

下面开始执行第一次提交,提交结束后再次查看项目状态,如下:
在这里插入图片描述我们执行命令:commit -m "Started project." 以拍摄项目的快照。其中,标志 -m 让Git将接下来的消息(Started project.)记录到项目的历史记录中(也可以把这个消息当成是本次提交的一个title,用于辨识)。输出表明我们在分支 master上,且有3个文件被修改了。
现在我们再检查状态时,发现我们在分支master上,且工作目录是干净的。这是用户每次提交项目的可行状态时都希望看到的结果。如果显示的消息不是这样的,请仔细阅读,很可能是在提交前忘记了添加文件。

8、查看提交历史

Git记录所有的项目提交,通过命令 git log即可查看提交历史,下面来看一下提交历史:
在这里插入图片描述用户每次提交时,Git都会生成一个包含40字符的独一无二的引用ID,它记录提交是谁执行的、提交的时间以及提交时指定的消息。并非在任何情况下你都需要所有的这些信息,因此Git提供了一个选项,让你能够打印提交历史条目更加简单的版本:
在这里插入图片描述标志 --pretty=oneline指定显示两项最重要的信息:提交的引用ID以及为提交记录的消息(title)。

9、第二次提交

为了展示版本控制的强大之处,下面需要对项目进行修改,并提交所做的修改。为此,我们在 hello_world.py 中再添加一行代码:

import moduleprint('Hello Git world!')
print('Hello everyone.')

此时如果再查看项目状态,将发现Git已经注意到了这个文件的变化:
在这里插入图片描述输出指出了我们当前所在的分支、被修改了的文件名称,还指出了所做的修改尚未提交。下面来提交所做的修改,并再次查看状态:
在这里插入图片描述理论上来说,这里修改了文件后,应该先执行 git add . 或 git add hello_world.py 将新文件添加到仓库中,然后再使用 git commit … 命令执行提交。这里没有这样做,而是直接使用了 git commit 命令,辅之以 -am 选项,这是因为标志 -a 就是让Git将仓库中所有修改了的文件都加入到当前提交当中,而 -m 还是起到让Git在提交历史中记录一条消息的作用,这样简化了将文件添加到仓库中的步骤。

10、撤销修改

下面来看看如何放弃所做的修改,恢复到前一个可行状态。为此,首先在 hello_world.py 中再添加一行代码:

import moduleprint('Hello Git world!')
print('Hello everyone.')print('Oh no, I broke the project!')

保存并运行这个文件,再查看状态,发现Git注意到了所做的修改:
在这里插入图片描述现在,我们可以提交所做的修改,但这次我们不提交修改,而是要恢复到上一次提交(也就是本次修改之前的状态)。为此,不对 hello_world.py 执行任何操作——不删除刚刚添加的代码,也不使用文本编辑器的撤销功能,而是在终端中执行如下命令:

git checkout .

如图:
在这里插入图片描述命令git checkout让用户能够将项目恢复到以前的任何提交。命令git checkout .放弃自最后一次提交后的所有修改,将项目恢复到最后一次提交状态。
此时,再查看文本内容,发现之前添加的一行代码已经没有了。

就这个项目而言,恢复到前一个状态微不足道,但如果我们开发的是大型项目,其中数十个文件都被修改了,那么恢复到前一个状态,将撤销自最后一次提交后对这些文件的所有修改。这个更能很有用:实现新功能时,你可以根据需要做任意数量的修改,如果这些修改不可行,可撤销它们,而不会对项目有任何伤害。

11、检出以前的提交

用户可以检出提交历史中的任何提交,而不仅仅是最后一次提交,为此可在命令 git checkout 末尾指定该提交的引用ID的前6个字符(而不是句点)。通过检出以前的提交,用户可以对其进行审核,然后返回到最后一次提交,或者放弃最近所做的工作,并选择以前的提交:
在这里插入图片描述检出以前的提交后,你将离开分支master,并进入Git所说的分离头指针(detached HEAD)状态。HEAD表示项目的当前状态,之所以说我们处于分离状态,是因为我们离开了一个命名分支(这里是master分支)。
要回到master分支,可检出它:

git checkout master

在这里插入图片描述这样就回到了分支master,除非你要使用Git的高级功能,否则在检出以前的提交后,最好不要对项目做任何修改。然而,如果参与项目开发的人只有你自己,而你又想放弃较近的所有提交,并恢复到以前的状态,也可以将项目重置到以前的提交。为此,可在处于分支master分支上的情况下,执行如下命令:
在这里插入图片描述
我们首先查看了状态,确认在master分支上。查看提交历史时,我们看到了两个提交。接下来,执行git reset --hard,并在其中指定了要永久地恢复到的提交的引用ID前6个字符。再次查看状态,仍然在master分支上,且没有需要提交的修改。最后,查看提交历史,发现第二次提交历史已经不存在了,,我们处于要从它重新开始的提交中。

12、删除仓库

有时候,仓库的历史记录可能会被搞乱,且已经不知道如何恢复,在这种情况下,是可以继续使用这些文件的,但是需要把项目的历史记录删除——删除 .git。这不会影响任何文件的当前状态,而只会删除所有的提交,因此用户将无法检出项目的其他任何状态。
为此,我们下面通过终端将目录 .git 删除,然后重新创建一个仓库,以重新对修改进行跟踪,过程如下(直接复制终端的操作过程,不截图了):

wsy@localhost:~/WSY/git_practice$ pwd
/home/wsy/WSY/git_practice
wsy@localhost:~/WSY/git_practice$ ls -a
.  ..  .git  .gitignore  hello_world.py  module.py  __pycache__
wsy@localhost:~/WSY/git_practice$ rm -rf .git
wsy@localhost:~/WSY/git_practice$ git status
fatal: Not a git repository (or any of the parent directories): .git
wsy@localhost:~/WSY/git_practice$ git init
初始化空的 Git 版本库于 /home/wsy/WSY/git_practice/.git/
wsy@localhost:~/WSY/git_practice$ git status
# 位于分支 master
#
# 初始提交
#
# 未跟踪的文件:
#   (使用 "git add <file>..." 以包含要提交的内容)
#
#	.gitignore
#	hello_world.py
#	module.py
提交为空,但是存在尚未跟踪的文件(使用 "git add" 建立跟踪)
wsy@localhost:~/WSY/git_practice$ git add .
wsy@localhost:~/WSY/git_practice$ git status
# 位于分支 master
#
# 初始提交
#
# 要提交的变更:
#   (使用 "git rm --cached <file>..." 撤出暂存区)
#
#	新文件:    .gitignore
#	新文件:    hello_world.py
#	新文件:    module.py
#
wsy@localhost:~/WSY/git_practice$ git commit -m "Starting over."
[master(根提交) f04a84e] Starting over.3 files changed, 4 insertions(+)create mode 100644 .gitignorecreate mode 100644 hello_world.pycreate mode 100644 module.py
wsy@localhost:~/WSY/git_practice$ git status 
# 位于分支 master
无文件要提交,干净的工作区
wsy@localhost:~/WSY/git_practice$ 

上述终端操作中,首先查看了状态,发现工作目录是干净的。接下来使用命令 rm -rf .git(在Windows系统中,应该使用的命令是 rmdir ./s .git)删除目录 .git。删除后再次查看状态时,就被告知这不是一个Git仓库了。Git用来跟踪仓库的信息都存储在文件夹 .git中,因此删除该文件夹就相当于删除了整个仓库。
接下来使用 git init新建一个全新的仓库,然后依次执行建立跟踪、提交等操作了。


结束语
Git在研发中,特别是在团队合作开发项目中的作用很大,笔者是今年夏天在公司实习时第一次接触到该工具。实习过程中由于知识有限,很多命令在使用时一知半解。最近在重翻《Python编程从入门到实践》这本书的时候从附录中发现了有关于Git工具的使用介绍,因此自己系统的学习了一下,顺便记录。此外,本文记录的关于Git的使用是建立在本地的项目开发,比较基础,实习中是通过git push从远程分支拉取项目并进行开发、维护。后续还会继续深入学习,顺便推荐一个Git学习网站:Git 教程

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

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

相关文章

Seata配置

参考教程 seata 分布式事务的环境搭建与使用 Seata 1.4.0 nacos配置和使用&#xff0c;超详细 Seata 1.4.2 的安装 Nacos的配置和使用 官网下载地址 本文以v1.4.1为例 1.数据库及表的创建 创建seata数据库&#xff0c;创建以下表&#xff08;右键连接-》新建数据库seata-》…

2023.12.6 关于 Spring Boot 事务的基本概念

目录 事务基本概念 前置准备 Spring Boot 事务使用 编程式事务 声明式事务 Transactional 注解参数说明 Transational 对异常的处理 解决方案一 解决方案二 Transactional 的工作原理 面试题 Spring Boot 事务失效的场景有那些&#xff1f; 事务基本概念 事务指一…

【AI神器】CodeGeeX智能编程助手

目录 1.CodeGeeX介绍2.IDEA插件安装3.助手功能3.1 代码分析&#xff08;/explain&#xff09;3.2 代码自动补全3.3 AI优化代码3.4 代码添加注释&#xff08;/comment&#xff09;3.5 AI添加文档3.6 单元测试生成&#xff08;/tests&#xff09;3.7 bug查找修正&#xff08;/fix…

[OpenWrt]RAX3000一根线实现上网和看IPTV

背景&#xff1a; 1.我家电信宽带IPTV 2.入户光猫&#xff0c;桥接模式 3.光猫划分vlan&#xff0c;将上网信号IPTV信号&#xff0c;通过lan口&#xff08;问客服要光猫超级管理员密码&#xff0c;具体教程需要自行查阅&#xff0c;关键是要设置iptv在客户侧的vlan id&#…

Maven基础

目录 Maven坐标 坐标简介 主要组成 Maven依赖管理 配置依赖 依赖简介 配置依赖 依赖传递 依赖传递简介 排除依赖 依赖范围 生命周期 生命周期简介 执行指定生命周期 Maven坐标 坐标简介 Maven中的坐标是资源的唯一标识&#xff0c;通过该坐标可以唯一定位资…

Yolov5双目测距-双目相机计数及测距教程(附代码)

引言 在计算机视觉领域&#xff0c;Yolov5-Binocular相机距离计数及测距是一个引人注目的研究方向。本教程将为小白用户提供一个简明扼要的学习指南&#xff0c;涵盖了关键步骤&#xff0c;包括标定、公示推倒以及重要的代码片段。 第一步&#xff1a;环境搭建 首先&#x…

cpp:1:10: fatal error: opencv2/core.hpp: 没有那个文件或目录

前言&#xff1a; 我按照官网方法安装了opencv&#xff0c;运行的也是官网的测试代码&#xff1a; #include <opencv2/core.hpp> #include <opencv2/highgui.hpp> using namespace cv; int main() {printf("hello world")return 0; } 半解决&#xff…

07用户行为日志数据采集

用户行为数据由Flume从Kafka直接同步到HDFS&#xff0c;由于离线数仓采用Hive的分区表按天统计&#xff0c;所以目标路径要包含一层日期。具体数据流向如下图所示。 按照规划&#xff0c;该Flume需将Kafka中topic_log的数据发往HDFS。并且对每天产生的用户行为日志进行区分&am…

java-sec-code的xss

java-sec-code 用于学习java漏洞代码 环境部署 直接在idea中使用git 运行即可 RequestMapping("/reflect") ResponseBody public static String reflect(String xss) {return xss;}当用户访问到/reflect URL地址时&#xff0c;程序会自动调用reflect方法&#xff0c…

JS对象笔记

对象声明 对象也只是一种数据类型/字面值。写对象这个字面值有两种写法&#xff0c;一种是普通的对象&#xff0c;这种对象用new 构造函数&#xff08;&#xff09;&#xff0c;另一种是JS内特有的json对象。这个对象是直接{}就代表对象。且也是在堆内。 对象的构成 无论是上…

Blender学习--制作带骨骼动画的机器人

1. 首先创建一个机器人模型 时间关系&#xff0c;这部分步骤有时间补充 2. 然后为机器人创建一副骨架 时间关系&#xff0c;这部分步骤有时间补充 3.骨骼绑定 切换到物体模式&#xff0c;选中机器人头部&#xff0c;Shift选中骨骼&#xff0c;切换到姿态模式&#xff0c;&am…

《Easy3d+Qt+VTK》学习

《Easy3dQtVTK》学习-1、编译与配置 一、编译二、配置注 一、编译 1、 资源下载&#xff1a;easy3d giuhub 2、解压缩 3、用qt打开CMakeLists.txt即可 4、点击项目&#xff0c;选择debug或者release&#xff0c;图中3处可自行选择&#xff0c;因为我的qt版本是6&#xff0c…

【TC3xx】GETH

目录 一、RGMII 二、SMI接口 三、TC3xx MCAL 3.1 MCU 3.2 Port 3.3 DMA 3.4 中断配置 3.5 ETH 3.6 集成 一、RGMII TC3xx支持MII/RMII/RGMII三种以太网数据通信接口。其中RGMII经常用于MAC和MAC之间&#xff0c;或MAC与PHY之间的通信&#xff0c;RGMII的带宽可以是10M…

ViTDet论文笔记

arxiv&#xff1a;https://arxiv.org/abs/2203.16527 GitHub&#xff1a;https://github.com/ViTAE-Transformer/ViTDet 摘要 本文提出使用plain&#xff0c;non-hierarchical视觉transformer作为目标检测的主干网络。通过这种设计可以使得ViT结构模型不需要再重新设计一个分…

51单片机控制1602LCD显示屏输出两行文字一

51单片机控制1602LCD显示屏输出两行文字一 1.概述 这篇文章介绍1602型号显示屏的基础知识&#xff0c;以及使用单片机控制它输出两行内容。 2.1602基础知识 1602 液晶显示模块是一种通用的工业液晶显示模块&#xff0c;专门用来显示字母、数字、符号等的点阵型液晶显示模块…

Windows 安全基础——NetBIOS篇

Windows 安全基础——NetBIOS篇 1. NetBIOS简介 NetBIOS&#xff08;Network Basic Input/Output System, 网络基本输入输出系统&#xff09;是一种接入服务网络的接口标准。主机系统通过WINS服务、广播及lmhosts文件多种模式&#xff0c;把NetBIOS名解析对应的IP地址&#xf…

IntelliJ IDEA无公网远程连接Windows本地Mysql数据库提高开发效率

&#x1f525;博客主页&#xff1a; 小羊失眠啦. &#x1f3a5;系列专栏&#xff1a;《C语言》 《数据结构》 《Linux》《Cpolar》 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;…

资产侦查灯塔系统ARL部署

在docker和docker-compose都安装好的前提下进行部署 随便创建一个目录 mkdir docker_arl 切换到该目录 cd docker_arl 下面步骤是安装pip&#xff0c;如果已安装可以直接跳到wget命令下载灯塔系统文件 &#xff08;但是我不确定pip版本是否有影响&#xff0c;你也可以将命…

iOS按钮控件UIButton使用

1.在故事板中添加按钮控件,步聚如下: 同时按钮Shift+Commad+L在出现在控件库中选择Button并拖入View Controller Scene中 将控件与变量btnSelect关联 关联后空心变实心 如何关联?直接到属性窗口拖按钮变量到控件上,出现一条线,然后松开,这样就关联成功了 关联成功后属性窗口…

Clickhouse RoaringBitmap

https://blog.csdn.net/penriver/article/details/119736050 https://juejin.cn/post/7179956435806076988 BitMap适合连续密集的正整数存储&#xff0c;对于稀疏的正整数存储&#xff0c;其性能在很多时候是没办法和int数组相比的&#xff0c;尤其是正整数跨度较大的场景&…