iOS.& Swift Books Git学徒

3
提出你的变化 由Chris Belanger撰写& Sam Davies

前一章向您展示了如何将远程存储库克隆到本地系统。此时,您已准备好开始更改存储库。那太棒了!

但是,清楚地,只是让您的本地文件的更改并非您需要做的。您需要暂停对文件的更改,以便Git知道更改。完成更改后,您需要告诉您要将这些更改提交到存储库的git。

什么是犯罪?

正如您现在可能猜到的那样,Git Repo不仅仅是一系列文件;表面下面有一点越来越多地追踪你的改变的各种状态,更重要的是,与这些变化有关。

要启动,请回到主页为您的叉子存储库 //github.com/[your-username]/ideas,并在存储库页面的顶部找到小“11提交”链接:

笔记 :如果您没有完成最后一章的挑战,请创建一个叉子 //github.com/raywenderlich/ideas 并将其克隆到您当地的工作站。

单击该链接,您将看到此存储库的历史记录:

每个条目都是一个 犯罪 ,这基本上是在时间点在存储库中的存储库集合的特定状态的快照。

通常,提交表示文件集合的一些逻辑更新。想象一下,您正在向您的想法列表添加新项目,您可以根据您的想法添加。您希望将该位的工作捕获到存储库中。

在开始这些更新之前的存储库状态 - 从起点,实际上是 - 是 父母 犯罪。在你提交你的变化之后 - 这是 - 下一个提交就是 孩子 犯罪。下图解释了这一点:

两个提交的例子,左边的父父,右边的孩子。
两个提交的例子,左边的父父,右边的孩子。

在此示例中,我已将新文本添加到提交之间的文件中。父提交是左侧文件,子提交是右手文件。它们之间的差异是我对单个文件所做的更改:

差异是上述两个提交之间的差异。
差异是上述两个提交之间的差异。

差异不仅要添加到文件;创建新内容,修改内容和删除内容是您在存储库中的文件中的其他常见更改。

在Git中,更改文件并创建提交之间存在几个步骤。起初,这似乎有点沉重的方法,但是,在您通过构建您的提交时,您会看到每个步骤如何帮助您创建一个工作流程,使您能够与存储库中的文件进行调整以及发生的内容给他们。

理解构建提交的过程的最简单方法是实际创建一个。您将为文件创建一个更改,请参阅Git如何确认更改,如何逐步更改,最后,如何提交到存储库的更改。

从改变开始

打开终端程序并导航到 思想 存储库;在我的情况下,我把它放在里面 gituppentice. 目录。这应该是您在上一章中创建的叉子存储库的克隆。

笔记 :如果您错过了第2章结束时填写挑战,请立即返回并遵循挑战解决方案,以便您有一个叉子的本地克隆 思想 存储库与之合作。

假设您要为书籍文件添加更多想法。打开 书籍/ book_ideas.md. in any plaintext editor. I like to use nano since it’s quick and easy, and I don’t need to remember any obscure commands to use it.

在文件的末尾添加一行以捕获新的书籍想法:“开发人员的护理和喂养。”注意遵循与其他条目相同的格式。您的文件应该如下所示:

# Ideas for new book projects

- [ ] Hotubbing by tutorials
- [x] Advanced debugging and reverse engineering
- [ ] Animal husbandry by tutorials
- [ ] Beginning tree surgery
- [ ] CVS by tutorials
- [ ] Fortran for fun and profit
- [x] RxSwift by tutorials
- [ ] Mastering git
- [ ] Care and feeding of developers

完成后,保存您的工作并返回终端程序。

在背景中,Git正在观看你正在做的事情。不相信我?执行以下命令以查看git知道您在此处完成的内容:

git status

git status 向您展示工作树的当前状态 - 即您正在进行的目录中的文件集合。在您的情况下,工作树是您的一切 思想 directory.

您应该看到以下输出:

~/GitApprentice/ideas $ git status
On branch master
Your branch is up to date with 'origin/master'.

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

	modified:   books/book_ideas.md

no changes added to commit (use "git add" and/or "git commit -a")

啊,你刚刚改变了文件: 书籍/ book_ideas.md.. Git knows that you’ve modified it… but what does it mean when Git says, Changes not staged for commit?

现在是短时间转移到Git中文件的各种状态的时候了。建立一个智者的心理模型将有很长的方式来了解Git正在做的事情......特别是当Git做一些你不太理解的事情时。

工作树木和分期区域

工作副本 或者 工作树 或者 工作目录 (语言很棒,总是有一个以上的东西)是你磁盘上的项目文件的集合,你可以直接使用和修改,就像你一样 书籍/ book_ideas.md. above.

Git在三个不同状态下考虑工作树中的文件:

  • 未修饰
  • 修改的
  • 上演

未修饰 只意味着自上次提交以来您没有更改此文件。 修改的 与此相反只是:Git看到,自上次提交以来,您可以以某种方式修改此文件。但是这个“阶段”的状态是什么?

如果您来自其他版本控制系统的背景,例如subversion,则可能会想到“提交”,只需将所有修改的当前状态保存到存储库。但Git是不同的,有点优雅。相反,Git允许您使用A的概念逐步构建您的下一个提交 分期区 .

笔记 :如果你曾经搬家过房子,你会理解这个范式。当你打包到移动时,你不会拿所有的物品并将它们松散地扔进移动范后面。 (好吧,也许你这样做,但是你 不应该 , 真的。)

相反,你采取纸板箱(暂存区域),并用类似的东西填充它,小心翼翼地让一切都齐全地包装在盒子里,取出一些不太属于的东西,并增加了一些你的事情忘了。

当你满意的时候,盒子是 只是 对,您关闭了带包装磁带的盒子,并将盒子放在面包车的背面。在这种情况下,您将盒子用作暂存区域,然后拿起盒子并放置在面包车上就像制作提交。

基本上,当您在项目的位和部分工作时,您可以标记更改或一组更改,如“上演”,这就是您告诉Git的方式,“嘿,我希望这些更改进入我的下一个提交...但我可能对你有一些更多的变化,所以只需坚持这些变化。“您可以在您的工作中添加和删除此暂存区域的更改,并且只有在您良好准备时,只提交对存储库的仔细策划更改。

注意到我说,“添加和删除 变化 从分期区域,“不”添加和删除 文件 从分期区域。“这里有一个明显的差异,在这里,你会看到你的前几个更改的比例只有一点。

暂存更改

Git’s pretty useful in that it (usually) tells you what do to in the output to a command. Look back at the output from git status above, and the Changes not staged for commit section gives you a few suggestions on what to do:

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

So since you want to get this change eventually committed to the repository, you’ll try the first suggestion: git add.

执行以下命令:

git add books/book_ideas.md

这 n, execute git status to see the results of what you’ve done:

~/GitApprentice/ideas $ git status
On branch master
Your branch is up to date with 'origin/master'.

Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
  modified:   books/book_ideas.md

啊,这似乎有点更好。 Git认识到您现在将这种变化放在暂存区域。

但是,您有另一个修改为您忘记的此文件:由于您正在阅读这本书,您可能应该检查在那里的“掌握Git”的条目,以将其标记为完整。

打开 书籍/ book_ideas.md. 在您的文本编辑器中并放置小写 x 在框中标记该项目的完整:

- [x] Mastering git

Save your changes and exit out of your editor. Now, execute git status again (yes, you’ll use that command often to get your bearings), and see what Git tells you:

~/GitApprentice/ideas $ git status
On branch master
Your branch is up to date with 'origin/master'.

Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
  modified:   books/book_ideas.md

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
  modified:   books/book_ideas.md

是什么赋予了? git现在告诉你 书籍/ book_ideas.md. 两个都 分阶段和没有上演?这个怎么可能?

请记住,你是暂存的 变化 在这里,不是 文件 . Git understands this, and tells you that you have one change already staged for commit (the Care and feeding of developers change), and that you have one change that’s not yet been staged — marking Mastering git as complete.

要详细了解这一点,您可以告诉Git向您展示它所看到的内容。请记住 我们早些时候谈过了?是的,这是你的下一个新命令。

执行以下命令:

git diff

您将看到类似于以下内容的内容:

 差  --git a/books/book_ideas.md b/books/book_ideas.md
index 76dfa82..5086b1f 100644
--- a/books/book_ideas.md
+++ b/books/book_ideas.md
@@ -7,5 +7,5 @@
 - [ ] CVS by tutorials
 - [ ] Fortran for fun and profit
 - [x] RxSwift by tutorials
-- [ ] Mastering git
+- [x] Mastering git
 - [ ] Care and feeding of developers

That looks pretty obtuse, but a diff is simply a compact way of showing you what’s changed between two files. In this case, Git is telling you that you’re comparing two versions of the same file — the version of the file in your working directory, and the version of the file that you told Git to stage earlier with the git add command:

--- a/books/book_ideas.md
+++ b/books/book_ideas.md

它还向您展示了这两个版本之间的变化:

-- [ ] Mastering Git
+- [x] Mastering Git

- prefix means that a line (or a portion of that line) has been deleted, and the + prefix means that a line (or a portion of that line) has been added. In this case, you deleted the space and added an x character.

You’ll learn more about git diff as you go along, but that’s enough to get you going for now. Time to stage your latest change.

It gets a bit tedious to always type the full name of the file you want to stage with git add. And, let’s be honest, most of the time you really just want to stage 全部 你所做的变化。 Git让你的背部有一个很棒的捷径。

执行以下内容:

git add .

完整停止(或期间)字符告诉git将其在此目录和所有其他子目录中添加到暂存区域的所有更改。它非常方便,你会在工作流程中使用很多。

Again, execute git status to see what’s ready in your staging area:

~/GitApprentice/ideas $ git status
On branch master
Your branch is up to date with 'origin/master'.

Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
  modified:   books/book_ideas.md

看起来不错。没有什么遗留留下,你只需看到更改 书籍/ book_ideas.md. 那准备好提交。

As an interesting point, execute git diff again to see what’s changed:

~/GitApprentice/ideas $ git diff
~/GitApprentice/ideas $

Uh, that’s interesting. git diff reports that nothing has changed. But if you think about it for a moment, that makes sense. git diff compares your working tree to the staging area. With git add ., you put everything from your working tree into the staging area, so there 应该 您的工作树和分期之间没有差异。

如果你想成为 真的 thorough (or if you don’t trust Git quite yet), you can ask Git to show you the differences that it’s staged for commit with an extra option on the end of git diff.

前任 ecute the following command, making note that it’s two -- characters, not one:

git diff --staged

您将看到类似于以下内容的差异:

~/GitApprentice/ideas $ git diff --staged
diff --git a/books/book_ideas.md b/books/book_ideas.md
index 1a92ca4..5086b1f 100644
--- a/books/book_ideas.md
+++ b/books/book_ideas.md
@@ -7,4 +7,5 @@
 - [ ] CVS by tutorials
 - [ ] Fortran for fun and profit
 - [x] RxSwift by tutorials
-- [ ] Mastering git
+- [x] Mastering git
+- [ ] Care and feeding of developers

这是改变的行:

-- [ ] Mastering git
+- [x] Mastering git
+- [ ] Care and feeding of developers

You’ve removed something from the Mastering Git line, added something to the Mastering Git line, and added the Care and feeding of developers line. That seems to be everything. Looks like it’s time to actually commit your changes to the repository.

提出你的变化

您已完成所有更改,并且您已准备好提交存储库。只需执行以下命令以使您的第一个提交:

git commit

Git将带您进入一个相当令人困惑的状态。这是我在终端计划中看到的:


# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
#
# On branch master
# Your branch is up to date with 'origin/master'.
#
# Changes to be committed:
#       modified:   books/book_ideas.md
#
~
~
~
~
"~/GitApprentice/ideas/.git/COMMIT_EDITMSG" 10L, 272C

If you haven’t been introduced to vim before, welcome! vim. 是Git使用的默认文本编辑器,它需要从您的自由文本输入。

如果您阅读Git在那里提供的第一个小指令,那么它就会明显Git要求:

# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.

啊 - git需要一个消息为您的提交。如果您认为您在本章前面看到的提交列表中,您会注意到每个条目都有一点消息:

在Vim中工作并不完全直观,但一旦您了解命令,它并不困。

按下 I 键盘上的键进入 插入 mode, and you’ll see the status line at the bottom of the screen change to -- INSERT-- to indicate this. You’re free to type what you like here, but stay simple and keep your message to just one line to start.

为您的提交消息键入以下内容:

Added new book entry and marked Git book complete

完成后,您需要告诉Vim保存文件并退出。按下插入模式退出 逃脱 key first.

现在,键入冒号( 转移 + ; 在我的美国键盘上)进入 前任 模式,允许您执行命令。

To save your work and exit in one fell swoop, type wq — which means “write” and “quit” in that order, and press 进入 :

:wq

您将被带回命令行,并显示您的提交结果:

~/GitApprentice/ideas $ git commit
[master 57f31b3] Added new book entry and marked Git book complete
 1 file changed, 2 insertions(+), 1 deletion(-)

That’s it! There’s your first commit. One file changed, with two insertions and one deletion. That matches up with what you saw in git diff earlier in the chapter.

既然您已学习如何为文件进行更改,您将查看添加新文件和目录到存储库。

添加目录

您的项目中有目录,以持有书籍,视频和文章的想法。但是有一个目录还可以存储书面教程的想法是很好的。因此,您将创建一个目录和一个想法文件,并将这些文件添加到存储库中。

返回终端程序,执行以下命令以创建名为的新目录 教程 :

mkdir tutorials

这 n, confirm that the directory exists, using the ls command:

~/GitApprentice/ideas $ ls
LICENSE		articles	tutorials
README.md	books		videos

所以目录在那里;现在,您可以看到Git如何识别新目录。执行以下命令:

git status

你会看到以下内容:

~/GitApprentice/ideas $ git status
On branch master
Your branch is ahead of 'origin/master' by 1 commit.
  (use "git push" to publish your local commits)

nothing to commit, working tree clean

呃,这似乎不对。为什么不能Git看到你的新目录?这是通过设计,它反映了Git对文件和目录的看法的方式。

git如何观看你的工作树

在它的核心,Git真的只知道 文件 ,没有任何东西 目录 。 git将文件视为“指向git追踪的实体的字符串”。如果您考虑过这个,它会有些感觉:如果文件可以唯一引用作为文件的完整路径,则单独跟踪目录是非常冗余的。

例如,这是当前项目中当前的所有文件(不包括隐藏文件,隐藏目录和空目录)的列表:

 思想 /LICENSE
ideas/README.md
ideas/articles/clickbait_ideas.md
ideas/articles/live_streaming_ideas.md
ideas/articles/ios_article_ideas.md
ideas/books/book_ideas.md
ideas/videos/content_ideas.md
ideas/videos/platform_ideas.md

这是Git如何查看项目的简化版本:在存储库中跟踪的文件的路径列表。根据此,在将存储库克隆到本地系统时,Git可以轻松快速地重新创建目录和文件结构。

您将在本书中级部分中了解Git的内部工作,但是,现在,您只需弄清楚如何获取Git来获取要添加到存储库的新目录。

。保留文件

制作Git的解决方案识别目录清楚地将文件放入其中。但是,如果你没有任何东西可以放在这里,或者你想要一个空目录在每个项目的克隆中出现的东西?

解决方案是使用占位符文件。通常的约定是创建一个隐藏的零字节 。保持 文件在您想要Git的目录内部“查看”。

To do this, first navigate into the 教程 directory that you just created with the following command:

cd tutorials

然后创建一个名为的空文件 。保持 , using the touch command for expediency:

touch .keep

笔记 : The touch command was originally designed to set and modify the “modified” and “accessed” times of existing files. But one of the nice features of touch 是 that, if a specified file doesn’t exist, touch will automatically create the file for you.

touch 是打开文本编辑器以创建和保存空文件的不错替代方案。经验丰富的命令行用户大部分时间都会利用此捷径。

执行以下命令以查看此目录的内容,包括隐藏的dotfiles:

ls -a

您应该看到以下内容:

~/GitApprentice/ideas/tutorials $ ls -a
.	..	.keep

有你的隐藏文件。让我们看看Git现在想到这个目录。执行以下命令返回主项目目录:

cd ..

Now, execute git status to see Git’s understanding of the situation:

~/GitApprentice/ideas $ git status
On branch master
Your branch is ahead of 'origin/master' by 1 commit.
  (use "git push" to publish your local commits)

Untracked files:
  (use "git add <file>..." to include in what will be committed)
	tutorials/

nothing added to commit but untracked files present (use "git add" to track)

Git现在明白该目录中有一些东西,但它是 un , which means you haven’t yet added whatever’s in that directory to the repository. Adding the contents of that directory is easy to do with the git add command.

前任 ecute the following command, which is a slightly different form of git add:

git add tutorials/\*

笔记 :上面与两个斜杠的奇怪格式应该在Bash shell或KSH shell中等效,这是较新麦斯科斯系统上的当前默认值。

当你 可以 have just used git add . as before to add all files, this form of git add 是 a nice way to 只要 在特定目录或子目录中添加文件。在这种情况下,您将告诉git暂停下面的所有文件 教程 directory.

Git现在告诉您它正在跟踪此文件,它在暂存区域中:

~/GitApprentice/ideas $ git status
On branch master
Your branch is ahead of 'origin/master' by 1 commit.
  (use "git push" to publish your local commits)

Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
  new file:   tutorials/.keep

您现在可以提交给存储库的添加。但是,而不是用vim和文本编辑器调用整个业务,而是有一个快捷方式将文件提交到存储库并在一次拍摄中添加一条消息。

执行以下命令以将暂处更改提交给存储库:

git commit -m "Adding empty tutorials directory"

您将看到以下内容,确认您的更改承诺:

~/GitApprentice/ideas $ git commit -m "Adding empty tutorials directory"
[master ce6971f] Adding empty tutorials directory
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 tutorials/.keep

笔记 :根据您正在使用的项目或组织,您通常会发现在Git提交消息内部有什么标准。

本书的早期零件与单行提交消息保持简单,但随着您在您的GIT职业生涯中提前,您将会看到为什么蒂姆教皇提出的50/72规则等一些标准 //tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html 当你深入了解git时,将使您的生活更轻松。

Once again, use git status to see that there’s nothing left to commit:

~/GitApprentice/ideas $ git status
On branch master
Your branch is ahead of 'origin/master' by 2 commits.
  (use "git push" to publish your local commits)

nothing to commit, working tree clean

您可能已经意识到所有这些小犯罪都会让您对您的文件进行的零碎视图。并且,正如您继续在您的项目工作,您可能希望看到您所做的历史景色。 git提供了一种查看文件历史的方法,也称为 日志 .

看起来git log

在过去的几篇章节中,你已经做了一个令人惊讶的事情。要查看您已完成的内容,请执行以下命令:

git log

你会得到一堆产出;我在下面的日志中显示了前几个位:

 犯罪  761a50d148a9d241712e3be4630db3dad6e010c8 (HEAD -> master)
Author: Chris Belanger <[email protected]>
Date:   Sun Jun 16 06:53:03 2019 -0300

    Adding empty tutorials directory

commit dbcfe56fa47a1a1547b8268a60e5b67de0489b95
Author: Chris Belanger <[email protected]>
Date:   Sun Jun 16 06:51:54 2019 -0300

    Added new book entry and marked Git book complete

commit c47084959448d2e0b6877832b6bd3ae70f70b187 (origin/master, origin/HEAD)
Author: Chris Belanger <[email protected]>
Date:   Thu Jan 10 10:32:55 2019 -0400

    Going to try this livestreaming thing

commit 629cc4d309cdcfe508791b09da447c3633448f07
Author: Chris Belanger <[email protected]>
Date:   Thu Jan 10 10:32:17 2019 -0400

    Some scratch ideas for the iOS team
.
.
.
.

您将在反向时间顺序中看到所有的提交。

笔记 : Depending on the number of lines you can see at once in your terminal program, your output may be paginated, using a reader like less. If you see a colon on the last line of your terminal screen, this is likely the case. Simply press the 空间栏 阅读后续文本页面。

当您到达文件的末尾时,您会看到(结束)。在任何时候,你可以按下 Q 退回命令提示符的键。

这 output above shows you your own commit messages, which are useful… to a point. Since Git knows everything about your files, you can use git log to see every detail of your commits, such as the actual changes, or diff, of each commit.

要查看此功能,请执行以下命令:

git log -p

这向您展示了您提交的实际差异,以帮助您了解具体更改的内容。这是我结果中的一个样本:

 犯罪  ce6971fbdb945fc5fb01b739b9dea9c9ae193cae (HEAD -> master)
Author: Chris Belanger <[email protected]>
Date:   Wed Jan 16 08:22:36 2019 -0400

    Adding empty tutorials directory

diff --git a/tutorials/.keep b/tutorials/.keep
new file mode 100644
index 0000000..e69de29

commit 57f31b37ea843d1f0692178c99307d96850eca57
Author: Chris Belanger <[email protected]>
Date:   Fri Jan 11 10:16:13 2019 -0400

    Added new book entry and marked Git book complete

diff --git a/books/book_ideas.md b/books/book_ideas.md
index 1a92ca4..5086b1f 100644
--- a/books/book_ideas.md
+++ b/books/book_ideas.md
@@ -7,4 +7,5 @@
 - [ ] CVS by tutorials
 - [ ] Fortran for fun and profit
 - [x] RxSwift by tutorials
-- [ ] Mastering Git
+- [x] Mastering Git
+- [ ] Care and feeding of developers
.
.
.

以反向时间顺序,我添加了 。保持 文件到 教程 目录,并对某些修改进行了一些修改 book_ideas.md. file.

笔记 :第6章“Git Log& History,” will take an in-depth look at the various facets of git log, and it will show you how to use the various options of git log to get some really interesting information about the activity on your repository.

现在,您对如何逐步更改并将其提交给您的存储库,这是对本章挑战的时间!

挑战:添加一些教程思想

你有一个伟大的目录来存储教程的想法,所以现在是时候添加那些伟大的想法了。您在这一挑战中的任务是:

  1. 创建一个名为的新文件 tutorial_ideas.md. 在 - 的里面 教程 directory.
  2. Add a heading to the file: # Tutorial Ideas.
  3. Populate the file with a few ideas, following the format of the other files, for example, [ ] Mastering PalmOS.
  4. 保存更改。
  5. 将这些更改添加到暂存区域。
  6. 用适当的消息提交这些阶段更改。

如果您陷入困境,您可以随时在本章为本书下载的材料内的项目/挑战文件夹下找到解决此挑战的解决方案。

同样,如果你想在这一点比较你的回购或目录的状态,你也会找到我的 思想 在同一文件夹中填充目录。

关键点

  • A 犯罪 基本上是在时间点处存储库中的文件集的特定状态的快照。
  • 工作树 是您直接工作的项目文件的集合。
  • git status 向您展示工作树的当前状态。
  • Git在三个不同状态下考虑工作树中的文件:未修改,修改和上演。
  • git add <filename> 允许您将工作树的更改添加到暂存区域。
  • git add . 在当前目录及其子目录中添加所有更改。
  • git add <directoryname>/\* 允许您在指定目录中添加所有更改。
  • git diff 向您展示工作树和暂存区域之间的区别。
  • git diff --staged 显示您的临时区域和存储库的最后一个提交之间的区别。
  • git commit 提交暂存区域中的所有更改,并打开Vim,以便添加提交消息。
  • git commit -m "<your message here>" 提交您的分阶段更改,并包含一条消息,而无需通过Vim。
  • git log 向您展示存储库的基本提交历史记录。
  • git log -p 显示存储库的提交历史记录与相应的Diff。

然后去哪儿?

Now that you’ve learned how to build up commits in Git, head on to the next chapter where you’ll learn more about the art of staging your changes, including how Git understands the moving and deleting of files, how to undo staged changes that you didn’t actually mean to make, and your next new commands: git reset, git mv and git rm.

有一个技术问题?想报告一个错误吗? 您可以向官方书籍论坛中的书籍作者提出问题和报告错误 这里 .

有反馈分享在线阅读体验吗? 如果您有关于UI,UX,突出显示或我们在线阅读器的其他功能的反馈,您可以将其发送到设计团队,其中表格如下所示:

© 2021 Razeware LLC