『现学现忘』Git后悔药 — 33、revert撤销(二)

提示:接上一篇文章。

4、一次移除某几次提交

上一篇文章的演示中,只有两个提交需要 revert,我们可以一个个回退。但如果有几十个呢?一个个回退肯定效率太低而且容易出错。

(接上面示例)

我们可以使用以下方法进行批量回退:

命令: git revert <commit6> <commit5> <commit4> &#x2026;</commit4></commit5></commit6>

注意:提交的顺序是从最近的提交开始往前写。

示例:

# 1.查看版本库历史提交记录
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/revert_test (master)
$ git log --oneline
30f7626 (HEAD -> master) Revert "第6次提交,revert 撤销第3次提交"
d0c8e48 Revert "第5次提交,revert 撤销第4次提交"
c04b29c 第4次提交,新增内容:revert test v4
fd819dc 第3次提交,新增内容:revert test v3
c71ae3c 第2次提交,新增内容:revert test v2
557f7c3 第1次提交,新增readme.txt文件

# 2.把第5、6次提交移除
# 先写提交5ID,在写提交6ID
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/revert_test (master)
$ git revert d0c8e48 30f7626
Auto-merging readme.txt
CONFLICT (content): Merge conflict in readme.txt
error: could not revert d0c8e48... Revert "第5次提交,revert 撤销第4次提交"
hint: after resolving the conflicts, mark the corrected paths
hint: with 'git add ' or 'git rm '
hint: and commit the result with 'git commit'

说明:

  • Auto-merging readme.txt:自动合并 readme.txt文件出现问题。
  • CONFLICT (content): Merge conflict in readme.txt:冲突(内容):在readme.txt中合并冲突。
  • error: could not revert d0c8e48... Revert "&#x7B2C;5&#x6B21;&#x63D0;&#x4EA4;&#xFF0C;revert &#x64A4;&#x9500;&#x7B2C;4&#x6B21;&#x63D0;&#x4EA4;":无法还原d0c8e48提交。
  • hint: after resolving the conflicts, mark the corrected paths:解决冲突后,把冲突文件提交到暂存区。
  • hint: with 'git add <paths>' or 'git rm <paths>'</paths></paths>:可使用” git add
  • hint: and commit the result with 'git commit':提示:并使用’git commit’提交结果。

我们应该先写 commit-6,在写 commit-5

# 1.撤销第5、6次提交
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/revert_test (master)
$ git revert 30f7626 d0c8e48
[master 31341a4] Revert "Revert "第7次提交,revert 撤销第5、6次提交""
 1 file changed, 1 insertion(+)
[master 509c208] Revert "Revert "第8次提交,revert 撤销第5、6次提交""
 1 file changed, 1 insertion(+)

# 2.查看版本库历史提交记录
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/revert_test (master)
$ git log --oneline
509c208 (HEAD -> master) Revert "Revert "第8次提交,revert 撤销第5、6次提交""
31341a4 Revert "Revert "第7次提交,revert 撤销第5、6次提交""
30f7626 Revert "第6次提交,revert 撤销第3次提交"
d0c8e48 Revert "第5次提交,revert 撤销第4次提交"
c04b29c 第4次提交,新增内容:revert test v4
fd819dc 第3次提交,新增内容:revert test v3
c71ae3c 第2次提交,新增内容:revert test v2
557f7c3 第1次提交,新增readme.txt文件

# 3.查看readme.txt文件内容,又回到V4版本了
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/revert_test (master)
$ cat readme.txt
revert test v1
revert test v2
revert test v3
revert test v4

我们可以看到,每撤销一个commit提交,都会生成一个新的提交。上面撤销了两个commit,就让你编写两次提交说明信息。

这时,错误的提交 commit-5commit-6 依然保留,将来进行甩锅的时候也有依可循。而且,这样操作的话 HEAD 指针是往后移动的,可以直接使用 git push 命令推送到远程仓库里, 而这种做法,正是企业所鼓励的

命令: git revert <commit新>...<commit旧></commit旧></commit新>

(这里就不做演示了,同上)

注意:

  • 含头不含尾,也就是撤销的提交,包含 <commit新></commit新>,不包含 <commit旧></commit旧>
  • 提交的顺序也是,最新的commit开头,然后往前到比较远的commit提交。
  • 移除过程中如果有冲突:
    不知道某次提交的修改内容,可以使用 git show 查看修改内容。
    Git冲突的时候会提示当前要还原的commit的id是多少,如上 error: could not revert d0c8e48... Revert "&#x7B2C;5&#x6B21;&#x63D0;&#x4EA4;&#xFF0C;revert &#x64A4;&#x9500;&#x7B2C;4&#x6B21;&#x63D0;&#x4EA4;"
  • 过程中移除了几次提交的修改,也会相应的生成几次 revert commit记录。

5、revert命令常用参数

(1) -n 参数

作用: git revert 命令移除某几次的提交的修改,但是不要使用还原的更改创建任何提交,还原只是修改工作树和索引。简写 -n,全称 --no-commit

命令: git revert -n <commit新>...<commit旧></commit旧></commit新>

(2) -m 参数

作用: git revert 移除merge(合并)的修改内容。

简写: -m parent-number ,全称: --mainline parent-number

命令: git revert [-m parent-number] <commit></commit>

说明:

如果我们需要还原的提交的是merge的操作,直接使用 git revert <commit></commit> 的方式是不行的,会提示我们:

error: commit ... is a merge but no -m option was given.

fatal: revert failed

因为merge操作有两个分支,而revert不知道要还原哪个分支的提交,就没法进行还原\移除那些提交记录的修改的操作了,所以我们用 -m 1来告诉 git revert命令哪个是主线,哪个是非主线。(选择主线就还原非主线,选择非主线就还原主线)

另外,这个主线是1还是2是从哪里看出来的呢?

我们可以使用 git show 命令查看,如果是普通的commit提交,通常会显示这个commit的id、作者、日期、备注、更改文件内容等;如果是merge的记录,则会显示merge 的commit-id,备注、日期和merge的主线和合并过来的id。

例如:

commit 63374e93eebd2b86882e5a4bb75dcd9d0e334b15
Merge: bc64f61 72032b7
Author: unknown [test@163.com](mailto:test@163.com)
Date: Sun Jul 19 11:34:21 2020 +0800

  Merge branch 'testcopy2' into testcopy

如上第二行, Merge: bc64f61 72032b7bc64f61 就是主线的id,编号就是1; 72032b7就是非主线的id,编号就是2。
此时,我们要把合并过来的分支的修改给还原掉,那么就可以指定1为主线,还原掉2的提交了。

6、 git revertgit reset 命令的区别

通过以上对比可以发现, git reset 命令与 git revert 命令最大的差别就在于, git reset 命令会失去后面的提交,而 git revert 命令是通过反做的方式重新创建一个新的提交,而保留原有的提交。在企业里,应尽量使用 git revert 命令,能不用 git reset 命令尽量不用。

Original: https://www.cnblogs.com/liuyuelinfighting/p/16790887.html
Author: 繁华似锦Fighting
Title: 『现学现忘』Git后悔药 — 33、revert撤销(二)



相关阅读

Title: pythonscrapy爬虫 崔庆才_[Python3 网络爬虫开发实战] 13.1–Scrapy 框架介绍

『现学现忘』Git后悔药 — 33、revert撤销(二)

13.1 Scrapy 框架介绍

Scrapy 是一个基于 Twisted 的异步处理框架,是纯 Python 实现的爬虫框架,其架构清晰,模块之间的耦合程度低,可扩展性极强,可以灵活完成各种需求。我们只需要定制开发几个模块就可以轻松实现一个爬虫。

  1. 架构介绍

首先我们来看下 Scrapy 框架的架构,如图 13-1 所示:

『现学现忘』Git后悔药 — 33、revert撤销(二) 图 13-1 Scrapy 架构 它可以分为如下的几个部分。

Engine,引擎,用来处理整个系统的数据流处理,触发事务,是整个框架的核心。

Item,项目,它定义了爬取结果的数据结构,爬取的数据会被赋值成该对象。

Scheduler, 调度器,用来接受引擎发过来的请求并加入队列中,并在引擎再次请求的时候提供给引擎。

Downloader,下载器,用于下载网页内容,并将网页内容返回给蜘蛛。

Spiders,蜘蛛,其内定义了爬取的逻辑和网页的解析规则,它主要负责解析响应并生成提取结果和新的请求。

Item Pipeline,项目管道,负责处理由蜘蛛从网页中抽取的项目,它的主要任务是清洗、验证和存储数据。

Downloader Middlewares,下载器中间件,位于引擎和下载器之间的钩子框架,主要是处理引擎与下载器之间的请求及响应。

Spider Middlewares, 蜘蛛中间件,位于引擎和蜘蛛之间的钩子框架,主要工作是处理蜘蛛输入的响应和输出的结果及新的请求。

  1. 数据流

Scrapy 中的数据流由引擎控制,其过程如下:

Engine 首先打开一个网站,找到处理该网站的 Spider 并向该 Spider 请求第一个要爬取的 URL。

Engine 从 Spider 中获取到第一个要爬取的 URL 并通过 Scheduler 以 Request 的形式调度。

Engine 向 Scheduler 请求下一个要爬取的 URL。

Scheduler 返回下一个要爬取的 URL 给 Engine,Engine 将 URL 通过 Downloader Middlewares 转发给 Downloader 下载。

一旦页面下载完毕, Downloader 生成一个该页面的 Response,并将其通过 Downloader Middlewares 发送给 Engine。

Engine 从下载器中接收到 Response 并通过 Spider Middlewares 发送给 Spider 处理。

Spider 处理 Response 并返回爬取到的 Item 及新的 Request 给 Engine。

Engine 将 Spider 返回的 Item 给 Item Pipeline,将新的 Request 给 Scheduler。

重复第二步到最后一步,直到 Scheduler 中没有更多的 Request,Engine 关闭该网站,爬取结束。

通过多个组件的相互协作、不同组件完成工作的不同、组件对异步处理的支持,Scrapy 最大限度地利用了网络带宽,大大提高了数据爬取和处理的效率。

  1. 项目结构

Scrapy 框架和 pyspider 不同,它是通过命令行来创建项目的,代码的编写还是需要 IDE。项目创建之后,项目文件结构如下所示:

1

2

3

4

5

6

7

8

9

10

11

12

scrapy.cfg

project/

init.py

items.py

pipelines.py

settings.py

middlewares.py

spiders/

init.py

spider1.py

spider2.py

这里,每个文件的功能描述如下:

[En]

Here, the functions of each file are described as follows:

scrapy.cfg:它是 Scrapy 项目的配置文件,其内定义了项目的配置文件路径、部署相关信息等内容。

items.py:它定义 Item 数据结构,所有的 Item 的定义都可以放这里。

pipelines.py:它定义 Item Pipeline 的实现,所有的 Item Pipeline 的实现都可以放这里。

settings.py:它定义项目的全局配置。

middlewares.py:它定义 Spider Middlewares 和 Downloader Middlewares 的实现。

spiders:其内包含一个个 Spider 的实现,每个 Spider 都有一个文件。

  1. 结语

本节介绍了 Scrapy 框架的基本架构、数据流过程以及项目结构。后面我们会详细了解 Scrapy 的用法,感受它的强大。

文章来源: cuiqingcai.com,作者:崔庆才,版权归原作者所有,如需转载,请联系作者。

原文链接:cuiqingcai.com/8364.html

Original: https://blog.csdn.net/weixin_39740346/article/details/114408010
Author: weixin_39740346
Title: pythonscrapy爬虫 崔庆才_[Python3 网络爬虫开发实战] 13.1–Scrapy 框架介绍

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/363529/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

最近整理资源【免费获取】:   👉 程序员最新必读书单  | 👏 互联网各方向面试题下载 | ✌️计算机核心资源汇总