整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

使用 diff 到底查看修改了哪些代码?

源代码查看百度文库_查看源代码有什么用_源代码怎么看

作者| idaxia

6.1 名词定义

在学习 Git 的diff命令之前,我们先来统一 一下两个名词的理解,分别是工作区和暂存区。

6.1.1 工作区

工作区,指的是当前正在编辑的文件,将还没有修改的内容通过git add命令暂存起来;比如我现在修改了index.php文件中的一行代码,没有执行git add index.php命令,那么 index.php 便处于工作区状态。

6.1.2 暂存区

暂存区,指的是文件修改之后并且通过git add命令临时存储到版本记录里了,但还没有正式通过git commit提交的阶段;比如我现在新增一个test.php文件,使用了git add test.php命令,那么此时, test.php 文件的改动就已经进入到了暂存区。

6.2 比较工作区变动

现在我编辑了index.php文件,并且在里面加入了内容,如果我想通过 git 命令查看增加了哪些内容,参考命令如下

git diff

执行命令之后,绿色部分代表增加的内容,红色部分代表删除的内容,执行结果如下图所示:

源代码查看百度文库_源代码怎么看_查看源代码有什么用

在图中可以看到我在 index.php 中增加了。

6.3 比较暂存区变动

有些时候,我们可能已经通过git add命令,将某些文件从工作区添加到暂存区,但又想回过头,来看此文件刚才改动哪些内容的场景;比如下图中是我刚才新建了一个diff.php文件,并且已经添加到暂存区,如下图执行了git status命令结果所示:

查看源代码有什么用_源代码怎么看_源代码查看百度文库

但我突然发现,我已经忘记这个文件里到底有哪些内容被改变了,于是我使用了git diff diff.php命令查看变动的内容,执行结果如下图所示:

查看源代码有什么用_源代码查看百度文库_源代码怎么看

在 Git 的返回信息中却无法看到修改详情,原因是因为 diff.php 文件被提交到暂存区之后,工作区并没有再次改动,此时工作区与暂存区一致,当然就不能看出改动情况了。

查看源代码有什么用_源代码查看百度文库_源代码怎么看

这个时候,如果想要看diff.php文件里面修改了什么内容,就不是再把工作区和暂存区进行对比了,而是需要把暂存区与版本库最近一次 commit 的内容进行比较,参考命令如下:

git diff --cached  diff.php

命令执行结果如下图所示

源代码怎么看_源代码查看百度文库_查看源代码有什么用

在图中可以看出,diff.php 中新增了一行代码,内容为lisi 。

6.4 与指定记录比较

有些时候,我们可能需要代码和历史的某一个版本进行比较,这个时候你可以先通过git log命令,找到历史提交记录的一个 hash 值,如下图所示:

源代码查看百度文库_源代码怎么看_查看源代码有什么用

6.4.1 工作区比较

将要比较的 hash 值复制下来,然后执行如下所示命令:

git diff hash

源代码查看百度文库_查看源代码有什么用_源代码怎么看

在上图中,可以看到工作区和指定记录存在的差异。

6.4.2 暂存区比较

有些时候,我们想把暂存区的改动和指定记录进行对比,那么在命令中加入--cached 即可,参考命令如下:

git diff --cached hash

执行结果如下图所示:

源代码查看百度文库_查看源代码有什么用_源代码怎么看

从图中可以看到 diff.php 文件,在指定的版本还未存在,在当前的暂存区中被添加了进来,新增的内容有一行,内容是lisi。

源代码怎么看_源代码查看百度文库_查看源代码有什么用

6.5 与最新版本库比较

很多时候,我们只需要将未正式提交的代码(包含工作区与暂存区)与最新的 commit 记录进行比较,虽然也可以通过指定 commit 的 hash 值进行,但是却很不方便,需要先获取到 hash 值,这里介绍一个简单的方法,可以通过git diff HEAD命令方式快速对比,参考命令如下:

git diff HEAD

执行命令返回结果如下:

源代码怎么看_查看源代码有什么用_源代码查看百度文库

在执行的命令中,HEAD指的是当前所在的分支名,如果你想比较其他分支也可以将 HEAD 改成其他分支名。

6.6 比较两个历史记录

有时候,可能会需要查看某一次提交记录修改了什么内容,这个时候就需要将两个历史记录进行比较;首先通过git log命令获取到需要查看的记录 hash 值,然后再找到这个记录的上一个版本的 hash 值,拼接的参考命令如下所示:

git diff hash值1  hash值2

命令执行之后,显示的效果如下:

源代码查看百度文库_源代码怎么看_查看源代码有什么用

6.7 小结

在这节内容中,主要介绍了工作区和暂存区的概念,以及如何使用diff命令进行比较差异,主要知识点有以下:

工作区,是指目前改动的内容还未使用git add临时存储

暂存区,是指改动的内容已经临时存储,还未正式通过git commit提交

比较修改的命令为git diff,不同情况增加不同参数

查看暂存区的额外参数为--cached

比较历史差异输入一个 hash 值,则是把当前的改动和历史差异对比,两个 hash 值则是把前一个版本和后面一个版本进行对比

源代码怎么看_源代码查看百度文库_查看源代码有什么用

如何写好设计文档

一份好的设计文档需要提供清晰的问题描述、整体的概要设计、涵盖各个细节的详细设计等。

这篇有趣的英文小短文通过一个简单的小例子介绍了Google工程师是怎么写设计文档的。本文为中文翻译。原文链接如下:

写文档是我在谷歌学到的最重要的技能之一。在谷歌,文档被用来讨论问题、作为真实的信息源、组织知识。在我工作过的其他公司中,没有一家对如何使用文档进行协作有这样深刻的理解。

这篇文章就是关于我在谷歌如何写设计文档的一个例子,这是一个真实的项目,用于在新冠疫情期间控制健身房现场人数。即使在新冠疫情结束后不需要预约健身房了,也可以访问GitHub上的源代码[1]。为了让这篇文章更有趣,现在每个人都可以在谷歌文档[2]上进行评论,而且谷歌文档的格式也比Medium支持的要好。

01 问题描述

在新冠疫情期间,要求健身房控制现场会员总数,要求会员在去健身房之前先在网站上预订。预约需要提前两天,从午夜开始。例如,2021年04月01日的预订将在当地时间2021年03月30日00:00 AM开放。

这个健身房里的游泳池提供的位置非常有限。我尝试了好几次,都没能预定到早上6点的时间,后来工作人员告诉我,由于需求量很大,必须在午夜预订。但是熬夜到半夜会打乱我的生物钟,所以我没法接受。

而且我觉得雇人做这件事也很不好,因为在内心深处,我认为早睡是健康高效生活方式的核心习惯,用金钱剥夺别人的好习惯是不道德的。在被告知没有别的办法之后,我决定写一个程序来为我做预订。

我个人认为用机器人来做工作是对别人的不公平,所以我对这个决定一点儿也没感到自豪。相反,我认为健身房应该提高一些场地的价格。但这显然超出了设计文档的范围,而且是非常主观的想法。

02 需求

不在考虑范围内:

03 概要设计浏览器自动化 vs 模拟请求

浏览器自动化是指通过程序来控制真实的浏览器,并在GUI上自动化操作。模拟请求是指让程序通过HTTP与服务器交互,这个程序就像是一个Web浏览器(而不是控制一个浏览器)。

考虑到下面几点,我认为浏览器自动化比模拟请求更好:

显然利大于弊。

软件详细设计文档示例_软件系统详细设计文档_文档详细软件设计系统包括

系统概述

软件系统详细设计文档_文档详细软件设计系统包括_软件详细设计文档示例

image-253465

[3]是一个提供浏览器自动化解决方案的软件库。我们的程序将用Python编写,并通过Python API控制,则通过它的Gecko驱动程序控制Firefox。

[4]是一个阻止操作系统进入睡眠状态的程序。如果系统休眠,程序将无法在半夜运行。

04 详细设计用户输入

用户名、密码、日期等都是从命令行参数中输入的。

重试

程序将捕获所有异常(页面未加载等)并重试100次直到预订成功,成功的预订通过确认DOM元素进行识别。

浏览器选择

我们需要使用主流浏览器之一。我考虑并测试了Chrome、Firefox和Safari,Safari和Chrome都需要额外的步骤来使用相应的驱动程序,所以我选择了Firefox。它也需要一些来自操作系统设置的认证,但只需要在最初几次确认就可以了。

日志

程序自动执行浏览器操作,就像是由用户发起的一样。本质上,它将在循环中执行以下操作:

查找某个元素对元素进行操作(输入文本、选择选项或单击)等待预期结果,然后返回1

软件系统详细设计文档_软件详细设计文档示例_文档详细软件设计系统包括

因此,每个日志记录将有两项内容:

这样的日志记录将使调试变得容易。

保持电脑持续运行

如果操作系统在程序启动到午夜之间进入休眠状态,则程序在午夜就无法运行了,可以防止这种情况发生。它是一个命令行工具,我们在Python中把它作为子进程启动:

subprocess.Popen([‘caffeinate’, ‘-d’, ‘-w’, ‘%d’ % os.getpid()])

定位控制

提供了一组方法[5]来访问特定的DOM元素,其中xpath的表达能力最强。因此,我们将使用h来定位DOM元素,如按钮、输入框等。

只要有可能,我们宁愿依赖DOM的内部文本来定位它们。相对于DOM结构和属性(类名等),内部文本的优势并不是说它不太可能更改,而是如果它们发生更改,更容易调试。当然,我们必须对DOM结构做一些假设,比如我们需要点击class='control'分区(div)下的class='logon'的第二个按钮。

等待页面加载

在发送每个HTTP请求后,程序需要等待加载页面(通常是2~5秒,是的,这个站点很慢)。这是由 API[6]完成的。例如,以下代码将等待120秒,直到 被加载并成为可被点击的按钮。

book_btn = WebDriverWait(driver, 120).until(EC.element_to_be_clickable((By.XPATH, “//button[@ng-reflect-router-link=’/Appointments’]”)))

如果按钮在120秒内加载失败,将引发异常。